【普中STM32F1xx开发攻略--标准库版】-- 第 9 章 STM32 固件库介绍
(1)实验平台:
普中STM32F103朱雀开发板
https://item.taobao.com/item.htm?id=620302685024普中STM32F103玄武开发板
https://item.taobao.com/item.htm?id=603479028876(2)资料下载:普中科技-各型号产品资料下载链接
前面章节为大家简单介绍了如何使用寄存器点亮开发板上 LED, 这种开发方式显然是不适合大众, 对于 STM32 这样庞大的芯片, 内部寄存器实在太多, 如果操作的外设比较多, 那么就需要花很多时间查询底层寄存器内容, 而且即使程序写好, 如果要换其他端口或者外设的话, 修改起来非常麻烦, 而且容易出错, 移植性也差。 基于这些原因, ST 公司推出了一套固件库, 内部已经将 STM32 的全部外设寄存器的控制封装好, 给用户提供一些 API 函数, 用户只需要学习如何使用这些 API 函数即可。 本章将向大家介绍这套固件库, 为后面库函数模板创建做好铺垫。 学习本章可以参考《STM32F1xx 中文参考手册》 、 《Cortex-M3 权威指南》 、 《STM32 固件库使用手册(中文翻译版)》 。 本章分为如下几部分内容:
目录
9.1 CMSIS 标准
9.2 库目录及文件介绍
9.2.1 文件夹介绍
9.2.2 文件介绍
9.3 库帮助文档使用
9.1 CMSIS 标准
什 么 是 CMSIS 标 准 ? CMSIS 标 准 英 文 全 称 是 Cortex MicroController Software Interface Standard, 翻译为中文意思就是 ARM Cortex 微控制器软件接口标准。 由于基于 Cortex 核的芯片厂商很多, 不只是 ST 公司, 为了解决不同厂家的 Cortex 核芯片软件兼容的问题, ARM 和这些厂家就建立了这套 CMSIS 标准。
我们可以通过一个基于 CMSIS 标准的应用程序框图来看其重要性。 如下图所示

从图中可以看出, CMSIS 处于中间层, 向上提供给用户程序和实时操作系统所需的函数接口, 向下负责与内核和其他外设通信。 假如没有 CMSIS 标准, 基于Cortex 的芯片厂商就会设计出自己喜欢的风格库函数。 因此 CMSIS 标准就是要强制他们必须按照这个标准来设计。
在 CMSIS 核心层又分为 3 个基本功能层:
(1) 核内外设访问层: ARM 公司提供的访问, 定义处理器内部寄存器地址以及功能函数。
(2) 中间件访问层: 定义访问中间件的通用 API, 由 ARM 提供, 芯片厂商根据需要更新。
(3) 外设访问层: 定义硬件寄存器的地址以及外设的访问函数, 比如 ST公司提供的固件库外设驱动文件(stm32f10x_gpio.c 等文件) 就是在这个访问层。
总的来说其实 CMSIS 就是统一各芯片厂商固件库内函数的名称, 比如在系统初始化的时候使用的是 SystemInit 这个函数名, 那么 CMSIS 标准就是强制所有使用 Cortex 核设计芯片的厂商内固件库系统初始化函数必须为这个名字, 不能修改。 又比如对 GPIO 口输出操作的函数: GPIO_SetBits, 此函数名也是不能随便定义的。 更多关于 CMSIS 标准介绍, 大家可以百度搜索下, 这里就不多解释。
9.2 库目录及文件介绍
上一节我们介绍了 CMSIS 标准, ST 公司按照这个标准设计了一套基于STM32F10x 的固件库, 我们可以直接在 ST 公司的官网进行下载, 在我们光盘“\8--STM32 相关资料\STM32 最新固件库 v3.5” 内也给大家提供了下载好的包,我们提供的固件库包版本是 V3.5。
9.2.1 文件夹介绍
下面就来介绍库文件的目录及文件。 我们打开下载好的固件库包如下图所示:

(1) _htmresc 文件夹: 存放 ST 公司的 LOGO 图标, 这个文件夹不用管。
(2) Libraries 文件夹: 在这个文件夹内有两个子目录, CMSIS 文件夹用于存放符合 CMSIS 标准的文件, 包括 STM32 启动文件、 ARM Cortex 内核文件和对应外设头文件 stm32f10x.h。 STM32F10x_StdPeriph_Driver 文件夹用于存放STM32 外设驱动文件, inc 目录用于存放外设的头文件, src 目录用于存放外设的 源 文 件 。 从 这 些 源 文 件 的 命 名 就 可 以 知 道 对 应 文 件 的 功 能 , 比 如stm32f10x_gpio.c 文件, 包含了对 STM32 的 GPIO 寄存器的操作函数等, 如果要对 STM32 GPIO 操作可以调用这个文件内的函数, 但是要记得添加对应的头文件,如 stm32f10x_gpio.h。 此文件夹内文件在后面创建库函数模板的时候会重点使用。
(3) Project 文件夹: 此文件夹下有 2 个目录, STM32F10x_StdPeriph_Examples 文件夹存放的是 ST 公司提供的外设驱动例程,在开发过程中可以借鉴这些例程快速构建自己的外设驱动。 有时间大家可以看看, 里面的编程思路对我们还是很有帮助的。 STM32F10x_StdPeriph_Templates文件夹存放的是官方的固件库工程模板, 我们后面创建自己工程模板的时候就需要复制此文件夹内的几个文件。
(4) Utilities 文件夹: 此文件夹是 ST 官方评估板的一些源文件, 这里不需要管。
(5) stm32f10x_stdperiph_lib_um.chm 文件: 这个文件是固件库的帮助文档, 可以直接双击打开。 这个文档对于后面学习库函数是非常有帮助的, 只不过这里只有英文版的, 但是里面的英文都很好理解, 如果学习过程中有不明白的单词, 都可以通过百度翻译等软件查询。
9.2.2 文件介绍
在介绍库文件之前先看下它们文件之间的关系, 如下图所示:

