1. 程式人生 > >自學篇--使用keil5.23建立一個stm32工程並編譯(韌體包自帶版本)

自學篇--使用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),就可以了。如圖所示:


重新編譯,就成功了。