文章包含STM32固件库介绍和工程模板搭建两方面内容。
一、STM32固件库介绍
要建立工程模板,首先要对STM32的固件库有所了解。STM32的固件可以从ST官网下载,网址为:http://www.stmicroelectronics.com.cn/web/cn/catalog/tools/FM147/CL1794/SC961/SS1743,下载后的文件夹组织结构如图1所示。
图1 STM32固件库文件夹
为了更清楚的了解这个文件夹,我们把Libraries文件夹展开来看,如图2的所示。其中CMSIS文件夹提供了对STM32F10x系列芯片的Cortex M3的支持。Documentation下有个CMSIS_Core.htm文件,描述了Cotex Microcontroller Software Interface Standard(CMSIS)。CM3文件夹下的两个文件夹,在CoreSupport中的是位于CMSIS标准的核内设备函数层的M3核通用的源文件core_cm3.c和头文件core_cm3.h,它们的作用是为那些采用Cortex-M3核设计SOC的芯片商设计的芯片外设提供一个进入M3内核的接口,这两个文件在其它公司的M3系列芯片也是相同的。另外一个文件夹包括了为STM32F10x系列MCU写的设备外设访问层DPAL头文件stm32f10x.h以及设备外设访问层系统DPALS头文件system_stm32fx.h。
图2 Libraries文件夹
(1)stm32f10x.h
stm32f10x.h包括了STM32F10x系列处理器所有的外设寄存器定义、位定义和不同容量STM32F10x的内存映射。这里强调一点,如果选用外设库来编程,必须在编译器的PreProcessor Symbols的Define中写入STM32F10X_HD,USE_STDPERIPH_DRIVER,原因是在stm32f10x.h中有两条判断语句,如果不定义就会报错。
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
#error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"
#endif
STM32F10X_HD
#if !defined USE_STDPERIPH_DRIVER
/**
* @brief Comment the line below if you will not use the peripherals drivers.
In this case, these drivers will not be included and the application code will
be based on direct access to peripherals registers
*/
/*#define USE_STDPERIPH_DRIVER*/
#endif
USE_STDPERIPH_DRIVER
(2)system_stm32f10x
system_stm32f10x.c,是由ST公司提供的,遵守CMSIS标准。该文件的功能是设置系统时钟和总线时钟。system_stm32f10x.c在实现系统时钟的时候要用到PLL(锁相环),这就需要操作寄存器,寄存器都是以存储器映射的方式来访问的,所以该文件中包含了stm32f10x.h 这个头文件。
(3)startup文件夹
startup文件夹根据不同编译环境编写了启动的汇编代码,这些汇编文件根据不同内存容量的芯片来区分,根据自己芯片选择对应的启动文件。文件名的英文缩写的意义如下:
cl:互联型产品,stm32f105/107系列
vl:超值型产品,stm32f100系列
xl:超高密度(容量)产品,stm32f101/103系列
ld:低密度产品,FLASH小于64K
md:中等密度产品,FLASH=64 or 128
hd:高密度产品,FLASH大于128
(4)STM32F10x_StdPeriph_Driver文件夹
Libraries\STM32F10x_StdPeriph_Driver文件夹下有inc(include的缩写)跟src(source的简写)这两个文件夹,这都属于CMSIS的设备外设函数部分。src里面是每个设备外设的驱动程序,这些外设是芯片制造商在Cortex-M3核外加进去的。
为了更好的理解STM32F10xxx标准外设库各个文件间的联系,我们绘出它的体系结构,如图3所示。图中很好的展示了各层以及具体文件之间的联系,各文件的具体功能说明如表2所示。
图3 STM32F10xxx标准外设库体系结构
表1 文件功能说明
从stm32f10x.h顺藤摸瓜,深刻理解结构图即可顺利的完成模版搭建。stm32f10x.h定义了芯片的类型及外设,并且在478、479、8297行包含另外三个头文件"core_cm3.h" 、 "system_stm32f10x.h" 和"stm32f10x_conf.h"。"stm32f10x_conf.h"是个起到开关作用的头文件,只需要用“//”注释掉不需要的外设头文件即可。stm32f10x_it是独立在库文件之外的,是STM32的中断函数。
二、STM32工程模板搭建
(1)新建文件夹
新建文件夹Template,在该文件夹下面建立四个文件夹,入下图4所示。
图4 新建文件夹
(2)复制库文件
将第一节介绍的固件库相关文件复制到下图所示文件夹中
图5 文件夹内容
(3)建立工程
新建工程的方法不再详述,关键讲解文件添加部分。如图6,右击Target1,单击Manage Componets。修改工程名为Temp,Groups中新建Project,CORE,FWLIB三个文件夹,各个文件夹添加文件如图7~9所示。
图6 管理组件 图7 Project中添加文件
图8 CORE中添加文件 图9 FWLIB中添加文件
(4)修改Main函数如下
#include "stm32f10x.h"
int main(void)
{
while()
{
;
}
}
main
(5)Target Options编辑
单击魔法棒,选择Output,在Select Folder for Objects中选择第一步中建立的OBJ文件夹,图10。
图10 选择Objects文件夹
点击C/C++,在Define中输入STM32F10X_HD,USE_STDPERIPH_DRIVER,如图11。
图11 宏定义
将图12上面的3个目录添加进去。keil只会在一级目录查找,path一定要定位到最后一级子目录。
图12 添加头文件地址
(6)编译显示成功,工程模板建立完成,图13。
图13 编译通过