目錄
一、工程文件介紹
1.自動生成的文件
2.自建文件
(1)USER 文件夾
(2)FWLIB 文件夾
(3)CMSIS 文件夾
二、工程創建教程
1.下載固件庫
2.創建工程
(1)創建不完善的工程
(2)移植文件
(3)配置工程
一、工程文件介紹
????????如下圖所示是一個 STM32 的 keil 5 工程文件,其中包含了其他 keil 5 工程文件基本都包含的文件,其他工程可能還有其他文件,但并非基本文件。部分文件夾是用戶自定義的,名稱可能不完全一致,但內容文件應當是類似的。接下來將一一介紹其中的文件。
1.自動生成的文件
? ? ? ? 如上圖所示,除了文件夾?CMSIS、FWLIB、USER?外,其他文件均為創建工程和編譯后產生的。
- 最下面綠色標的?.uvprojx?文件是工程的本體,雙擊該文件即可打開 keil 5 并進入工程。
- 倒數第二個.uvoptx文件是工程的選項配置文件,它存儲了針對該工程的所有軟件配置,包括編譯器的優化等級和警告級別、匯編器和鏈接器的設置、頭文件包含路徑、預處理宏定義、Flash 下載算法的選擇等,即Options for Target設置頁面中的內容。若刪除此文件,再次打開工程時,Keil 會重新生成一個使用所有默認設置的新的.uvoptx文件。
- 順數第二個 DebugConfig 文件夾中有一個 DBGCONF 文件,它保存的是Options for Target設置頁面的Debug調試設置,在較新版本的 Keil MDK 中會自動生成這個文件,其將調試相關的設置從傳統的上面講的?.uvoptx 文件中分離出來獨立管理。若刪除此文件,再次打開工程時,Keil會重新生成一個使用默認 Debug 設置的 DebugConfig 文件夾和DBGCONF 文件。
- 倒數第三個 .uvguix 文件是工程的用戶界面配置文件,保存了用戶的個性化 IDE 設置,如窗口的布局和位置、工具欄的顯示和隱藏、代碼編輯器的字體和顏色主題、項目瀏覽器等視圖的狀態以及其他所有個性化設置。若刪除此文件,再次打開工程時,Keil 會重新生成一個使用默認界面配置的新文件,工程代碼和編譯設置完全不受影響,只是個人界面布局需要重新設置。
- 工程中自動生成的 Listings 文件夾和 Objects 文件夾分別和 Options for Target 設置頁面中的 Output 和 Listing 設置有關,可以安全刪除,暫不做詳細介紹。
2.自建文件
? ? ? ? 這里要介紹的是USER、FWLIB、CMSIS三個文件夾。
(1)USER 文件夾
????????USER?文件夾是自己創建的文件,可以用來存放用戶代碼,例如 main.c,以及其他自建源文件、頭文件,像如果要設計一個電機控制模塊 motor_control.c/.h,可以存放在這里。當然了,這取決于個人習慣,可以根據習慣創建其他文件夾用于存放編寫完成的應用程序。
(2)FWLIB 文件夾
????????FWLIB?文件夾是自己創建的文件,表示Firmware Library(固件庫),可以用來存放外設標準庫,并使用 inc 子文件夾和 src 子文件夾將頭文件和源文件分開,文件夾內容如下圖所示:????????
????????上述文件中的 stm32f10x_ppp.c/.h 是對應外設的庫文件,有了這些庫文件就可以使用對應外設的標準庫函數了。其中另有 misc.c/.h 文件,這里面定義了NVIC的相關配置函數(如 NVIC_Init() 等)以及一個配置 SysTick 的時鐘源的函數。若要使用標準庫開發STM32,這些文件是必不可少的,若使用直接操作寄存器的方式開發STM32,這些文件是不需要的。
(3)CMSIS 文件夾
????????接下來介紹自建的 CMSIS 文件夾中的內容。文件夾內容如圖所示:
? ? ? ? 首先是 core_cm3.c/.h 文件,它們是ARM公司提供的 CMSIS 核心文件,它們為所有基于Cortex-M3內核的芯片提供了一套統一的、標準化的軟件接口,用于訪問和控制內核本身的核心功能,如中斷控制器(NVIC)、系統定時器(SysTick)、特殊指令以及CPU寄存器,從而實現了對處理器底層硬件的抽象,為不同廠商的芯片庫和應用程序(如RTOS)提供了可移植的基礎。
? ? ? ? 然后是 startup_stm32f10x_hd.s 文件,這是一個使用匯編語言編寫的啟動文件,STM32 上電或者復位后首先執行這個文件,負責進行最底層的硬件初始化,包括初始化堆棧指針、初始化中斷向量表、執行復位處理程序(Reset_Handler())和跳轉到 main 函數。
? ? ? ? 接著是 stm32f10x.h?文件,其在標準外設庫開發中扮演著基石和總樞紐的角色,其作用主要有芯片型號選擇與配置、定義外設寄存器結構體和內存映射、定義外設寄存器位定義等等。
? ? ? ? 下面是?stm32f10x_conf.h?文件,這個文件中,前半部分是標準外設庫頭文件的包含,后半部分是斷言相關的宏定義。如果不適用標準外設庫開發,這個文件是不需要的。
? ? ? ? 再后面到 stm32f10x_it.c/.h 文件,這個文件中包含了一些異常的中斷處理函數模板,但都是空函數,實際上我們可以在其他地方定義中斷服務函數,所以這個文件不是必要的。但可以保留,以集中管理中斷服務程序,取決于個人。
? ? ? ? 最后是?system_stm32f10x.c/.h?文件,這個文件中有大量的和時鐘配置有關的函數定義,是非常重要的一個文件,即使是使用直接操作寄存器的方式開發STM32也建議保留,當然也可以自己自定義初始化時鐘代碼。
二、工程創建教程
1.下載固件庫
? ? ? ? 首先,搜索“ST官網”,進入中國大陸地區官網:
? ? ? ? 進入官網后,依次選擇“工具與軟件”、“嵌入式軟件”、“STM32嵌入式軟件”。如下圖所示:
? ? ? ? 接著,在網頁左側選擇“STM32標準外設軟件庫”,并選擇需要的芯片系列,我將以STM32F103RCT6為例,選擇“F1”。如下圖所示:
? ? ? ? 至此,就可以選擇版本下載固件庫了。下載需要登陸,沒有注冊過的可以注冊一個,不難。下載界面如下圖:
? ? ? ? 得到的文件包打開后如下圖所示,其中主要需要第二個?Libraries?文件夾中的文件。第一個_htmresc文件夾是一些官方圖標,不重要。第三個 Project 文件夾包含各個外設的使用示例和空的工程模板,有耐心的話可以做參考用。第四個Utilities文件夾是ST評估板的相關示例和驅動,如果有用ST官方指定的開發板的話可以使用。最下面的stm32f10x_stdperiph_lib_um文件是一個已編譯的HTML幫助文件,是標準外設庫的官方離線文檔,用于查詢所有庫函數的詳細用法、參數和示例代碼,可以做學習使用。
2.創建工程
? ? ? ? 記住如下步驟,即可自己手動創建基于標準庫開發的STM32 keil工程,而不用再跟著教學視頻做。現在以STM32F103RCT6為例創建工程。
? ? ? ? 首先,記住下面這些文件,這些是建議工程要包含的文件:
- ① stm32f10x.h
- ② stm32f10x_conf.h
- ③ system_stm32f10x.c/.h
- ④ stm32f10x_it.c/.h
- ⑤ core_cm3.c/.h
- ⑥ startup_stm32f10x_hd.s
- ⑦ 外設標準庫文件
? ? ? ? 現在,創建工程分成三大步,一是使用 keil 5 生成一個不完善的工程,二是添加上述文件,三是做簡要配置。
(1)創建不完善的工程
? ? ? ? 第一小步,創建一個工程文件夾,可以在桌面等處創建,如下圖所示:
? ? ? ? 第二小步,在這個文件夾中創建三個文件夾(CMSIS、FWLIB、USER),認為麻煩也可以只創建兩個文件夾(FWLIB、USER),然后把上述①~⑦的文件全塞 FWLIB 里。怎么做完全取決于個人。如下圖所示:
? ? ? ? 第三小步,打開keil 5 MDK,選擇 “Project”、“New μVision Project”。然后選擇進入剛剛創建的工程文件夾內。
? ? ? ? 第四小步,在彈出的芯片選擇界面選擇對應的芯片系列,我這里選擇“STM32F103RC”。如果沒有下載芯片支持包的可以點這里的 “Pack Installer” 進行下載。選擇完芯片直接關掉彈出來的“Manage Run-Time Environment” 界面,這個界面若感興趣的可以自己去了解下。
(2)移植文件
? ? ? ? 打開從ST官網下載的外設固件庫,打開Libraries文件夾。得到如圖所示頁面:
? ? ? ? 第二個文件夾 STM32F10x_StdPeriph_Driver 里面的就是上面標的第七點“外設標準庫文件”了。打開,將里面的inc文件夾(裝著外設標準庫頭文件)和src文件夾(裝著外設標準庫源文件)直接復制粘貼到我們創建的FWLIB文件夾中。如果認為有哪些外設根本不用的話,也可以將其源文件和頭文件從中剔除。
? ? ? ? 然后打開固件包的CMSIS文件夾,可以在其中找到這幾個需要的文件:①、③、⑤、⑥,都比較好找,自己找一下也好更多的了解一下這個固件包的文件結構。要注意的是,其中⑥?startup_stm32f10x_hd.s 文件從STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup來到如下這個頁面:
這里分為不同編譯器需要使用的啟動文件,第一個是keil中的ARMCC/ARMClang編譯器,我們創建的是keil工程,需要選擇這里面的啟動文件。下面分別是GCC編譯器、IAR的ICCARM編譯器和某個編譯器對應所需的啟動文件。至于里面的啟動文件選擇什么,這個取決于芯片的FLASH容量,使用一款芯片時應當對自己這款芯片的FLASH容量大小有所了解,隨便一搜即有結果,這里先不多介紹。
? ? ? ? 剩余②?stm32f10x_conf.h、④?stm32f10x_it.c/.h 在這個文件夾里是沒有的,如果開發不是那么深的話,④是沒必要的其實,中斷處理程序放在哪里都行,這個文件主要是給了一些中斷處理程序模板。但我們還是都加入進去吧。
? ? ? ? ②和④可以在固件包中的工程模板中找到。如下圖所示:
? ? ? ? 將①②③④⑤⑥這些文件都放入我們創建的CMSIS文件夾中后,現在工程已經完整了,接下來只需要簡單配置一下工程即可。
(3)配置工程
? ? ? ? 點擊“Manage Project Items”圖標,如下圖所示:
? ? ? ? 在彈出的頁面中將自動生成的 Source Group 1 組雙擊改名為 CMSIS,并增加兩組 FWLIB 和 USER,對應我們自己創建的三個文件夾。然后選中某一組,在右側點擊 “Add Files”,將對應文件夾中的所有文件加入到組中。注意文件夾不能被加入,然后要將所有源文件、頭文件和啟動文件加入到組中。需要選擇文件類型,否則有的文件不顯示,如下圖所示:
? ? ? ? 然后點擊 “Options for Target”,選擇 “C/C++”頁面,加入頭文件包含路徑(點擊右側的三個點)。如下圖所示:
有頭文件的文件夾路徑都要包含,包括USER、CMSIS、FWLIB的inc文件夾這三個地方。如下圖所示:
? ? ? ? 然后,還是同樣的 “C/C++” 頁面,在上方的 “Define” 框中寫入 USE_STDPERIPH_DRIVER 和 STM32F10X_HD,使用英文逗號隔開,如下圖所示:
? ? ? ? 前者 USE_STDPERIPH_DRIVER 宏是使用標準外設庫必須要定義的,這在 stm32f10x.h 文件中有說明,如下圖所示:
????????當然了,也可以不在上面的預處理器定義框中去定義,可以在文件中定義,只是建議還是在預處理器中定義的好。
? ? ? ? 至于第二個宏 STM32F10X_HD,顯然這和芯片類型有關(HD和前面的FLASH容量大小有關,同樣在stm32f10x.h文件中顯示需要定義這個宏,如下圖所示,不定義這個宏編譯時將會報錯。不過,不在上面說的預處理器中預定義也不會報錯,這可能是在選擇了芯片之后在哪里會自動定義這個宏。所以不定義這個宏也沒問題。
? ? ? ? 至此,我們已經完成了工程的創建,可以自己編寫 main 文件和其他源文件、頭文件并放入 USER 組中來開發 STM32 了。
? ? ? ? 最后,建議有時間還是自己去鉆研一下上面談到的文件①~⑦,文件并不算太難看懂,看完會對 STM32 有更深的理解,這其實也是學習 STM32 的一個必要的過程。