当前位置: 首页 > news >正文

STM32Cube 包结构解析

STM32Cube 生态系统是一套完整的 STM32 微控制器和微处理器软件解决方案。主要分为两类软件:

  1. 开发环境:全套 PC 软件工具,满足整个项目开发周期的所有需求。
  2. 库函数:各种运行在 STM32 微控制器和微处理器上嵌入式软件模块。

在这里插入图片描述

开发环境

  1. STM32CubeMX:使用图形用户界面可为生成初始化 C 代码
  2. STM32CubeIDE:一个集成开发环境。包含代码编辑、编译、下载、调试。
  3. STM32CubeProgrammer:二进制烧录工具。
  4. STM32CubeMonitor:监控工具,可帮助开发人员实时微调应用程序的行为和性能。

stm32g0xx_hal_foo

库函数

  1. STM32Cube packages:针对不同的系列,提供的驱动程序、中间件、应用例程;
  2. STM32Cube expansion packages:应用层库;

Drivers/CMSIS

CMSIS:Common Microcontroller Software Interface Standard,通用微处理器软件接口标准;由 ARM 公司定义的接口规范。

在这里插入图片描述

从应用层代码分析,忽略调试功能,CMSIS 包含如下几个模块:

  1. CMSIS-CORE:Cortex 核心内部寄存器定义与接口函数。
  2. CMSIS-RTOS:实时操作系统。
  3. CMSIS-DSP:数字信号处理优化函数库。
  4. CMSIS-NN:神经网络优化函数库。
  5. CMSIS-Driver:Cortex 外围设备寄存器定义与接口函数,提供统一接口给中间件。但 ST 并没有选择实现 CMSIS-Driver 接口规范,而是实现了自定义 Peripheral HAL 接口规范。

参考资料:

  1. 【主页】CMSIS
  2. 【文档】CMSIS
  3. 【源码】CMSIS_6

CMSIS-CORE

CMSIS-CORE 又由两部分组成:

  1. CMSIS-Core Standard Files:由 ARM 提供的 Cortex 核心接口函数
  2. CMSIS-Core Device Files:由 MCU 设备供应商提供,包含外围设备的接口函数
CMSIS-Core Standard Files

下图是 CMSIS-Core Standard Files 的头文件包含图:

CMSIS-Core Standard Files
cmsis_armcc.h
core_cm0plus.h
cmsis_compiler.h

首先分析 core_cm0plus.h,它由以下 5 部分组成:

  1. Core:核心状态和控制寄存器结构定义;这些寄存器没有映射到内存空间,所以无法通过普通的 C 语言访问。
  2. NVIC:Nested Vectored Interrupt Controller,嵌套向量中断控制器;定义寄存器地址、寄存器结构、操作函数;
  3. SCB:System Control Block,系统控制块;产生 Cortex 内部中断;定义寄存器地址、寄存器结构、操作函数;
  4. SysTick:System Tick Timer,系统滴答定时器;定义寄存器地址、寄存器结构、操作函数;
  5. 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 的头文件包含图:

User File
CMSIS-Core Standard Files
CMSIS-Core Device Files
main.c
core_cm0plus.h
system_stm32g0xx.h
stm32g030xx.h
stm32g0xx.h
system_stm32g0xx.c
startup_stm32g030xx.s

startup_stm32g030xx.s 是程序运行的起点,使用汇编语言编写;它的主要功能为:

  1. 定义中断向量表。
  2. 定义弱中断服务函数为死循环,使中断触发时,能正确跳转。
  3. 调用 SystemInit() 函数。
  4. 将数据段的内容从 Flash 复制到 SRAM。
  5. 调用 __libc_init_array() 函数,初始化全局变量和静态对象。
  6. 调用 main() 函数。

由于启动文件使用汇编语言编写,不同的编译器汇编语法不同,所以 STM32Cube MCU Package 提供了三种启动程序模板,分别对应的编译器与 IDE:

编译器IDE
ARMRealView Microcontroller Development Kit(MDK-ARM)
GCCSTM32CubeIDE
IARIAR(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 的调用图如下:

CMSIS-Core Device Files
STM32 LL Driver
STM32 HAL Driver
stm32g0xx.h
stm32g0xx_ll_foo.h
ll_main.h
stm32g0xx_ll_foo.c
stm32g0xx_hal.h
hal_main.h
stm32g0xx_hal_def.h
stm32g0xx_hal_foo.h
stm32g0xx_hal_conf.h*
stm32g0xx_hal_foo.c
  1. stm32g0xx_hal_def.h:统一 HAL 库内部所需的所有底层头文件。
  2. stm32g0xx_hal_conf.h:定义需要使用哪些外设,缩小编译大小;该文件需要用户定义。
  3. stm32g0xx_hal_foo.h:某一外设对外提供的操作函数。
  4. stm32g0xx_hal.h:定义 HAL 外部接口,包括所有 HAL 函数声明。
  • 【源码】stm32g0xx-hal-driver

Drivers/BSP

板级支持包。

Middlewares

中间件,这里主要是对接 STM32 HAL 接口、和硬件无关的软件协议栈或操作系统。对接 CMISI 接口的中间件在 Drivers/CMSIS/ 文件夹中。

Projects

项目工程,可以直接使用 IDE 编译后烧录到 MCU 中。

  1. Template:允许用户在模板上快速构建应用程序,main 为一个死循环。
  2. Examples_LL:使用 LL 驱动程序,每个外设均有一个工程示例。
  3. Examples:使用 HAL 和 BSP 驱动程序,每个外设均有一个工程示例。
  4. Applications:使用中间件的例子,每个中间件均有一个工程示例。
  5. Demonstrations:出厂时带有最大数量外设和中间件的程序,用于展示产品功能和性能。

参考资料

  1. 【官网】STM32Cube
  2. 【主页】STM32CubeG0

相关文章:

  • 公司做网站让我们销售推广网站大全
  • 网站制作公司天强科技百度收录推广
  • 可画设计软件下载seo关键词优化怎么做
  • 河南省建设部网站百度免费咨询
  • 厦门网站制作建设重庆seo管理平台
  • 郑州网站建设 郑州网站制作网络营销方法有哪些?
  • 创建型设计模式——单例模式
  • C++的单例模式
  • dify动手实践课6
  • 关于 Babel 编译后的 Generator 状态机结构解析
  • 数据赋能(319)——安全与合规——数据安全可控
  • 美团小程序闪购 mtgsig1.2
  • 第三节 布局与盒模型-盒模型与box-sizing
  • 【二】19.关于LCD和LTDC
  • 从零搭建共享棋牌室物联网系统:硬件选型与避坑指南!
  • 发布 npm 包完整指南(含账号注册、发布撤销与注意事项)
  • 文件锁的艺术:深入解析 `fcntl(F_SETLK/F_GETLK)`
  • C# WinForms 日志实现与封装
  • Flink状态和容错-基础篇
  • Golang Kratos 系列:领域层model定义是自洽还是直接依赖第三方(三)
  • 帮助装修公司拓展客户资源的微信装修小程序怎么做?
  • 重点解析(软件工程)
  • MonkeyOCR在Win习题部署指南和报错提醒
  • 谷歌 Gemini 2.5 系列模型:性能、功能与应用全方位解析​
  • 深入理解RAG:大语言模型时代的知识增强架构
  • pyqt多界面