STM32固件库分析

前言

因为基于 Cortex 系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在同内核,不同外设的芯片上移植困难。为了解决不同的芯片厂商生产的 Cortex 微控制器软件 的兼容性问题,ARM 与芯片厂商建立了 CMSIS 标准(Cortex MicroController Software Interface Standard)。所谓 CMSIS 标准,实际是新建了一个软件抽象层。见图
CMSIS架构
CMSIS 标准中最主要的为 CMSIS 核心层,它包括了:
内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要由 ARM 公司提供。

设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供

1. 库目录、文件简介

采用 3.5.0 库文件,内容如下:
库内容
Libraries文件夹:驱动库的源代码及启动文件,使用的固件库就在这里面。
Project文件夹:驱动实例和工程模板,可以参考这里面的例程。
Utilities文件夹:包含ST官方实验板例程,略过。
stm32f10x_…文件,库帮助文档,可以查看外设声明,求助。

2. \Libraries\CMSIS\CM3下文件

在使用库开发时,我们需要把 libraries 目录下的库函数文件添加到工程中,并查阅库帮助文档来了解 ST 提供的库函数。

文件一览

2.1 \CoreSupport文件夹

在这个文件夹下:
Core_cm3.h 头文件里面实现了内核的寄存器映射,对应外设头文件 stm32f10x.h,区别就是一个针对内核的外设,一个针对片上(内核之外)的外设。

core_cm3.c 文件实现了一下操作内核外设寄存器的函数,用的比较少。

我们还需要了解的是 core_cm3.h 头文件中包含了“stdint.h” 这个头文件,这是一个ANSI C 文件,是独立于处理器之外的,就像我们熟知的 C 语言头文件 “stdio.h” 文件一样。位于 RVMDK 这个软件的安装目录下,主要作用是提供一些类型定义。如下:

/* exact-width signed integer types */
2. typedef signed char int8_t;
3. typedef signed short int int16_t;
4. typedef signed int int32_t;
5. typedef signed _int64 int64_t;
6. /* exact-width unsigned integer types */
7. typedef unsigned char uint8_t;
8. typedef unsigned short int uint16_t;
9. typedef unsigned int uint32_t;
10. typedef unsigned __int64 uint64_t;

2.2 DeviceSupport\ST\STM32F10x文件夹

2.2.1 \startup文件夹

启动文件放在 startup/arm 这个文件夹下面,这里面启动文件有很多个,不同型号的单片机用的启动文件不一样,有关每个启动文件的详细说明见表
启动文件对照表

2.2.2 Stm32f10x.h文件

这个头文件实现了片上外设的所以寄存器的映射,是一个非常重要的头文件,在内核
中与之想对应的头文件是 core_cm3.h

2.2.3 Stm32f10x.h文件

这个头文件实现了片上外设的所以寄存器的映射,是一个非常重要的头文件,在内核中与之想对应的头文件是 core_cm3.h。

2.2.4 system_stm32f10x.c文件

system_stm32f10x.c 文件实现了 STM32的时钟配置,操作的是片上的 RCC 这个外设。系统在上电之后,首选会执行由汇编编写的启动文件,启动文件中的复位函数中调用的SystemInit 函数就在这个文件里面定义。调用完之后,系统的时钟就被初始化成 72M。
如果后面我们需要重新配置系统时钟,我们就可以参考这个函数重写。为了维持库的完整性,我们不会直接在这个文件里面修改时钟配置函数。

3.\Libraries\STM32F10x_StdPeriph_Driver下文件

进入 libraries目录下的 STM32F10x_StdPeriph_Driver 文件夹,见图
文件夹
inc(include 的缩写)跟 src(source 的简写)这两个文件夹,这里的文件属于 CMSIS 之外的的、芯片片上外设部分。src 里面是每个设备外设的驱动源程序,inc 则是相对应的外设头文件。src 及 inc 文件夹是 ST 标准库的主要内容,甚至不少人直接认为 ST 标准库就是指这些文件,可见其重要性。

这两个文件夹中,还有一个很特别的 misc.c 文件,这个文件提供了外设对内核中的NVIC(中断向量控制器)的访问函数,在配置中断时,我们必须把这个文件添加到工程中。

4. \Project\STM32F10x_StdPeriph_Template下文件

在这个文件目录下,存放了官方的一个库工程模板,我们在用库建立一个完整的工程时,还需要添加这个目录下的stm32f10x_it.c、stm32f10x_it.h、stm32f10x_conf.h 和
system_stm32f10x.c 这四个文件。

stm32f10x_it.c:这个文件是专门用来编写中断服务函数的,在我们修改前,这个文件已经定义了一些系统异常(特殊中断)的接口,其它普通中断服务函数由我们自己添加。

system_stm32f10x.c:这个文件包含了 STM32 芯片上电后初始化系统时钟、扩展外部存储器用的函数,例如我们前两章提到供启动文件调用的“SystemInit”函数,用于上电后初始化时钟,该函数的定义就存储在 system_stm32f10x.c 文件。STM32F103 系列的芯片,调用库的这个 SystemInit 函数后,系统时钟被初始化为 72MHz,如有需要可以修改这个文件的内容,设置成自己所需的时钟频率,但鉴于保持库的完整性,我们在做系统时钟配置的时候会另外重写时钟配置函数。

stm32f10x_conf.h:这个文件被包含进 stm32f10x.h 文件。把外设的头文件全部包含在里面,统一管理。还可配置是否使用“断言”编译选项。

5. 库文件之间关系

有的库文件是直接包含进工程即可,丝毫不用修改,而有的文件就要我们在使用的时候根据具体的需要进行配置。接下来从整体上把握一下各个文件在库工程中的层次或关系,这些文件对应到 CMSIS 标准架构上。如图:
在这里插入图片描述
描述了 STM32 库各文件之间的调用关系,在实际的使用库开发工程的过程中,我们把位于 CMSIS 层的文件包含进工程,除了特殊系统时钟需要修改 system_stm32f10x.c,其它文件丝毫不用修改,也不建议修改。
对于位于用户层的几个文件,就是我们在使用库的时候,针对不同的应用对库文件进行增删(用条件编译的方法增删)和改动的文件。

后记

认识官方的固件库是很重要,是固件库编程的基础。
CMSIS自我感觉它的功能屏蔽了寄存器地址的细节,不用再寻找寄存器地址

附录

需要有固件库资源的朋友们,可找下面链接:
链接: STM32F103官方固件库V3.5.0.zip.

新建固件库工程的步骤以及成品,可在以下链接找到:
链接: 新建工程加模板.zip.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章