爱捣鼓STM32笔记4固件库那些事
爱捣鼓网 http://www.aidaogu.com
爱捣鼓 STM32笔记 4
固件库那些事
作者:谭鹏超
爱捣鼓网
http://www.aidaogu.com
爱捣鼓网 http://www.aidaogu.com
- I -
版权和免责声明
本文版权归爱捣鼓网所有。爱捣鼓网允许对本文进行自由传播,但不得用于商业用
途。在对本文进行转载和发布时,必须注明“来源:爱捣鼓网 http:\\www.aidaogu.com”,
否则,请立即删除相关下载页面和链接。对使用本文中任何内容造成的损失,爱捣鼓网
...
爱捣鼓网 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核心层的文件
设备外设访问层设备函数文
本文档为【爱捣鼓STM32笔记4固件库那些事】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。