core_cm3.h 文件: 位于“\STM32 最新固件库v3.5\Libraries\CMSIS\CM3\CoreSupport” 目录下, 说明此文件属于 CMSIS 标准文件, 是用来提供进入 M3 内核的接口文件, 属于 CMSIS 的核心文件, 由 ARM 提供。 对于所有 M3 内核的芯片来说这个文件都是相同的, 不需要我们修改。
stm32f10x.h 、 system_stm32f10x.h 和 system_stm32f10x.c 文件: 存放在“\STM32 最新固件库v3.5\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x” 目录下, system_stm32f10x.h 是片上外设接入层系统头文件。 主要是申明设置系统及总线时钟相关的函数。 与其对应的源文件是 system_stm32f10x.c。 这个文件里面有一个非常重要的 SystemInit()函数申明, 这个函数在我们系统启动的时候都会调用, 用来设置系统的整个系统和总线时钟。 而 stm32f10x.h 是 STM32F10x的头文件, 类似于 51 单片机的 reg.51, 在开发 STM32F10x 程序的时候基本上都会调用这个头文件, 可见其重要性。 此文件内部封装了 STM32 的总线、 内存和外设寄存器等, 同时该文件还包含了一些时钟相关的定义和中断相关定义等。
stm32f10x_ppp.c文件: 是STM32外设的驱动源文件, 比如stm32f10x_gpio.c文件。 里面已经封装好操作 GPIO 外设底层的内容, 提供给我们使用的是一些 API函数。 stm32f10x_ppp.h 就是对应的头文件。 还有 stm32f10x_rcc.c、 misc.c 和misc.h 文件他们都是存放在“\STM32 最新固件库v3.5\Libraries\STM32F10x_StdPeriph_Driver” 内。
stm32f10x_it.c 文件: 用于存放中断函数, 不过中断函数也可以放在其他工程文件内, 所以这个文件很少操作, 对应的 stm32f10x_it.h 文件是它的头文件。
stm32f10x_conf.h 文件: 是配置文件, 用于删减我们使用的外设头文件,比如使用 GPIO 外设, 那么就需要调用 stm32f10x_gpio.h 头文件, 如果不使用GPIO 外设, 可以将此头文件注释掉, 一般情况下我们不会对这个配置文件操作,因为如果不使用一个外设, 可以在工程内不调用即可。 这几个文件存放在“\STM32最新固件库 v3.5\Project\STM32F10x_StdPeriph_Template” 内。
Application.c 文件: 用于存放用户编写的应用程序, 文件名可以根据个人爱好命名。 我们通常会命名为 main.c, 表示存放我们的主函数代码。
在后面我们创建工程模板时, 添加这些文件还不够, 还要将 STM32 的启动文件添加进来, 否则系统不能启动。 ST 固件库提供的启动文件有很多, 需根据使用的 STM32 芯片来选择, 因为开发板上使用的是高容量的 STM32F1 芯片, 所以选择 startup_stm32f10x_hd.s。 启动文件 startup_stm32f10x_hd.s 存放在“\STM32 最新固件库v3.5\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm” 内。
9.3 库帮助文档使用
在进行库函数开发时, 难免会遇到各种函数不知其含义以及使用方法的困恼, 幸好 ST 公司提供了一套库函数使用说明文档, 但是是英文的, 没关系, 因为函数的使用方法介绍比较简单, 也就是那么些专业词语, 大家多查几遍就认识了。 这个在前面介绍固件库文件夹时也提到过, 为stm32f10x_stdperiph_lib_um.chm, 我们可以直接打开, 如下图所示:

因为 STM32 库函数非常多, 我们不可能把所有的外设函数都记住, 那么这个帮助文档就是学习 STM32 库函数时所必备的, 所以要学会如何在这个帮助文档内查找函数。 我们使用的库函数全部都在下图所示列表下:

要查找哪个外设的库函数, 只需要找到对应的外设名称即可。 比如要查找对GPIO 外设操作的库函数, 我们可以在这个列表下往下拉找到 GPIO 栏, 其中 IO Functions 列表下就是 GPIO 所有操作的库函数如下图所示:

假如我们先在要查找 GPIO_Init 函数的功能说明及使用方法, 可以在下拉列表中点击这个函数名即可进入。 在函数介绍内就有函数的原形、 功能简介、 参数说明、 函数返回值等信息。 如下图所示:

这里给大家介绍的是使用库函数帮助文档来查找函数功能说明等信息, 还可以通过固件库源码来查找, 其实库函数帮助文档就是从固件库源码转换过而来。通过固件库查找在后面创建工程模板的时候会给大家介绍, 非常简单。 如果对英文感冒的朋友, 还可以参考《STM32 固件库使用手册(中文翻译版)》 文档, 该文档是上面固件库的中文翻译版, 只不过有些函数没有, 还有些地方可能与实际固件库函数有点差别, 不过大部分还是一样的, 完全可以借鉴, 后面在编写程序的过程中, 我们就会经常使用到它。
