本文使用的固件庫是STM32F10x_StdPeriph_Lib_V3.5.0,能夠在官網獲取。該固件庫包含四個文件夾和一個庫的說明文檔,以下圖所示,stm32f10x_stdperiph_lib_um這個英文的幫助文檔很是有用,能夠很方便地瞭解某個庫函數的使用方法。函數
Project文件夾是一些寫好的官方例程,便於學習和開發。學習
Libraries文件夾下包含了固件庫的源代碼和啓動文件,是固件庫的核心所在。若是想要本身建庫,就必須包含該文件下大部分源代碼。Libraries下包含了CMSIS和STM32F10x_StdPeriph_Driver這兩個子文件夾,前者是內核相關文件,後者是各類外設的驅動文件。spa
CMSIS的組織結構以下圖所示,包含了CoreSupport和DeviceSupport。其中CoreSpport下是core_cm3的源文件和頭文件,與內核寄存器映射相關,通常不須要用戶瞭解和更改。3d
DeviceSupport下包含了三個重要的文件,以下圖所示。stm32f10x.h實現了片上外設寄存器的映射,例如GPIO寄存器、NVIC中斷寄存器等等。此外,它還include了一些重要頭文件,例如stdint.h——定義了各類數據類型、core_cm3.h、stm32f10x_conf.h——外設頭文件的管家,include了大部分外設驅動頭文件、system_stm32f10x.h等。因此,通常在用戶文件main.c裏只要include stm32f10x.h就能夠實現大部分頭文件的包含。code
system_stm32f10x的源文件和頭文件實現了STM32上電時的RCC時鐘配置。blog
DeviceSupport下的startup就是啓動文件了,根據設備類型,啓動文件有不少種,以下圖所示,其中基本型芯片的啓動文件有startup_stm32f10x_ld.s、startup_stm32f10x_md.s、startup_stm32f10x_hd.s、startup_stm32f10x_xd.s,分別匹配16~32k、64~128k、256~512k、512~1024k的Flash容量。以STM32F103C8爲例,其FLASH容量爲64k,所以啓動文件選擇startup_stm32f10x_md.s。ip
回頭看STM32F10x_StdPeriph_Driver,其下的內容就純粹不少了,只包含inc和src文件夾,分別是外設頭文件和源文件的集合。開發
因爲固件庫默認使用的設備型號跟咱們本身的芯片會有差別,這時候就須要本身來新建工程模板。首先,新建文件結構以下圖所示,Doc存放工程代碼的說明文檔,Libraries跟官方和固件庫相同,Project存放工程文件,User存放用戶修改建立的代碼文件。文檔
先從官方固件庫中拷貝Libraries,而後還須要從官方固件庫的例程中拷貝三個文件:stm32f10x_conf.h、stm32f10_it.c、stm32f10_it.h。這三個文件所在位置以下左圖所示,拷貝到User文件夾下後如右圖所示。it
接下來,打開keil5軟件,新建工程,選擇設備,這裏以STM32F103C8爲例,以下圖所示:
添加工程文件夾,效果以下:
分別爲各文件夾添加源代碼文件,只要添加.c和啓動文件便可,結果以下:
最後,咱們還缺最重要的main.c文件,能夠本身建立一個,而且添加到工程目錄中的USER下,main.c內容以下:
#include "stm32f10x.h" int main() { while(1); }
Output選項卡,將輸出文件定位到工程目錄的Output文件夾下(若是不存在,能夠新建一個),而且勾選HEX選項,以下圖所示:
C/C++選項卡下,選擇頭文件包含路徑(將文件夾中含頭文件代碼的目錄都添加進來),添加兩個宏定義(不然須要在代碼中更改添加),結果以下:
Linker選項卡下配置實際使用的仿真器,這裏我使用的是ST-Link。
到此爲止,進行編譯,若是沒有錯誤和警告,則大功告成。