前面幾篇文章瞭解 STM32CubeMX 如何透過 UI 介面產生 c 語言程式碼、如何使用暫存器控制 STM32 的 GPIO 點亮 LED,以及使用變數及結構來撰寫易讀的程式。從這篇開始要實做使用 SPL(Standard Peripheral Libraries)作為應用程式開發,開發時需先準備一個編譯的環境,將官方提供的標準外圍設備函數庫引用進來當作範本,在撰寫新的專案或程式時,可以套用這個範本。
以下檔案是在建立程式編譯範本時,會用到的重要檔案,說明如下表:
以下就來實做如何在 Keil v5 的開發環境下,使用 STM32F1x 官方標準函數庫來建立編譯環境的範本。
(1) 在檔案總管建立一個新的資料夾,可依個人喜好決定名稱,這裡就以 Template 為例。
(2) 在 Template 資料夾內建立三個子目錄,命名為 CMSIS 、Libraries 及 User。
(3) 在 ST 官網 下載 最新標準函數庫,目前最新的版本是 v3.6.0:
(4) 複製標準函數庫檔案到Template\CMSIS
上述目錄的 startup_stm32f10x_cl.s 檔案,表示為互聯型產品(Connectivity line devices),如 stm32f105/107系列,如檔名中有 _vl.s 表示是超值型產品(Value line devices),如 stm32f100 系列。
(5) 複製標準函數庫檔案到Template\Libraries
接著選擇開發版的型號:
按下 OK 後,出現以下視窗,可按X關閉視窗或按 OK 離開。
點選「Target」頁簽,勾選「Use MicroLIB」,並將 ARM 預設 Compiler 版本改成 Version 5。
點選「Output」頁簽,按下「Seclect Folder for Objects」選擇目錄為 User\Objects,並勾選「Create HEX File」。
點選「C/C++」頁簽,在「Define:」欄位輸入「USE_STDPERIPH_DRIVER,STM32F10X_MD」,並按下在「Include Paths」右邊的開啟目錄按鈕(如下圖紅框處):
出現如以下的空白視窗,需點選右方的增加路徑圖示,將 Template 目錄下的三個子目錄 CMSIS、Libraries\inc 及 User 的路徑加進來,如下圖:
如下圖中央的 Groups 增加三個 Group:User、CMSIS 及 Libraries 需要添加的 c 語言程式及 .s 啟動檔。
在 Libraries Group 按下「Add Files...」的按鍵開啟選擇檔案視窗,選擇 Libraries\src 內所有的檔案,可以按 Ctrl + A 來全選檔案,再按下「Add」,將所有 .c 檔案加進 Group 目錄內。
到這裡已經完成範本的製作,可對 main.c 進行編譯,如果出現編譯結果為「 0 Error(s), 0 Warning(s).」表示已經成功建立範本。
Photo by Vishnu Mohanan on Unsplash
以下檔案是在建立程式編譯範本時,會用到的重要檔案,說明如下表:
函式庫檔案名稱 | 說明 |
---|---|
startup_stm32f10x_md.s | 啟動文件 |
core_cm3.c core_cm3.h | 定義 Cortex-M3 CPU 一些相容各個開發環境的核心暫存器操作的函式。 core_cm3.h定義了相容各種編譯器的關於debug和NVIC的一些函式 |
stm32f10x.h | 定義了啟動設置,以及所有寄存器的廣域定義。 |
system_stm32f10x.c system_stm32f10x.h | 功能是設置系統和總線時鐘,最重要的函數是 SystemInit(), 在系統啓動時調用的,用來設置整個系統的時鐘。 |
stm32f10x_???.c stm32f10x_???.h | ???表示外設名稱,如 gpio、i2c、spi、rtc 等 |
stm32f10x_conf.h | 包含了stm2f10x 的外設的頭文件。 |
stm32f10x_it.c stm32f10x_it.h | Cortex-M3 工程中所有中斷的函數。 |
以下就來實做如何在 Keil v5 的開發環境下,使用 STM32F1x 官方標準函數庫來建立編譯環境的範本。
[複製 STM32F1xx 函數庫檔案到相關目錄]
建立程式開發環境,首先先建立幾個要放置官方函數庫的目錄,再將所需的檔案複製進來,然後設定 Keil 環境,就可開始撰寫程式進行編譯,編譯成功後產生執行檔,並下載到開發板安裝執行。(1) 在檔案總管建立一個新的資料夾,可依個人喜好決定名稱,這裡就以 Template 為例。
(2) 在 Template 資料夾內建立三個子目錄,命名為 CMSIS 、Libraries 及 User。
(3) 在 ST 官網 下載 最新標準函數庫,目前最新的版本是 v3.6.0:
(4) 複製標準函數庫檔案到Template\CMSIS
- 將 F103C8\STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3\CoreSupport 資料夾內的 core_cm3.c 及 core_cm3.h 兩個檔案,複製至 Template\CMSIS 目錄。
- 將 F103C8\STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3\DeviceSupport\ST\ STM32F10x\startup\arm 內的 startup_stm32f10x_md.s 檔,複製至 Template\CMSIS 目錄。
這裡的 .s 檔需要依據 MCU 的型號來決定,以我的開發板為例:STM32F103C8T6,配備 64K 的 FLASH,屬於中容量的微控制器,就選擇 startup_stm32f10x_md.s 這個檔案,如果型號與我的不同,可依照下表 Flash 的大小,判斷該使用哪個 startup 檔案。
Flash大小 | 容量 | 採用檔案 |
---|---|---|
小於 32K | 小容量 | startup_stm32f10x_ld.s |
介於 64K 至 128K | 中容量 | startup_stm32f10x_md.s |
介於 256K 至 512K | 大容量 | startup_stm32f10x_hd.s |
介於 512K 至 1024K | 超大容量 | startup_stm32f10x_xl.s |
- 將 STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x 內的stm32f10x.h、system_stm32f10x.c 及 system_stm32f10x.h 三個檔案,複製至 Template\CMSIS 目錄。
(5) 複製標準函數庫檔案到Template\Libraries
- 將 STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\STM32F10x_StdPeriph_Driver 下的兩個子目錄 src 及 inc ,複製到 Template\Library 資料夾內。
- 將 STM32F10x_StdPeriph_Lib_V3.6.0\Project\STM32F10x_StdPeriph_Template 目錄內的三個檔案(如下圖紅色框),複製到 Template\User 目錄內。
- 新增 main.c 到 Template\User 目錄內,開啟記事本或文字編輯器,輸入以下內容後存檔在 User 目錄,名為 main.c 。
/********************************************************** * 名稱:main.c * 日期:2022/3/17 * 描述: **********************************************************/ #include "stm32f10x.h" int main() { while (1) { } }註:在 Keil MDK5 的編譯環境,在程式的最後要多空一列,不然編譯會出現:「main.c(15): warning: #1-D: last line of file ends without a newline。」的 Warrning 警告。
[在 Keil 新增專案及路徑設定]
準備好標準函示庫後,接著新增一個專案,之後再進行路徑及新增檔案設定。開啟 Keil 主程式,功能表點選「Project」→「New uVision Project」,在稍早建立的 User 目錄下,建立一個名為 Program 的新專案,如下圖:接著選擇開發版的型號:
按下 OK 後,出現以下視窗,可按X關閉視窗或按 OK 離開。
[在 Keil 設定 Include 檔案路徑]
在左方樹狀目錄的 Target 按右鍵,出現選單視窗,選擇「Optios for Target...」或上方工具列的魔法棒(如下圖紅色框處),開啟選項設定視窗,如下圖:點選「Target」頁簽,勾選「Use MicroLIB」,並將 ARM 預設 Compiler 版本改成 Version 5。
點選「Output」頁簽,按下「Seclect Folder for Objects」選擇目錄為 User\Objects,並勾選「Create HEX File」。
點選「C/C++」頁簽,在「Define:」欄位輸入「USE_STDPERIPH_DRIVER,STM32F10X_MD」,並按下在「Include Paths」右邊的開啟目錄按鈕(如下圖紅框處):
出現如以下的空白視窗,需點選右方的增加路徑圖示,將 Template 目錄下的三個子目錄 CMSIS、Libraries\inc 及 User 的路徑加進來,如下圖:
[在 Group 中增加檔案]
在左方樹狀目錄的 Target 按右鍵,出現選單視窗,選擇「Manage Project Items...」或上方工具列的方塊圖示(如下圖紅色框處)。如下圖中央的 Groups 增加三個 Group:User、CMSIS 及 Libraries 需要添加的 c 語言程式及 .s 啟動檔。
在 Libraries Group 按下「Add Files...」的按鍵開啟選擇檔案視窗,選擇 Libraries\src 內所有的檔案,可以按 Ctrl + A 來全選檔案,再按下「Add」,將所有 .c 檔案加進 Group 目錄內。
到這裡已經完成範本的製作,可對 main.c 進行編譯,如果出現編譯結果為「 0 Error(s), 0 Warning(s).」表示已經成功建立範本。
想請問作者有沒有出現在 Group 中增加檔案無法加入header file 的問題?
回覆刪除張貼留言