为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

爱捣鼓STM32笔记4固件库那些事

2013-07-17 31页 pdf 1MB 17阅读

用户头像

is_534744

暂无简介

举报
爱捣鼓STM32笔记4固件库那些事 爱捣鼓网 http://www.aidaogu.com 爱捣鼓 STM32笔记 4 固件库那些事 作者:谭鹏超 爱捣鼓网 http://www.aidaogu.com 爱捣鼓网 http://www.aidaogu.com - I - 版权和免责声明 本文版权归爱捣鼓网所有。爱捣鼓网允许对本文进行自由传播,但不得用于商业用 途。在对本文进行转载和发布时,必须注明“来源:爱捣鼓网 http:\\www.aidaogu.com”, 否则,请立即删除相关下载页面和链接。对使用本文中任何内容造成的损失,爱捣鼓网 ...
爱捣鼓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 - 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,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索