STM32Cube 包结构解析
STM32Cube 生态系统是一套完整的 STM32 微控制器和微处理器软件解决方案。主要分为两类软件:
- 开发环境:全套 PC 软件工具,满足整个项目开发周期的所有需求。
- 库函数:各种运行在 STM32 微控制器和微处理器上嵌入式软件模块。
开发环境
STM32CubeMX
:使用图形用户界面可为生成初始化 C 代码STM32CubeIDE
:一个集成开发环境。包含代码编辑、编译、下载、调试。STM32CubeProgrammer
:二进制烧录工具。STM32CubeMonitor
:监控工具,可帮助开发人员实时微调应用程序的行为和性能。
库函数
STM32Cube packages
:针对不同的系列,提供的驱动程序、中间件、应用例程;STM32Cube expansion packages
:应用层库;
Drivers/CMSIS
CMSIS
:Common Microcontroller Software Interface Standard,通用微处理器软件接口标准;由 ARM 公司定义的接口规范。
从应用层代码分析,忽略调试功能,CMSIS 包含如下几个模块:
CMSIS-CORE
:Cortex 核心内部寄存器定义与接口函数。CMSIS-RTOS
:实时操作系统。CMSIS-DSP
:数字信号处理优化函数库。CMSIS-NN
:神经网络优化函数库。CMSIS-Driver
:Cortex 外围设备寄存器定义与接口函数,提供统一接口给中间件。但 ST 并没有选择实现 CMSIS-Driver 接口规范,而是实现了自定义 Peripheral HAL 接口规范。
参考资料:
- 【主页】CMSIS
- 【文档】CMSIS
- 【源码】CMSIS_6
CMSIS-CORE
CMSIS-CORE
又由两部分组成:
CMSIS-Core Standard Files
:由 ARM 提供的 Cortex 核心接口函数CMSIS-Core Device Files
:由 MCU 设备供应商提供,包含外围设备的接口函数
CMSIS-Core Standard Files
下图是 CMSIS-Core Standard Files
的头文件包含图:
首先分析 core_cm0plus.h
,它由以下 5 部分组成:
Core
:核心状态和控制寄存器结构定义;这些寄存器没有映射到内存空间,所以无法通过普通的 C 语言访问。NVIC
:Nested Vectored Interrupt Controller,嵌套向量中断控制器;定义寄存器地址、寄存器结构、操作函数;SCB
:System Control Block,系统控制块;产生 Cortex 内部中断;定义寄存器地址、寄存器结构、操作函数;SysTick
:System Tick Timer,系统滴答定时器;定义寄存器地址、寄存器结构、操作函数;MPU
:Memory Protection Unit,内存保护单元;定义寄存器地址、寄存器结构、操作函数;
中间的 cmsis_compiler.h
只是一个简单的路由,用于确定实际的编译器后端。
最后 cmsis_armcc.h
用于访问核心状态和控制寄存器;如前面所说,这些寄存器没有映射到内存空间,无法通过普通的 C 语言访问,而是通过汇编将寄存器与内存进行交互。
总的来说,core_cm0plus.h
对外提供了操作 Cortex-M 内部设备和内部寄存器的功能。
- 【文档】CMSIS-Core Standard Files
CMSIS-Core Device Files
下图是 CMSIS-Core Device Files 的头文件包含图:
startup_stm32g030xx.s
是程序运行的起点,使用汇编语言编写;它的主要功能为:
- 定义中断向量表。
- 定义弱中断服务函数为死循环,使中断触发时,能正确跳转。
- 调用
SystemInit()
函数。 - 将数据段的内容从 Flash 复制到 SRAM。
- 调用
__libc_init_array()
函数,初始化全局变量和静态对象。 - 调用
main()
函数。
由于启动文件使用汇编语言编写,不同的编译器汇编语法不同,所以 STM32Cube MCU Package 提供了三种启动程序模板,分别对应的编译器与 IDE:
编译器 | IDE |
---|---|
ARM | RealView Microcontroller Development Kit(MDK-ARM) |
GCC | STM32CubeIDE |
IAR | IAR(EWARM) |
system_stm32g0xx.c
提供 SystemInit()
,正常来说该函数应初始化系统时钟、外部存储等配置、自定义中断向量表地址等系统初始化配置;但对于最小系统来说,它可以为空。
stm32g0xx.h
是简单的设备路由。stm32g030xx.h
定义外围设备寄存器地址、寄存器结构,并包含 core_cm0plus.h
内部设备和寄存器定义,所以该文件是用户直接进行寄存器操作的基础,也是 LL 和 HAL 库的基础。
- 【文档】CMSIS-Core Device Files
- 【源码】cmsis-device-g0
Drivers/STM32G0xx_HAL_Driver
内含设备的 HAL 和 LL 驱动,主要用于操作外围设备,并进一步封装了 Cortex 内部设备操作函数。前者 HAL 接口规范确保在 STM32 产品组合中实现最大程度的可移植性;后者 LL 接口确保高性能,用于替代早期的 SPL 标准外设库。以下是英文缩写全称:
HAL
:Hardware Abstraction Layer,硬件抽象层;LL
:Low-Layer,底层;SPL
:Standard Peripheral Libraries,标准外设库;因不利于 STM32 产品间移植,已被更高抽象层 HAL 替代;或者被性能更优的 LL 替代。
其实 CMSIS-Driver 定义了外设接口规范,这样中间件可以很轻松的对接这些外设。但 ST 并没有遵循该接口规范,而是自定义了 HAL 接口规范;初步怀疑是 CMSIS-Driver 规范限制了 ST 外设特有的功能,所以 ST 自己构建 HAL 接口,使其外设能发挥最佳状态。
HAL 与 LL 的调用图如下:
stm32g0xx_hal_def.h
:统一 HAL 库内部所需的所有底层头文件。stm32g0xx_hal_conf.h
:定义需要使用哪些外设,缩小编译大小;该文件需要用户定义。stm32g0xx_hal_foo.h
:某一外设对外提供的操作函数。stm32g0xx_hal.h
:定义 HAL 外部接口,包括所有 HAL 函数声明。
- 【源码】stm32g0xx-hal-driver
Drivers/BSP
板级支持包。
Middlewares
中间件,这里主要是对接 STM32 HAL 接口、和硬件无关的软件协议栈或操作系统。对接 CMISI 接口的中间件在 Drivers/CMSIS/
文件夹中。
Projects
项目工程,可以直接使用 IDE 编译后烧录到 MCU 中。
Template
:允许用户在模板上快速构建应用程序,main 为一个死循环。Examples_LL
:使用 LL 驱动程序,每个外设均有一个工程示例。Examples
:使用 HAL 和 BSP 驱动程序,每个外设均有一个工程示例。Applications
:使用中间件的例子,每个中间件均有一个工程示例。Demonstrations
:出厂时带有最大数量外设和中间件的程序,用于展示产品功能和性能。
参考资料
- 【官网】STM32Cube
- 【主页】STM32CubeG0