使用keil建立標準STM32工程模版
1. 模板工程的創建(超級詳細版,使用的是keil 4.5版本)
1.1創建工程目錄
良好的工程結構能讓文件的管理更科學,讓開發更容易更方便,希望大家養成良好的習慣,使用具有合理結構的工程目錄,當你著手於較大的軟件項目時,類別分明,層次合理的工程目錄結構會讓你的開發管理化繁為簡。
(1)首先在一個目錄下創建主文件夾,名字按需求取,這裏取名為:(0)工程模板
(2)在該文件夾裏分別建立名字為Project和Source的文件夾。其中Project文件夾用來放置工程文件,而Source用來放置程序代碼文件。
↑
(3)在Project文件夾裏建立名字為Obj和List的文件夾,這是用來存放工程編譯文件的。
↑
(4)然後在Source文件夾中建立3個名字分別為Application,Drivers和STM32_FWLib的文件夾。Application是用來放置應用程序文件的,例如main.c,和一些應用配置文件,如stm32f10x_it.c,stm32f10x_conf.h。Drivers是用來放置驅動程序文件的,STM32_FWLib是用來放置ST固件庫文件的。
↑
(5)在Application中添加一個名為main的文件夾。如果有其他應用程序,比如一些純軟件算法之類的代碼文件可以放置在一個新文件夾中然後放在Application文件夾中,例如有一個Bmp圖像解碼的程序模塊bmp.c和bmp.h,那麽我們在Application中新建一個文件夾叫BMPDecoder,然後把bmp.c和bmp.h放在BMPDecoder文件夾中,以此類推。
↑
(6)在main文件夾中添加以下文件,
↑
(7)回到Source文件夾中,在Drivers文件夾下創建驅動文件目錄,根據工程需要添加驅動目錄,也可以預先添加驅動文件夾,留作以後用。
↑
(8)在Led_Drvier中添加Led的驅動文件,如果要使用到串口驅動和按鍵驅動,按照上述說明在對應的文件夾中添加對應的驅動文件。
↑
(9)回到Source文件夾下,在STM32_FWLib文件夾下添加ST固件庫,庫文件直接從官方固件庫下拷貝過來,在光盤資料中的
\軟件資料\STM32固件庫(3.0.0)\stm32f10x_stdperiph_lib_v3.0.0\Libraries\路徑下存放有
↑
(10)直接在STM32固件庫(3.0.0)中的CMSIS拷貝到STM32_FWLib下,這些庫文件是和CotexM3內核相關的固件,其中Starup下放置著STM32的啟動代碼。
↑
(11)然後從固件庫的STM32F10x_StdPeriph_Driver中的兩個文件夾inc和src到拷貝到
FWLib文件夾中。inc中是固件庫的頭文件,src是固件庫的c代碼文件
↑
完成上述步驟後,工程目錄就創建好了,下一步就是建立STM32的工程的方法。
1.2建立MDK平臺下的STM32工程
(1)雙擊進入keil4。
(2) 關閉當前打開的工程,方法是:點擊Project->CloseProject
(3)新建一個工程,點擊Project->NewuVision Project
(4)選擇工程保存的路徑
(5)填寫工程名字,最好填寫英文名字,不要含有中文,命名為Red Leaves STM32Demo
(6)選擇MCU類型,我們的開發板是STM32F103ZET6,那麽我們選擇的類型則為STM32F103ZE
(7)我們選擇不從keil的安裝目錄下復制啟動代碼文件到工程中,過後我們自己手動添加,我們使用來自工程目錄的固件中的啟動代碼,文件在下面的路徑中
(0)工程模板\Source\STM32_FWLib\CMSIS\startup\startup_stm32f10x_hd.s
(8)點擊Manage Components在工程中創建文件目錄,選擇否!
(9)修改Project Target的名字為Red Leaves(名字是可以根據自己需要命名的),新建4個分組,分別命名為Starup,Application,Drviers,FWLib。註意一點,這裏新建4個組後,根據代碼文件功能的不同而添加在對應的組下,但這些組僅僅起到一個分類作用而已,就是讓人看得覺得一目了然,並沒有起到路徑的作用。如果你喜歡,你也可以不建立分組,把所有文件都丟在一起,一堆一堆的,但是這樣相信大家自己看得都煩,尤其是工程比較大,上百個,甚至上千個文件的時候,不分類放,你想要編輯的文件自己都找不到,更別說別人了。分類放置是一種必須養成的良好習慣,分組如何分呢,最好和我們之前創建的代碼工程目錄一致,也可以根據需要稍作調整。
(10)在Starup裏添加starup_stm32f10x_hd.s,該啟動代碼文件在路徑
(0)工程模板\Source\STM32_FWLib\CMSIS\startup\starup_stm32f10x_hd.s
(11)在Applicaiton裏添加文件,這裏要提一點,keil只需要編譯c文件,只需要添加c文件進來即可,而添加h進來對keil來說是沒有必要的,其他的編譯器也是如此。但是筆者比較喜歡把h文件也添加進來,這樣方便查找和編輯,處於這個目的,就把h文件也添加進來了。
步驟和(10)一樣,文件相信大家都知道,在(0)工程模板\Source\Application\main中。
(12)給Drivers這一組添加文件,把工程用到的驅動都添加進來
(13)給FWLib添加文件,添加的是ST固件文件,你的程序裏用到STM32的什麽資源就添加什麽固件驅動文件進去,但是不管你使用了什麽資源,core_cm3.c,system_stm32f10x.c,misc.c,stm32f10x_rcc.c這幾個文件是必須要有的,算是STM32正常運行的基本固件。添加完畢後點擊OK退出。
(14)我們在使用一些文件模塊的時候,往往需要在程序文件頂部先include進來
比如#include "stm32f10x.h",#include "Led_Driver.h",才能使用程序模塊的功能函數,但是編譯器怎麽知道這些頭文件在哪裏呢,要知道,這些頭文件是放在不同目錄下的,這就要求我們設置一些路徑變量了,讓編譯器在這些路徑下查找h文件,程序才能順利編譯。
點擊,在C/C++裏的Include Paths中把路徑給填寫上,也就是把你的程序工程中有h文件的目錄路徑名填寫在其中,所有路徑都以所在的路徑為參考路徑。比如說main.h,它在\Source\Application\main這一路徑下,而Project文件夾和Source文件夾處於同級目錄,Red Leaves STM32 Demo.uvproj這個文件在Project文件夾中,那麽以Red Leaves STM32 Demo.uvproj為參照點,main.h填寫在Include Paths中的路徑名就是 .. \Source\Application\main,其中“..”代表上級目錄。所以main.h處在Red Leaves STM32 Demo.uvproj的上級目錄Source下的Application目錄下的main目錄中,有點拗口吧。
(15)我們在寫程序的過程中有時候會用到標準庫中的庫函數,比如我們常用的printf()就是在stdio庫中的,我們要向在程序中正常使用庫,那麽就必須把使用庫這一選項勾選上。
補充3點,使用3.5版本的STM32固件庫還需要把固件庫的宏添加到工程選項中
選擇Obj和List文件存放的路徑,定位到第(3)步中的obj和list文件夾
(16)說了這麽多,我們現在可以來編譯一下新建好的模板程序了,點擊編譯,完全ok。最後筆者再啰嗦一回,如果你添加了新的程序模塊或者固件庫,那麽必須記住3點,一是在工程中添加c文件。第二點,在Target Options中填寫Include Paths。第三點,在使用程序模塊的地方上記得#include“xxx.h”。下面以ST固件添加做圖例。
2. 模板工程的使用
我們做這樣一個模板的目的就是可以更方便大家的開發,按照一定的步驟,我們就可以迅速的建立自己的工程並如搭積木似的擴展功能,這樣可以省時省力。下面我們以添加串口功能為例說明如何在模板的基礎上做功能的擴展。
(1)在Source\Drviers目錄下新增加Usart_Drvier文件夾(如果有就不用新建啦),並把Usart_Drvier.c和Usart_Drvier.h放在Usart_Drvier文件夾中。
(2)把Usart_Drvier.c添加到工程中的Drivers組下,然後把stm32f10x_usart.c添加到FWLib組下
(3)在TargetOptions的C/C++的Include Paths下把Usart_Driver.h的路徑填寫上。
(4)由於串口使用到了固件庫中的stm32f10x_usart.c的資源,所以要在stm32f10x_conf.h
中把stm32f10x_usart.h包含進來。
(5)由於Usart_Drvier.c要使用到庫中的函數printf()等等,所以要勾選上Use MicroLib的選項。
(6)然後在main.h中添加#include“Usart_Driver.h”。這樣在main.c中就能使用Usart_Driver.c的功能函數了。
總結
對於初學者來說,剛開始建立有一定結構的工程目錄覺得會有些繁瑣,但是一但熟悉後,養成習慣後就不會覺得有什麽了,萬事開頭難嘛。
本文模版工程到http://download.csdn.net/detail/zsy2020314/5744187免費下載
使用keil建立標準STM32工程模版