爱捣鼓网 http://www.aidaogu.com
爱捣鼓 STM32笔记 4
固件库那些事
作者:谭鹏超
爱捣鼓网
http://www.aidaogu.com
爱捣鼓网 http://www.aidaogu.com
- I -
版权和免责声明
本文版权归爱捣鼓网所有。爱捣鼓网允许对本文进行自由传播,但不得用于商业用
途。在对本文进行转载和发布时,必须注明“来源:爱捣鼓网 http:\\www.aidaogu.com”,
否则,请立即删除相关下载页面和链接。对使用本文中任何内容造成的损失,爱捣鼓网
和本文作者不承担任何责任。爱捣鼓网和本文作者对本文进行任何更改,不保证能及时
您。请到爱捣鼓网下载最新版本。
部分内容来源于网络资料,未见作者信息,不能一一列举对应资料作者的名称,非
常抱歉!非常感谢无私奉献的这些作者。本文来自网络,同样无私回馈网络。
由于本人水平有限,如果本文有错误、遗漏、歧义或其他不合适的地方,请到爱捣
鼓网发帖指出。本人期待与各位志同道合的朋友共同分享、交流和学习。
爱捣鼓网 http://www.aidaogu.com
- II -
版本历史
版本 说明 作者 完成/修改日期
V1.0.0 正式发布 谭鹏超 2013-06-08
爱捣鼓网 http://www.aidaogu.com
- III -
目 录
0 概述.........................................................................................................................................1
1 CMSIS
概览.....................................................................................................................2
1.1 固件库真实的基准..................................................................................................... 2
1.2 CMSIS标准 V1.30架构............................................................................................. 3
1.3 CMSIS标准 V3.20架构............................................................................................. 5
1.4 CMSIS标准代码规范................................................................................................. 7
1.4.1 基本规范...........................................................................................................7
1.4.2 推荐规范...........................................................................................................8
1.4.3 数据类型及 IO类型限定符............................................................................ 8
1.4.4 CMSIS版本号...................................................................................................9
1.4.5 Cortex内核........................................................................................................9
1.4.6 工具链...............................................................................................................9
2 固件库架构和文件脉络.......................................................................................................11
2.1 固件库架构............................................................................................................... 11
2.2 固件库文件脉络....................................................................................................... 14
3 固件库文件总体说明...........................................................................................................15
3.1 核内外设访问层文件............................................................................................... 16
3.2 设备外设访问层隶属 CMSIS核心层的文件......................................................... 18
3.3 设备外设访问层设备函数文件............................................................................... 19
3.4 用户层固件库模板文件........................................................................................... 21
3.5 启动文件................................................................................................................... 22
4 固件库的使用说明...............................................................................................................25
爱捣鼓网 http://www.aidaogu.com
第 1 页 共 27 页
0 概述
在《爱捣鼓 STM32笔记 1创建 IAR-ARM工程模板》第 2章节
中已经描述了 STM32固件库 V3.5.0的文件夹中的内容,对该固件库
的文件结构有了一个宏观的认识。这些知识对于创建对应编译器的工
程模板而言,已经足够。在编写基于 STM32芯片第一个程序之前,
还需要了解固件库下面的一些事:
(1)固件库根源那件事:固件库不是凭空而来,其来源于 ARM公
司联合主要合作伙伴制定的 CMSIS(Cortex Microcontroller Software
Interface Standard的首字母缩写)标准。其在 CMSIS标准上进行构建
而成。
(2)固件库架构和文件脉络那件事:固件库是 ST公司在 CMSIS
标准上根据自己基于 Cortex-M3芯片的特点进行构建。其也具有自身
的文件结构。固件库文件很多,理清头绪,了解核心文件的内容,有
利于后续实际工程的开发。
(3)进一步了解固件库文件那件事:对于固件库文件,重点掌握如
何使用,了解其基本内容即可。
(4)使用固件库那件事:熟练使用固件库这件事不是一天两天的搞
清楚的,也不需要一天两天搞清楚。不过,可以大概了解一下使用固
件库的共性要点,剩下个性化的东东,需要在后续的实际工程实践中,
不断的修炼完善。
爱捣鼓网 http://www.aidaogu.com
第 2 页 共 27 页
1 CMSIS标准概览
对于 CMSIS标准,我们没有必要深究。只需要了解 CMSIS标准
的基本概况就行。重点掌握其分层设计的软件工程思想,这个也可以
说是自顶至下分层设计很好的实例。该方法中重点和难点是层次的划
分和模块的分解。这是解决任何软件工程问题非常有效的方法。在后
续实际工程开发中,模仿采用这种思路开发嵌入式软件,向这个方向
逐渐靠拢,直至掌握这种软件工程构建分解方法。
1.1 固件库真实的基准
前面提到,STM32固件库V3.5.0版本是基于CMSIS标准构建的。
既然 STM32固件库经过不断的修正完善升级到了 V3.5.0版本,那么
CMSIS标准是否也在不断完善中呢?答案是肯定的。目前,从 ARM
公 司 官 方 网 站 下 载 CMSIS 标 准 文 件 压 缩 包 名 称 为 :
“CMSIS-SP-00300-r3p2-00rel1.zip”,其版本号为 V3.20,发布时间为
2013年 3月 18日(在 CMSIS-SP-00300-r3p2-00rel1.zip压缩包中的
README.txt文件中进行了说明)。然而,STM32固件库 V3.5.0内
“Release_Notes.html”文件中说明该固件库是在 2011年 4月 8日发
布的。由此可知:V3.5.0版本的 STM32固件库在 2011年 4月 8日之
前发布的 CMSIS标准上进行构建的。CMSIS标准 2008年就创建了
第一个版本,在这 3年中一定发生了版本的更新,CMSIS标准到底
是哪个版本呢?
在 STM32固件库 V3.5.0“\Libraries\CMSIS\Documentation\”内
爱捣鼓网 http://www.aidaogu.com
第 3 页 共 27 页
“CMSIS_Core.htm”文件中给出了 CMSIS标准的版本说明。通过该
文件可知:STM32固件库V3.5.0是在2009年10月30日发布的CMSIS
标准 V1.30版本基础上进行构建的。
可是,现在我也没有活动 V1.30版本的 CMSIS标准,不知道其
到底与最新版 V3.20有何区别。不过,这不是重点,重点是现在已经
找到了 STM32固件库 V3.5.0构建的真实基准:CMSIS标准 V1.30版
本。
1.2 CMSIS标准 V1.30架构
图 1.2-1 CMSIS标准早期版本结构(英文)
图 1.2-1 CMSIS标准早期版本结构(中文)
爱捣鼓网 http://www.aidaogu.com
第 4 页 共 27 页
在网上搜索 CMSIS标准,能找到一些关于 CMSIS标准的解说方
面的中文资料。其中最多的是按照图 1.2-1和图 1.2-2所示的 CMSIS
标准结构进行说明的。
由 于 没 有 获 得 V1.30 版 本 的 CMSIS 标 准 文 件 。 根 据
“stm32f10x_stdperiph_lib_um.chm”中图 1.2-3的所示 STM32固件库
结构可知:图 1.2-3和图 1.2-1中包含相同的核内外设访问层和设备外
设访问层。因此,可以推断 V1.30版本的 CMSIS标准结构应该是图
1.2-1和图 1.2-2所示的结构。
图 1.2-3 STM32固件库 V3.5.0结构
在图 1.2-1和图 1.2-2中 CMSIS层主要分为 3部分:
(1)核内外设访问层 CPAL(Core Peripheral Access Layer):由 ARM
公司负责实现。其包括对寄存器地址的定义,对核寄存器、NVIC(中
断向量)、调试子系统的访问接口定义以及对特殊用途寄存器的访问
接口(如 CONTROL和 xPSR)定义。由于对特殊寄存器的访问以内联
方式定义,所以 ARM公司针对不同的编译器统一用_INLINE来屏蔽
差异。该层定义的接口函数均是可重入的。
Administrator
下划线
爱捣鼓网 http://www.aidaogu.com
第 5 页 共 27 页
(2)中间件访问层 MWAL(Middleware Access Layer):由 ARM公
司负责实现,但芯片厂商需要针对所生产的设备特性对该层进行更
新。该层主要负责定义一些中间件访问的 API函数,例如为 TCP/IP
栈、SD/MMC、USB协议以及实时操作系统的访问与调试提供
标准软件接口。该层在 CMSIS标准中尚未实现。
(3)设备外设访问层 DPAL(Device Peripheral Access Layer):由芯
片厂商负责实现。该层的实现与 CPAL类似,负责对硬件寄存器地址
以及外设访问接口进行定义。该层可调用 CPAL层提供的接口函数,
同时根据设备特性对异常向量表进行扩展,以处理相应外设的中断请
求。
从图 1.2-3可知 STM32固件库未采用中间件访问层,使用了核内
外设访问层和设备外设访问层。
1.3 CMSIS标准 V3.20架构
图 1.3-1 CMSIS标准 V3.20结构
Administrator
下划线
Administrator
下划线
Administrator
下划线
Administrator
下划线
爱捣鼓网 http://www.aidaogu.com
第 6 页 共 27 页
CMSISI标准最新版本为 V3.20,其结构如图 1.3-1所示,从该图
中可以看出:已经没有中间件访问层。因此,对于 1.2章节描述的中
间件访问层,也没有必要挂念其什么时间推出了。
在图 1.3-1中,CMSIS标准 V3.20版本主要包含以下组件:
(1)CMSIS-CORE:提供与 Cortex-M0、Cortex-M3、Cortex-M4、
SC000 和 SC300 处理器与外围寄存器之间的接口。CMSIS-CORE
为整个系统定义了 API 并支持所有 Cortex-M 系列处理器(
Cortex-M0、Cortex-M3、Cortex-M4、SC000 和 SC300)。它提供了用
于访问特定处理器功能和内核外设的系统启动方法与函数。它包含用
于通过 CoreSight™ 调试单元进行打印式输出的帮助程序函数,并为
RTOS 内核识别定义了调试通道。每个外设都具有一致的结构,用于
跨符合 CMSIS 的设备一致地定义设备的外围寄存器和所有中断。
(2)CMSIS-DSP:包含以定点(分数 q7、q15、q31)和单精度浮
点(32 位)实现的 60 多种函数的 DSP 库。CMSIS-DSP 库包括向
量运算、矩阵计算、复杂运算、筛选函数、控制函数、PID 控制器、
傅里叶变换和很多其他常用的 DSP 算法。大多数算法都可以用于浮
点
和各种定点格式,并已针对 Cortex-M 系列处理器进行优化。
Cortex-M4 处理器实现采用 ARM DSP SIMD(单指令多数据)指令
集和浮点硬件,以全面支持用于信号处理算法的 Cortex-M4 处理器
的功能。CMSIS-DSP 库是完全用 C 语言编写的,并提供有源代码,
允许软件程序员根据特定应用需求对算法进行修改。
(3)CMSIS-RTOSAPI:用于线程控制、资源和时间管理的实时操
Administrator
下划线
Administrator
下划线
爱捣鼓网 http://www.aidaogu.com
第 7 页 共 27 页
作系统的标准化编程接口
CMSIS-SVD:包含完整微控制器系统(包括外设)的程序员视
图的系统视图描述 XML 文件。系统视图描述 (SVD) 文件以基于格
式化的 XML 提供了外设信息和其他设备参数。SVD 文件通常与设
备参考
中芯片供应商提供的信息相匹配。
1.4 CMSIS标准代码规范
1.4.1基本规范
(1)CMSIS的 C代码遵照MISRA2004规则。
(2)使用标准 ANSIC头文件
中定义的标准数据类型。
(3)由#define定义的包含表达式的常数必须用括号括起来。
(4)变量和参数必须有完全的数据类型。
(5)CPAL层的函数必须是可重入的。
(6)CPAL层的函数不能有阻塞代码,也就是说等待、查询等循环
必须在其他的软件层中。
(7)定义每个异常/中断的:
1)每个异常处理函数的后缀是_Handler,每个中断处理器函
数的后缀是 IRQHandler。
2)默认的异常中断处理器函数(弱定义)包含一个无限循环。
3)用#define将中断号定义为后缀为_IRQn的名称。
爱捣鼓网 http://www.aidaogu.com
第 8 页 共 27 页
1.4.2推荐规范
(1)定义核寄存器、外设寄存器和 CPU指令名称时使用大写。
(2)定义外设访问函数、中断函数名称时首字母大写。
(3)对于某个外设相应的函数,一般用该外设名称作为其前缀。
(4)按照 Doxygen规范撰写函数的注释,注释使用 C90风格(/* 注
释*/) 或者 C++风格(// 注释),函数的注释应包含以下内容:
1)一行函数简介;
2)参数的详细解释;
3)返回值的详细解释;
4)函数功能的详细描述。
1.4.3数据类型及 IO类型限定符
CMSIS标准使用标准 ANSI C头文件 stdint.h定义的数据类型。
IO类型限定符用于指定外设寄存器的访问限制,IO类型限定符在
core_cm3.h中定义:
01 /**
02 * IO definitions
03 *
04 * define access restrictions to peripheral registers
05 */
06
07 #ifdef __cplusplus
08 #define __I volatile /*定义只读*/
09 #else
10 #define __I volatile const /*定义只读*/
11 #endif
12 #define __O volatile /*定义只写*/
13 #define __IO volatile /*定义读写*/
Administrator
下划线
爱捣鼓网 http://www.aidaogu.com
第 9 页 共 27 页
1.4.4 CMSIS版本号
CMSIS标准有多个版本号,对于 CortexM3处理器,在 core_cm3.h
中定义所用CMSIS的版本。从以下内容可知:在 STM32固件库V3.5.0
中使用的 CMSIS版本为 V1.30。
01 /*!< [31:16] CMSIS HAL main version */
02 #define __CM3_CMSIS_VERSION_MAIN (0x01)
03 /*!< [15:0] CMSIS HAL sub version */
04 #define __CM3_CMSIS_VERSION_SUB (0x30)
05 /*!< CMSIS HAL version number */
1.4.5 Cortex内核
对于 CortexM3处理器,在头文件 core_cm3.h中定义:
#define__CORTEX_M (0x03)
对于 CortexM0处理器,在头文件 core_cm0.h中定义:
#define__CORTEX_M (0x00)
1.4.6工具链
CMSIS标准支持现在嵌入式开发的三大主流工具链,即 ARM
ReakView(armcc)MDK-ARM、IAR EWARM(iccarm)以及 GNU
工具链(gcc)。在 core_cm3.c中可以找到如图 1.4.6-1所示的定义。
爱捣鼓网 http://www.aidaogu.com
第 10 页 共 27 页
图 1.4.6-1 CMSIS标准支持编译器的定义
这些定义用来屏蔽一些编译器内置关键字的差异。这样 CPAL中
的功能函数就可以被定义成静态内联类型(static__INLINE),以实现
编译优化。
爱捣鼓网 http://www.aidaogu.com
第 11 页 共 27 页
2 固件库架构和文件脉络
2.1 固件库架构
图 2.1-1 STM32固件库文件架构和脉络
STM32固件库的架构和文件脉络如图 2.1-1所示。图 2.1-1相对
于图 1.2-1和图 1.3-1而言,未绘制用户层和 CMSIS核心层之间的实
爱捣鼓网 http://www.aidaogu.com
第 12 页 共 27 页
时操作系统层。由于图 1.3-1中的 CMSIS-DSP库和 SIMD Cortex-M4
不属于 Cortex-M3固件库的范畴,亦不属于 STM32固件库需要包含
的内容,因此,在图 2.1-1中没有包含对应的内容。
STM32固件库 V3.5.0按照 CMSIS标准 V1.30进行设计。通过图
2.1-1可知其包含 CMSIS标准用户层、CMSIS层和MCU层共 3个层
次。用户层是用户根据不同的应用设计的应用程序;CMSIS 层是
STM32固件库的核心文件(即“Libraries”文件夹内的文件);MCU层
是对应芯片的硬件实现层,对于 CMSIS层而言,主要是相关寄存器
的硬件实现。下面重点描述图 2.1-1中的用户层和 CMSIS层。对于
MCU层,仅仅是 STM32芯片硬件实现层的内容,对应固件库开发方
式而言,甚至完全不需要关注。
(1)用户层:在用户层中包含 STM32 固件库 V3.5.0 工程模板
(STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Te
mplate文件夹内)中包含的 3个文件:stm32f10x_it.c、stm32f10x_it.h
和 stm32f10x_conf.h。stm32f10x_it.c和 stm32f10x_it.h是 STM32中断
函数对应的头文件和程序文件。stm32f10x_conf.h是用于配置是否使
用 STM32 芯片内外设的文件。该文件内包含了固件库路径
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_D
river\inc所指文件夹内所有的片内外设函数头文件,使用时,仅需去
掉对应片内外设函数头文件的注释即可,如果不使用该外设,直接注
释掉对应片内外设函数头文件即可。Application.h和 Application.c是
用户层中用户编写的应用程序文件,其中,一定存在包含 main函数
Administrator
下划线
Administrator
高亮
爱捣鼓网 http://www.aidaogu.com
第 13 页 共 27 页
的主文件(一把为 main.c),在该主文件和其它应用文件中需要包含设
备外设访问层的设备外设寄存器和中断向量定义头文件 stm32f10x.h,
否则,使用固件库时,会报错。用户层所有的应用程序文件通过调用
CMSIS层固件库文件定义好的固件库函数操作 STM32微控制器对应
的寄存器,实现对应外设的初始化和操作对应外设的功能。
(2)图 2.1-1中 CMSIS层所包含的文件是 STM32固件库V3.5.0的
核心文件。在使用 STM32固件库创建工程和进行应用系统开发时,
把 CMSIS层中的 STM32固件库文件导入工程,无需任何修改,直接
使用即可。在 STM32固件库 CMSIS层中包含设备外设访问层和核内
外设访问层。在图 2.1-1中,对 CMSIS层的描述结合了 CMSIS标准
V1.30和 V3.20结构和 STM32固件库 V3.5.0的文件特点,设计了该
固件库的 CMSIS层结构。CMSIS层包含 CMSIS核心层和设备外设
函数两大块。这种结构式 STM32固件库 V3.5.0的文件结构,这与
CMSIS标准 V3.20版本结构中的 CMSIS层类似。依次为基础,根据
STM32固件库中 CMSIS核心层 5个文件内的注释可知:
1) CMSIS 核 心 层 内 设 备 外 设 访 问 层 的 文 件 是 :
system_stm32f10x.h、system_stm32f10x.c和 stm32f10x.h;
2) CMSIS核心层内核内外设访问层的文件是:core_cm3.h和
core_cm3.c。
对于如图 2.1-1 所示的 CMSIS 层 STM32 固件库 V3.5.0 路径
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_D
river文件夹内的设备外设函数程序文件和头文件而言,其属于设备外
Administrator
高亮
Administrator
下划线
Administrator
下划线
爱捣鼓网 http://www.aidaogu.com
第 14 页 共 27 页
设 访 问 层 。 即 在 STM32 固 件 库 中 , CMSIS 核 心 层 中 的
system_stm32f10x.h、system_stm32f10x.c和 stm32f10x.h三个文件和
设备外设函数文件构成了设备外设访问层。
2.2 固件库文件脉络
在图2.1-1中的黑色箭头和虚线箭头描述了STM32固件库V3.5.0
内文件之间的调用关系。这个调用关系来自固件库用户手册
stm32f10x_stdperiph_lib_um.chm 中如图 2.2-1 所示的固件库文件
调用关系图。
图 2.2-1 STM32固件库文件脉络
图 2.1-1 与图 2.2-1 中固件库文件调用关系的描述一致,通过图
2.1-1 不仅能了解固件库文件的调用关系,也能把我对应文件在固件
Administrator
标注
中断向量定义
Administrator
标注
芯片内外设定义
爱捣鼓网 http://www.aidaogu.com
第 15 页 共 27 页
库结构中的层次。因此,我建议各位在图 2.1-1 中分析和了解固件库
文件的调用关系。这个调用关系也就是 STM32 固件库的脉络。
下面以 stm32f10x.h 为例描述该文件的调用和被调用关系,剩下
的文件,大家可以从图 2.1-1 中自己进行分析。也可以根据每个文件
的调用关系打开对应文件,看是否如图 2.1-1 中描述进行了调用和被
调用。
首先从图 2.1-1 中可知:stm32f10x.h 这个头文件属于 CMSIS 层
内 CMSIS 核心层中设备外设访问层的文件。该文件主要内容是对
STM32 芯片内的外设寄存器和中断向量进行了定义。该文件调用了核
内外设访问层的 core_cm3.h 头 文件和设备外设访问层的
system_stm32f10x.h头文件及用户层的 stm32f10x_conf.h设备外设
函数配置头文件。该文件被用户层的 stm32f10x_it.h 中断函数头文
件和用户应用程序头文件 Application.h(也有可能在应用程序文件
Application.c 中被调用)及所有的设备外设函数头文件调用。
3 固件库文件总体说明
在了解了 STM32 固件库的架构和文件脉络后,顺理成章的要了解
固件库中每个文件的作用和基本内容。不过,在未进行实际工程实例
学习前,我个人建议仅仅从整体上把我一下每个文件的作用和大概内
容即可。我们掌握这些内容之后,在后续的学习或工程实践中,使用
固件库时,会比较方便的找到自己所需要的固件库函数进行使用。下
面经按照图 2.1-1 所示的层次关系,描述每个层内对应文件的作用和
爱捣鼓网 http://www.aidaogu.com
第 16 页 共 27 页
基本内容。一般情况下,大家了解这些内容即可。如果有闲情逸致,
那么,深入研究一下固件库文件的各种设计细节,也会另有一番情趣。
3.1 核内外设访问层文件
在 CMSIS 层中,核内外设访问层的文件是:core_cm3.h 和
core_cm3.c。这两个文件由ARM公司提供,适用于所有基于 Cortex-M3
处理器的芯片。这样提高了基于 Cortex-M3 芯片应用程序的可移植
性。这两个文件为只读属性,也不需要进行修改,直接使用即可。
core_cm3.h 头文件仅被 stm32f10x.h 这个头文件进行了调用。
其基本内容是:
(1)定义 Cortex-M3 内核和核内外设寄存器的数据结构及其地址
映射;
(2)提供了一些访问 Cortex-M30 内核寄存器和核内外设的函数,
这些函数被定义为静态内联函数;
(3)包含该文件所属 CMSIS 标准的版本和 Cortex 内核信息。其具
体内容详见 1.4.4 和 1.4.5 章节的内容;
(4)在该文件中包含了 ANSI C 标准中的一个重新定义数据类型的
头文件:stdint.h。该文件的作用就是对数据类型进行了重新定义,
屏蔽了不同芯片平台和编译器软件对数据长度的差异。在不同的编译
器中都会存在包含该文件,其重新定义的数据类型长度和名称完全一
样,只不过其原类型名称根据不同的编译器可能会有所差别。比如图
3.1-1 和图 3.1-2 所示的 MDK-ARM 和 IAR-EWARM 编译器中重新定义数
爱捣鼓网 http://www.aidaogu.com
第 17 页 共 27 页
据类型时,其数据类型原名称就不一样。不过这里需要记住的重点和
常用的数据类型就是图 3.1-1 和图 3.2-2 中所示的数据类型。目前,
固件库都使用重新定义后的数据类型。在工程实践中,我们最好记住
和使用这些新类型名称。通过这些新数据类型的名字,即可知道该类
型的信息。比如:int8_t 中 int 为有符号整型,8代表该整型为 8位,
t代表是重新定义的数据类型。这符合见名知意的原则。
图 3.1-1 MDK-ARM编译器中 stdint.h文件部分内容
图 3.1-2 IAR-EWARM编译器中 stdint.h文件部分内容
core_cm3.c 文件在图 2.1-1 中看起来比较孤立,好像与其它固
爱捣鼓网 http://www.aidaogu.com
第 18 页 共 27 页
件库文件直接不存在调用和被调用的关系。其实不然,其调用了 ANSI
C 的 stdint.h 这个文件。其中定义的函数也被芯片生产商提供的固
件库设备外设访问层的文件使用。其主要内容为:
(1)处理了不同编译器间的差异,详见 1.4.6 章节;
(2)定义了一些访问 Cortex-M3 内核寄存器的函数;
(3)定以了一些汇编语言指令的函数。
3.2 设备外设访问层隶属 CMSIS核心层的文件
CMSIS核心层内设备外设访问层的文件是:system_stm32f10x.h、
system_stm32f10x.c 和 stm32f10x.h。这三个文件由 ST 公司提供。
其实,处理 3.1 章节介绍的核内外设访问层的两个文件。STM32 固件
库V3.5.0中的其它固件库文件都是ST公司提供。这些文件仅供使用,
无需修改。其属性也为只读属性。
system_stm32f10x.h 和 system_stm32f10x.c 是在 CMSIS 标准中
system_.h 和 system_.c 基础上设计而成。根据
CMSIS 标准的要求,其必须包含 static void SetSysClock(void)和
void SystemCoreClockUpdate (void) 两 个 函 数 及 uint32_t
SystemCoreClock 变量的定义。这两个文件所包含的基本内容和功能
为:
(1)提供微控制器系统初始化配置函数void SystemInit (void)。
在启动文件中调用先调用该系统初始化配置函数,然后,再调用 main
函数。
Administrator
下划线
Administrator
下划线
Administrator
高亮
爱捣鼓网 http://www.aidaogu.com
第 19 页 共 27 页
(2)其功能是配置系统使用和总线时钟。
stm32f10x.h 是设备外设寄存器定义和中断向量定义头文件。其
功能和基本内容是定义片内外设寄存器地址、片内外设寄存器数据结
构和中断向量表。在后续开发过程中,我们需要经常光顾该文件,查
找寄存器重新定义的名称、结构体和中断向量和部分宏定义方面的内
容。
3.3 设备外设访问层设备函数文件
在 STM32 固件库\Libraries\STM32F10x_StdPeriph_Driver 文件
夹内存放的是设备外设访问层设备外设函数程序文件和头文件。
在图 2.1-1 中,设备外设函数这个名称是沿用英文翻译而来,其
实际上是 STM32 芯片内除 Cortex-M3 处理器之外的外设功能模板。
stm32f10x_ppp.h 和 stm32f10x_ppp.c 文件名称中的“ppp”是 STM32
片内外设的缩写。比如 stm32f10x_adc.h 和 stm32f10x_adc.c 代表
STM32 片内模数转换外设的访问函数和头文件。其它外设文件依次类
推。在设备函数文件中存在 misc.h 和 misc.c 两个设备函数文件的命
名与其它设备函数文件的命名规则不一致。在 V3.5.0 固件库中,虽
然这两个文件号称是包含固件库各种符合 CMSIS 标准设备外设函数
的文件,但是,从其文件内容来看,其主要是嵌套中断向量控制器外
设的函数文件和头文件。对于 stm32f10x_rcc.h 这个头文件,其是复
位和时钟控制器外设函数的头文件,由于其它部分外设需要用到时
钟,因此,其它片内外设函数文件也包含了该头文件。
Administrator
下划线
Administrator
下划线
Administrator
下划线
Administrator
下划线
Administrator
高亮
爱捣鼓网 http://www.aidaogu.com
第 20 页 共 27 页
对于这些片内外设函数头文件和函数文件,目前,主要了解其对
应哪些片内外设即可。其对应片内外设和包含 stm32f10x_rcc.h 文件
的外设函数文件详见表 3.3-1 所示。
表 3.3-1 设备外设访问的设备函数文件对应片内外设
序号 片内外设函数文件 片内外设 RCC 外设头文件
1 misc.c 嵌套中断向量控制器 否
2 stm32f10x_adc.c 模数转换器 包含
3 stm32f10x_bkb.c 备份寄存器 包含
4 stm32f10x_can.c 控制器局域网模块 包含
5 stm32f10x_cec.c 用户电子控制器 包含
6 stm32f10x_crc.c 循环冗余校验码计算 否
7 stm32f10x_dac.c 数模转换器 包含
8 stm32f10x_dbgmcu.c MCU 硬件调试模块 否
9 stm32f10x_dma.c 直接内存存取控制器 包含
10 stm32f10x_exti.c 外部中断事件控制器 否
11 stm32f10x_flash.c 闪存存储器 否
12 stm32f10x_fsmc.c 灵活的静态存储器控制器 包含
13 stm32f10x_gpio.c 通用输入输出口 包含
14 stm32f10x_i2c.c 芯片间总线接口 包含
15 stm32f10x_iwdg.c 独立看门狗 否
16 stm32f10x_pwr.c 电源功耗控制其 包含
17 stm32f10x_rcc.c 复位和时钟控制器 包含
18 stm32f10x_rtc.c 实时时钟 否
19 stm32f10x_sdio.c 固态存储卡输入输出接口 包含
20 stm32f10x_spi.c 串行外设接口 包含
21 stm32f10x_tim.c 通用定时器 包含
22 stm32f10x_usart.c 通用同步异步收发器 包含
23 stm32f10x_wwdg.c 窗口看门狗 包含
Administrator
下划线
Administrator
下划线
Administrator
下划线
Administrator
下划线
Administrator
下划线
Administrator
下划线
Administrator
下划线
爱捣鼓网 http://www.aidaogu.com
第 21 页 共 27 页
3.4 用户层固件库模板文件
在用户层文件中,使用了固件库工程模板中的三个文件:
stm32f10x_it.c、stm32f10x_it.h和 stm32f10x_conf.h。
stm32f10x_it.c和 stm32f10x_it.h是 STM32中断函数对应的头文
件和程序文件。这是专门放置中断服务函数的文件。在 stm32f10x_it.c
文件中已经定义了一些系统异常中断处理函数(空函数),其内容可
以根据不同的工程进行添加。其它中断服务函数有我们自己添加。中
断服务函数的名称按照对应芯片启动文件中定义名称命名,为了提高
代码的移植性,不要自己命名。
图 3.4-1 stm32f10x_conf.h包含的片内外设函数头文件
stm32f10x_conf.h是用于配置是否使用 STM32芯片内外设的文
Administrator
下划线
爱捣鼓网 http://www.aidaogu.com
第 22 页 共 27 页
件。其包含的设备外设函数头文件如图 3.4-1所示。该文件内包含了
固件库路径\Libraries\STM32F10x_StdPeriph_Driver\inc所指文件夹内
所有的片内外设函数头文件,使用时,仅需去掉对应片内外设函数头
文件的注释即可,如果不使用该外设,直接注释掉对应片内外设函数
头文件即可。另外,该文件还包含是否开启断言功能的选项。即是否
开启输入输出参数和返回参数正确性检查功能。其代码如图 3.4-2所
示第 56行注释掉的代码代表关闭固件库的断言功能。如果去掉第 56
行的注释符合,则打开固件库的断言功能。在应用程序开发时,可以
开启断言功能,方便查找问题的根源。在应用程序发布时,需要根据
具体情况关闭断言功能,使程序代码最优化。
图 3.4-2 stm32f10x_conf.h包含断言控制选项
3.5 启动文件
启动文件是在 STM32 单片机上电时,首先运行的一段汇编程序文
件。启动文件的主要作用是对芯片进行最基本的初始化配置,使其满
Administrator
下划线
Administrator
下划线
Administrator
下划线
Administrator
下划线
爱捣鼓网 http://www.aidaogu.com
第 23 页 共 27 页
足 C语言的运行环境要求,调用 main 函数。
STM32 固件库提供了适用于四种主流开发工具软件的启动文件。
如图 3.5-1 所示。arm 文件夹对应 Keil MDK-ARM。iar 文件夹对应 IAR
EWARM 编译器。gcc_ride7 文件夹对应的是基于 GCC 编译器的嵌入式
开发软件(这个纯属猜测,未用过该类软件)。TrueStudio 文件夹对
应的是 TrueStudio 编译器开发工具(这个纯属猜测,未用过该软件)。
我猜测该固件库目前仅支持这四类编译器。我个人使用的是 Keil IAR
ARM 和 IAR EWARM 两种编译器。
图 3.5-1 固件库支持编译器对应的启动文件
图 3.5-2 IAR EWARM对应的启动文件
每种编译器对应启动文件都包含如图 3.5-2所示,其启动文件名
称都一样。看这些启动文件的名称,重点是了解其名称对应什么型号
Administrator
下划线
爱捣鼓网 http://www.aidaogu.com
第 24 页 共 27 页
的芯片。方便根据不同的 STM32芯片,选择不同的启动文件。这些
启动文件对应芯片系列的关系详见表 3.5-1所示。
表 3.5-1 固件库启动文件对应芯片
序号 启动文件 关键词 对应芯片
1 startup_stm32f10x_cl.s cl
互联型芯片:STM32F105/107 系
列
2 startup_stm32f10x_hd.s hd
高密度芯片:FLASH 容量大于
128kB
3 startup_stm32f10x_hd_vl.s hd_vl
高密度(存储器容量)超值型芯
片:STM32F100 系列
4 startup_stm32f10x_ld.s ld
低密度芯片:FLASH 容量小于
64kB
5 startup_stm32f10x_ld_vl.s ld_vl
低密度超值型芯片:STM32F100
系列
6 startup_stm32f10x_md.s md
中密度芯片:FLASH 容量在 64 至
128kB 之间
7 startup_stm32f10x_md_vl.s md_vl
中密度超值型芯片:STM32F100
系列
8 startup_stm32f10x_xl.s xl
超高密度芯片:STM32F101/103
系列
启动文件包含的基本内容和作用为:
(1)初始化堆栈指针 SP;
(2)初始化程序计数器指针 PC;
(3)设置堆、栈的大小;
(4)设置异常向量表的入口地址;
Administrator
矩形
爱捣鼓网 http://www.aidaogu.com
第 25 页 共 27 页
(5)配置外部 SRAM 作为数据存储器(这个由用户配置,一般的开
发板可没有外部 SRAM);
(6)设置 C 库的分支入口__main(最终用来调用 main 函数);
(7)在 3.5 版的启动文件还调用了在 system_stm32f10x.c 文件
中的 void SystemInit (void)函数配置系统时钟,在旧版本的工程
中要用户进入 main 函数自己调用 void SystemInit (void)函数。
4 固件库的使用说明
对于 STM32 固件库用户而言,怎样使用固件库?这是一个不可回
避的问题。用户使用 STM32 固件库的核心就是如何掌握固件库中各种
设备外设层访问函数和核内外设层访问函数的使用方法。以后,我们
把这些函数简称为固件库函数。
图 4-1 STM32固件库用户手册目录结构
Administrator
高亮
Administrator
矩形
爱捣鼓网 http://www.aidaogu.com
第 26 页 共 27 页
我们使用 STM32 固件库,最常使用的是固件库中提供的名称为
“stm32f10x_stdperiph_lib_um.chm”的英文用户手册。其目录结构
如图 4-1 所示。在 Modules 目录下包含了所有库函数的说明。在 Data
Structures 目录下面是固件库数据结构的目录。
图 4-2 STM32固件库用户手册中通用输入输出口初始化库函数的说明
在固件库用户手册中对固件库的所有库函数的功能、输入参数、
输出参数和返回值进行了详细的说明。如图 4-2 所示通用输入输出口
初始化函数的说明。
该函数的原型为:
void GPIO_Init ( GPIO_TypeDef* GPIOx,
GPIO_InitTypeDef* GPIO_InitStruct
)
该函数的功能是根据 GPIO_InitStruct 的参数初始化 GPIOx 外
设。
该函数的输入参数为:自定义 GPIO_TpeDef 结构体类型指针参数
爱捣鼓网 http://www.aidaogu.com
第 27 页 共 27 页
GPIOx 和 自 定 义 GPIO_InitTypeDef 结 构 体 类 型 指 针 参 数
GPIO_InitStruct。GPIOx 是选择初始化 A 至 G 哪个 GPIO 口。
GPIO_InitStruct 是对指定 GPIO 口的配置信息。关于自定义结构体
的信息,可以单击蓝色带下划线的自定义结构体名称,即可找到对应
结构体的定义。
该函数的返回值:无。
由此可知:固件库用户手册对库函数的描述很详细,直接按照上
面描述的分析方法,分析每个库函数,就能掌握该库函数的结构和怎
样使用该库函数。
通过固件库用户手册中类似的库函数说明,我们在对使用片内外
设库函数时,只需要根据其表 3.3-1 所示的外设对应关系,在用户手
册 Modules\STM32F10x_StdPeriph_Driver 目录下找到对应外设名称
的所有库函数,按照用户手册中对库函数的说明,直接使用即可,无
需详细了解具体库函数的实现原理(当然,有兴趣研究一下,也是不
错的深入学习 STM32 的好机会)。
另外,由于固件库中所有变量、结构体、枚举、函数、常量和文
件名称等都采用英文缩写或简写,而且要达到见名识意的效果,名称
相对比较长,在使用这些名称时,直接从固件库或用户手册中拷贝到
代码中使用,防止输入错误,带来不必要的麻烦。
概述
CMSIS标准概览
固件库真实的基准
CMSIS标准V1.30架构
CMSIS标准V3.20架构
CMSIS标准代码规范
基本规范
推荐规范
数据类型及IO类型限定符
CMSIS版本号
Cortex内核
工具链
固件库架构和文件脉络
固件库架构
固件库文件脉络
固件库文件总体说明
核内外设访问层文件
设备外设访问层隶属CMSIS核心层的文件
设备外设访问层设备函数文