本文使用的固件库是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。
到此为止,进行编译,若是没有错误和警告,则大功告成。