自學篇--使用keil5.23建立一個stm32工程並編譯(韌體包自帶版本)
之前在本科學習階段學習過一點51微控制器的知識,可是因為基本沒有實踐過幾次現在已經完全忘記了。。前幾天老師突然丟給我幾個板子說讓我把程式編譯、燒寫環境裝好,當時我就震驚了,不過經過三四天的自我摸索,之後參考他人的學習經驗,現在已經基本能處理這個問題了,所以為了方便後面的學者,主要也是為了把自己這幾天的學習成果記錄一下,我在這裡把這個過程寫下來。(因為剛剛接觸,很多原理性的東西都還不懂,只是一個操作步驟。所以哪裡不對,還希望大神指正!)
這篇文章主要講的內容是:使用keil5.23軟體建立一個工程框架,並利用stm32官方韌體包裡的example填充工程,最後成功編譯。
(下篇文章記錄了我的程式燒寫過程,如有需要可以翻閱)
首先宣告,我用的軟體是keil5.23,用的板子是stm32l152c-disco,MCU型號stm32l152rct6。當然這一步並沒有用到板子,不過還是得說一下,因為中間要選擇相關的庫函式等。
第一步:工程資料夾系統的建立
首先,建立一個資料夾,按你自己的工程取名。然後我們所有的工程檔案都放在這個資料夾中。為了方便我就按日期建立的資料夾,然後我又在資料夾中建立了另外幾個子資料夾,分別是:CORE,USER,OBJ,STM32L15x_FWLib,HARDCORE,SYSTEM。
- (此處參考之前別人的學習經驗——每個資料夾用途):
- CORE存放核心檔案和啟動檔案;
- OBJ用來存放編譯過程檔案以及生成的HEX檔案;
- STM32L15x_FWLib用來存放官方韌體庫原始碼檔案;
- USER存放工程檔案,主函式等等;
- SYSTEM用來存放每個實驗都用的共用程式碼;
- HARDCORE存放提供外部硬體相關的驅動函式。
第二步:韌體包檔案的搬運
然後去官方網站下載對應的韌體包,下載韌體包可以參考另外一篇文章,這裡不詳細介紹。
開啟韌體包,開始最麻煩的一項工作,將韌體包中的檔案複製貼上到我們剛才建立的資料夾中(這裡有一點說明,因為版本和獲得韌體包的方式不同,所以如果在我的路徑沒有找到相關檔案,可以嘗試在整個韌體包下搜尋)。
首先,是STM32L15x_FWLib資料夾。開啟韌體包,定位到en.stsw-stm32077/STM32L1xx_StdPeriph_Lib_V1.3.1/Libraries/STM32L1xx_StdPeripg_Driver資料夾下,將inc資料夾和src資料夾複製貼上到我們的STM32L15x_FWLib資料夾下。
之後是CORE資料夾內容的複製。定位到en.stsw-stm32077/STM32L1xx_StdPeriph_Lib_V1.3.1/Libraries/CMSIS/Include資料夾下,將其中的core_cm3.c和core_cm3.h複製到CORE資料夾下。(其實這裡沒有.c檔案,我也不知道為什麼,可能是版本問題吧,所以我的.c檔案是從別人的工程中複製過來的,如果你下載的韌體包也沒有可以試著去複製)
緊接著定位到en.stsw-stm32077/STM32L1xx_StdPeriph_Lib_V1.3.1/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/arm資料夾下,將startup_stm32l1xx_hd.s複製到CORE資料夾下。另外在韌體包中搜索出core_cmFunc.h以及core_cmInstr.h並複製到CORE資料夾下。
後面是USER資料夾內容的新增,定位到目錄:en.stsw-stm32077/STM32L1xx_StdPeriph_Lib_V1.3.1/Libraries/CMSIS/Device/ST/STM32L1xx,將stm32l1xx.h,system_stm32l1xx.h以及system_stm32l1xx.c檔案複製到USER下。(再次強調,特定路徑沒有的就去韌體包搜尋下)
定位到目錄:en.stsw-stm32077/STM32L1xx_StdPeriph_Lib_V1.3.1/Project/STM32L1xx_StdPeriph_Templates,將mian.c,stm32l1xx_conf.h,stm32l1xx_it.c,stm32l1xx_it.h複製到USER下。
(注:USER中的其他檔案都是在建立工程的時候產生的,不用擔心!)
關於SYSTEM和HARDCORE資料夾的內容,有的文章講到有的沒有講到,所以我將其擱置了,實驗表明暫時沒有對編譯造成影響。
到此為止,檔案內容就已經填充完畢,我們可以開始使用軟體建立工程了!!
第三步:工程建立
開啟keil軟體,點選project->new uversion project...
定位到USER資料夾下
檔名根據你自己的工程起,我的是Template.(上圖是已經建立好的工程,第一次建立的應該是空的資料夾顯示)
下面根據自己MCU型號選擇
之後這個可以直接cancel掉
到現在,框架基本已經搭好了,然後我們把之前搬來的材料在工程內部填好。
第四步:將材料填入工程
右鍵單擊Target1->manage project items。出現如下圖示
在group中新增資料夾
然後是往group中新增檔案,通過“Add Files”來執行:
USER目錄下新增:mian.c,stm32l1xx_it.c,system_stm32l1xx.c;
CORE目錄下新增:core_cm3.c,startup_stm32l1xx_hd.s(注意這裡要選擇新增資料夾格式才能看到);
FWLIB目錄下新增:STM32L15x_FWLib/src檔案下向下面的所有.c檔案。
SYSTEM和HARDCORE都是先擱置,後面用到再新增。
第五步:編譯工程
點選魔術棒->選擇output->select folder選擇我們剛才建立的OBJ為輸出路徑,這樣輸出的HEX檔案就會儲存到OBJ目錄下->勾上下面三個對號,這樣能生成HEX檔案。
下面點進C/C++->新增路徑(將剛才放有.h檔案的路徑都新增進來,需要注意,keil只會在一級目錄查詢標頭檔案,就是說資料夾下面子資料夾裡面的標頭檔案不會搜尋到),如圖所示是我們演示工程所需要新增的標頭檔案路徑。
點選OK->OK。此時我們可以編譯下程式
可以看到出了很多錯誤:error directive: "Please select first the target STM32L1xx device used in your application (instm32l1xx.h file)"
這是因為我們沒有設定目標裝置,再次點進魔術棒,將裝置新增進去(圈起來的部分),並將巨集定義好(USE_STDPERIPH_DRIVER),就可以了。如圖所示:
重新編譯,就成功了。