- 嵌入式
- 固件
- 驱动开发
- 硬件开发
【免费下载链接】Arduino_Core_STM32
STM32 core support for Arduino
导读:本文围绕 Arduino_Core_STM32 仓库中随附的 STM32CubeWB0 HAL 驱动组件(
system/Drivers/STM32WB0x_HAL_Driver),系统讲解其在 STM32Cube 生态中的定位、HAL/LL 双层驱动架构、针对 STM32WB05/WB06/WB07/WB09 无线 MCU 的 RADIO/RADIO_TIMER 专属驱动,以及 HAL 配置文件(stm32wb0x_hal_conf.h)的裁剪方法,并说明该驱动组件在 STM32duino 核心中如何与变体(variant)和板级定义联动。读者读完可掌握 STM32WB0x 系列 HAL 驱动的模块划分、版本管理、配置裁剪和与 Arduino 构建系统对接的完整知识链。
一、STM32Cube 与 MCU Component 定位
STM32Cube是意法半导体(STMicroelectronics)发起的软件生态计划,目标是降低开发者的开发工作量、时间与成本。STM32Cube 覆盖了整个 STM32 产品组合,其嵌入式软件平台为每个 STM32 系列提供:
- CMSIS 模块(Core 与 Device):对应 STM32 产品中实现的 ARM 内核;
- STM32 HAL-LL 驱动:抽象层,提供一组 API,保证在整个 STM32 产品组合中实现最大化的可移植性;
- BSP 驱动:为各系列提供的 Evaluation、Discovery、Nucleo 开发板板级支持;
- 中间件库:如 STM32 BLE、FreeRTOS、FatFs 等;
- 软件项目:每个开发板配套的示例、应用与演示工程,并提供 EWARM、MDK-ARM、STM32CubeIDE 三种工具链版本。
STM32Cube 嵌入式软件采用两种发布模型:
- 整体式 MCU Package(monolithic):一个系列的全部 STM32Cube 软件模块(Drivers、Middleware、Projects、Utilities)集中在同一仓库中,通常命名为STM32Cubexx(xx 为系列名);
- MCU Component:MCU Package 中的每个模块作为独立仓库单独交付,允许用户只选取需要的软件功能。
本文讨论的stm32wb0x_hal_driver即属于第二种模型——它是 STM32CubeWB0 软件包中提供HAL-LL Drivers部分的一个独立组件。该组件在本仓库中位于 system/Drivers/STM32WB0x_HAL_Driver,随 Arduino_Core_STM32 核心一起分发,与 STM32WB0x 系列的系统文件(system/STM32WB0x)配套使用。
二、组件内容:HAL/LL 驱动双层架构
从源码结构看,该组件由Inc/(头文件)与Src/(实现)两个目录组成,遵循 STM32 HAL 库的经典组织方式。组件根目录还包含 README.md、Release_Notes.html、LICENSE.md 与 SW_Security_Level.md。
2.1 HAL 驱动清单
组件提供的 HAL 驱动头文件与实现位于Inc/stm32wb0x_hal_*.h与Src/stm32wb0x_hal_*.c,覆盖外设包括:
| 模块 | 头文件 | 说明 |
|---|---|---|
| 通用 HAL | stm32wb0x_hal.h/stm32wb0x_hal.c | HAL 基础模块,定义版本号、Tick 频率、SYSCFG 常量 |
| ADC | stm32wb0x_hal_adc.h/.c | 模数转换器 |
| CORTEX | stm32wb0x_hal_cortex.h/.c | 内核控制(NVIC、Systick 等) |
| CRC | stm32wb0x_hal_crc.h/.c+_ex | 循环冗余校验 |
| DMA | stm32wb0x_hal_dma.h/.c | 直接内存访问 |
| FLASH | stm32wb0x_hal_flash.h/.c+_ex | 片上 Flash 编程 |
| GPIO | stm32wb0x_hal_gpio.h/.c+_ex | 通用输入输出 |
| I2C | stm32wb0x_hal_i2c.h/.c+_ex | I²C 总线 |
| I2S | stm32wb0x_hal_i2s.h/.c | 音频接口 |
| IRDA | stm32wb0x_hal_irda.h/.c+_ex | 红外通信 |
| IWDG | stm32wb0x_hal_iwdg.h/.c | 独立看门狗 |
| PKA | stm32wb0x_hal_pka.h/.c | 公钥加速器(加密) |
| PWR | stm32wb0x_hal_pwr.h/.c+_ex | 电源管理 |
| RADIO | stm32wb0x_hal_radio.h/.c | 无线射频(WB 系列特有) |
| RADIO_TIMER | stm32wb0x_hal_radio_timer.h/.c | 射频定时器(WB 系列特有) |
| RCC | stm32wb0x_hal_rcc.h/.c+_ex | 时钟复位控制 |
| RNG | stm32wb0x_hal_rng.h/.c | 硬件随机数生成器 |
| RTC | stm32wb0x_hal_rtc.h/.c+_ex | 实时时钟 |
| SMARTCARD | stm32wb0x_hal_smartcard.h/.c+_ex | 智能卡接口 |
| SMBUS | stm32wb0x_hal_smbus.h/.c+_ex | 系统管理总线 |
| SPI | stm32wb0x_hal_spi.h/.c+_ex | 串行外设接口 |
| TIM | stm32wb0x_hal_tim.h/.c+_ex | 通用定时器 |
| UART | stm32wb0x_hal_uart.h/.c+_ex | 通用异步收发 |
| USART | stm32wb0x_hal_usart.h/.c+_ex | 通用同步/异步收发 |
2.2 LL 驱动清单
Low Layer(LL)驱动提供面向寄存器的一击式(one-shot)服务,与 HAL 不同,LL 驱动不完全跨 STM32 系列可移植——某些函数的可用性取决于该产品是否物理具备相应外设。LL 头文件以stm32wb0x_ll_*.h命名,覆盖 ADC、CRC、DMA、GPIO、I2C、LPUART、PKA、PWR、RCC、RNG、RTC、SPI、TIM、USART、UTILS 以及 SYSTEM、DMAMUX、CORTEX、BUS、IWDG、RADIO、RADIO_TIMER 等。
根据组件内 Release_Notes.html 中 V1.0.0 的说明,LL 驱动设计目标为:
- 提供用于直接、原子寄存器访问的内联函数集;
- 提供可被 HAL 驱动或应用层使用的一击式操作;
- 可完全独立于 HAL单独使用(standalone);
- 覆盖所有受支持外设的完整功能。
2.3 通用 HAL 模块的版本与常量
stm32wb0x_hal.h是 HAL 的入口头文件,通过#include "stm32wb0x_hal_conf.h"和#include "stm32wb0x_ll_system.h"串联起配置与底层。其关键内容包括:
HAL 版本号宏(stm32wb0x_hal.h):
#define __STM32WB0x_HAL_VERSION_MAIN (0x01U) /*!< [31:24] main version */ #define __STM32WB0x_HAL_VERSION_SUB1 (0x05U) /*!< [23:16] sub1 version */ #define __STM32WB0x_HAL_VERSION_SUB2 (0x00U) /*!< [15:8] sub2 version */ #define __STM32WB0x_HAL_VERSION_RC (0x00U) /*!< [7:0] release candidate */Tick 频率枚举(HAL_TickFreqTypeDef):HAL_TICK_FREQ_10HZ(100)、HAL_TICK_FREQ_100HZ(10)、HAL_TICK_FREQ_1KHZ(1),默认HAL_TICK_FREQ_DEFAULT = HAL_TICK_FREQ_1KHZ。
SYSCFG 启动模式:SYSCFG_BOOT_MAINFLASH(Main Flash 映射到 0x00000000)与SYSCFG_BOOT_SRAM(SRAM1 映射到 0x00000000)。
Fast-mode Plus 引脚宏:例如SYSCFG_FASTMODEPLUS_PA0、SYSCFG_FASTMODEPLUS_PB6/PB7(后者受I2C1/I2C2及STM32WB09/STM32WB05定义约束)。
三、RADIO 与 RADIO_TIMER:WB 系列专属驱动
STM32WB0x 是无线 SoC 系列,因此该组件中HAL RADIO与HAL RADIO_TIMER是区别于普通外设 HAL 的核心模块,这是将本组件与 F/G/L 等系列 HAL 区分开的关键特征。
3.1 RADIO 句柄与 ActionPacket 机制
stm32wb0x_hal_radio.h 定义句柄RADIO_HandleTypeDef:
typedef struct { BLUE_TypeDef *Instance; /*!< Register base address */ } RADIO_HandleTypeDef;在USE_RADIO_PROPRIETARY_DRIVER宏开启时(默认1U),驱动暴露基于ActionPacket的专有射频协议能力。ActionPacket结构体包含状态机号(StateMachineNo,0–7)、动作标签(ActionTag,包括PLL_TRIG、TXRX、TIMER_WAKEUP、WHITENING_DISABLE、INC_CHAN、TIMESTAMP_POSITION、RELATIVE)、接收长度上限、唤醒时间、数据指针、状态寄存器、接收时间戳、RSSI 等字段,并通过next_true/next_false与用户回调condRoutine()、dataRoutine()构建射频动作的决策链。其约束是condRoutine为时间关键回调,必须在45 µs内返回。
RADIO 模块还提供完整的收发 API,例如:
uint8_t HAL_RADIO_SendPacket(uint8_t channel, uint32_t wakeup_time, uint8_t *txBuffer, uint8_t (*Callback)(ActionPacket *, ActionPacket *)); uint8_t HAL_RADIO_ReceivePacket(uint8_t channel, uint32_t wakeup_time, uint8_t *rxBuffer, uint32_t receive_timeout, uint8_t receive_length, uint8_t (*Callback)(ActionPacket *, ActionPacket *));以及HAL_RADIO_SendPacketWithAck、HAL_RADIO_ReceivePacketWithAck、HAL_RADIO_SetTxPower、HAL_RADIO_ReadRSSI、HAL_RADIO_SetChannel、HAL_RADIO_CarrierSense、加密设置(HAL_RADIO_SetEncryptionAttributes、HAL_RADIO_EncryptPlainData)等。中断入口包括HAL_RADIO_TXRX_IRQHandler、HAL_RADIO_RRM_IRQHandler、HAL_RADIO_TXRX_SEQ_IRQHandler,对应的回调有HAL_RADIO_TxRxCallback、HAL_RADIO_RRMCallback、HAL_RADIO_TxRxSeqCallback。RADIO 驱动也提供 MSP 钩子HAL_RADIO_MspInit/HAL_RADIO_MspDeInit,供用户完成底层初始化。
3.2 RADIO_TIMER:射频活动调度
stm32wb0x_hal_radio_timer负责射频活动的时间调度。从 Release_Notes.html 的更新历史可以看出该模块的演进重点:
- V1.4.0(2025-10-29):优化
HAL_RADIO_TIMER_SetRadioTimerValue函数性能; - V1.3.0(2025-06-04):修复
HAL_RADIO_TIMER_SetRadioCloseTimeout()在 LSE 高抖动时可能发生的问题; - V1.2.0(2025-02-05):提升射频活动调度的性能;
- V1.5.0(2026-06-05):消除 STM32CubeIDE 中
-Wall选项下的告警。
这提示在使用该模块时应特别关注 LSE 时钟质量对射频定时器精度的影响。
四、HAL 配置文件:模块裁剪与时钟参数
4.1 配置链:从 Arduino 构建到 HAL 配置
在 Arduino_Core_STM32 中,STM32WB0x 系列的系统配置入口是 system/STM32WB0x/stm32wb0x_hal_conf.h,其加载逻辑为:
#include "variant.h" #if __has_include("hal_conf_custom.h") #include "hal_conf_custom.h" #else #if __has_include("hal_conf_extra.h") #include "hal_conf_extra.h" #endif #include "stm32wb0x_hal_conf_default.h" #endif即:优先加载用户自定义的hal_conf_custom.h;否则加载hal_conf_extra.h(若存在)后再叠加 system/STM32WB0x/stm32wb0x_hal_conf_default.h 提供的默认配置。该默认配置又通过#include "stm32yyxx_hal_conf.h"挂接到system/Drivers/STM32WB0x_HAL_Driver/Inc/stm32wb0x_hal_conf_template.h对应的模块定义。
4.2 关键配置项说明
stm32wb0x_hal_conf_template.h(位于 Inc/stm32wb0x_hal_conf_template.h)定义了以下核心宏,所有宏均以#if !defined保护,便于用户覆盖:
振荡器参数:
| 宏 | 默认值 | 说明 |
|---|---|---|
HSE_VALUE | 32000000UL(32 MHz) | 外部高速振荡器频率,RCC 据此计算系统频率 |
HSE_STARTUP_TIMEOUT | 100ULms | HSE 启动超时 |
HSI_VALUE | 64000000UL(64 MHz) | 内部高速振荡器频率 |
LSI_VALUE | 32000UL(32 kHz) | 内部低速振荡器,实际值随电压/温度漂移 |
LSE_VALUE | 32768UL(32.768 kHz) | 外部低速振荡器,供 UART、RTC 使用 |
RC64MPLL_VALUE | 64000000UL(64 MHz) | 复位后的 RC64M_PLL 默认值 |
LSE_STARTUP_TIMEOUT | 5000ULms | LSE 启动超时 |
LSE_DRIVE_LEVEL | RCC_LSEDRIVE_MEDIUMLOW | LSE 驱动等级 |
系统配置:VDD_VALUE(3300 mV)、TICK_INT_PRIORITY(默认最低优先级(1UL<<__NVIC_PRIO_BITS) - 1UL)、USE_RTOS(默认0U)。
断言开关:默认不开启USE_FULL_ASSERT;开启后assert_param(expr)在表达式为假时调用assert_failed()报告源文件与行号。
外设相关:USE_SPI_CRC(默认1U,激活 SPI 驱动的 CRC 特性)。
无线专用配置:
CFG_HW_RCC_HSE_CAPACITOR_TUNE(默认32):HSE 电容调谐值;CFG_NUM_RADIO_TASKS(默认1):同时射频任务数。射频控制器理论上支持最多128个同时射频任务,实际可用上限取决于可用 RAM;USE_RADIO_PROPRIETARY_DRIVER(默认1U):使用 BLE 协议栈时应置0,置1则使用带 ActionPacket 的专有射频协议。
模块使能宏:HAL_ADC_MODULE_ENABLED、HAL_RADIO_MODULE_ENABLED、HAL_RADIO_TIMER_MODULE_ENABLED、HAL_RCC_MODULE_ENABLED等 24 个模块开关(含通用HAL_MODULE_ENABLED),头文件底部据此条件性地#include各外设头文件。开发者可以通过裁剪这些宏来减小固件体积。
4.3 HAL 用户回调开关
模板中还定义了一组USE_HAL_xxx_REGISTER_CALLBACKS(默认0u),覆盖 ADC、I2C、IRDA、PKA、RNG、RTC、SMARTCARD、SMBUS、SPI、TIM、UART、USART 等模块。置1u时允许用户在运行时注册 HAL 回调,例如HAL_UART_RegisterCallback。
五、支持设备与板卡
根据 Release_Notes.html 中每版一致的说明,该驱动组件支持的器件为STM32WB05、STM32WB06、STM32WB07、STM32WB09;对应官方板卡为NUCLEO-WB09KE、NUCLEO-WB07CC、NUCLEO-WB05KZ。
在 Arduino_Core_STM32 中,这些能力通过 boards.txt 与变体目录落地:
Nucleo_64.menu.pnum.NUCLEO_WB09KE.build.series=STM32WB0x、build.product_line=STM32WB09、build.variant=STM32WB0x/WB05KZV_WB05TZF_WB09KEV_WB09TEF,上传区起点upload.address=0x10040000,upload.mode=hwRstPulse(见 boards.txt);GenWB0组提供 4 个通用板(Generic WB05KZVx / WB05TZFx / WB09KEVx / WB09TEFx),其定义记录在 variants/STM32WB0x/WB05KZV_WB05TZF_WB09KEV_WB09TEF/boards_entry.txt:例如GENERIC_WB09KEVX.upload.maximum_size=524288、GENERIC_WB05KZVX.upload.maximum_size=196608,并指定了对应的 SVD 调试文件。
变体目录 variants/STM32WB0x 下存在 4 套变体(WB05KZV_WB05TZF_WB09KEV_WB09TEF、WB06CCF_WB07CCF、WB06CCV_WB07CCV、WB06KCV_WB07KCV),每套包含PeripheralPins.c、PinNamesVar.h、variant_generic.h/.cpp、generic_clock.c与ldscript.ld,其中PeripheralPins.c由对应器件的 XML 描述自动生成(如STM32WB05KZVx.xml、STM32WB09KEVx.xml)。以 WB05/WB09 变体为例,variant_generic.h 定义了 20 个数字引脚、4 个模拟输入(PIN_A0–PIN_A3),以及 SPI/I2C/串口的默认引脚映射(如PIN_SPI_MOSI=PA11、PIN_SPI_MISO=PA8),供 Arduino 草图直接使用。
六、版本管理与兼容性
该组件当前的 HAL 版本宏为V1.5.0(__STM32WB0x_HAL_VERSION_SUB1 = 0x05U),与 README 徽标tag-v1.5.0一致。发布历史(源自 Release_Notes.html):
| 版本 | 日期 | 要点 |
|---|---|---|
| V1.0.0 | 2024-06-05 | 首发,HAL/LL 覆盖全部外设(HAL 含 ADC、RADIO、RADIO_TIMER 等;LL 含 LPUART、UTILS 等) |
| V1.1.0 | 2024-10-30 | FLASH 增加LL_FLASH_FLAG定义;LL RNG 支持 WB09 中断应答 |
| V1.2.0 | 2025-02-05 | RADIO_TIMER 调度性能提升;HAL SPI 去除未对齐访问、增加 const 限定(MISRA 8.13);UART DMA 接收中止修复 |
| V1.3.0 | 2025-06-04 | RCC 增加RCC_LPUART1_CLKSOURCE_16M;修复 RADIO_TIMER 关闭超时在 LSE 高抖动下的问题 |
| V1.4.0 | 2025-10-29 | 优化HAL_RADIO_TIMER_SetRadioTimerValue;RADIO 增加 RRM 中断相关函数;LPUART/UART 轮询模式传输计数下溢修复 |
| V1.5.0 | 2026-06-05 | 消除 FLASH、GPIO(GPIO_GET_INDEX宏返回类型)、RADIO_TIMER 的-Wall告警;LL ADC 断言宏调整 |
README 同时强调版本一致性是至关重要的:CMSIS Core、CMSIS Device 与 HAL 三者的版本必须配套使用(即 STM32CubeWB0 整体软件包版本协调),否则可能引入不兼容行为。同时按 STM32Cube 惯例,用户可自行参考官方发布的 Release_Notes 获取各版本的详细变更说明。
从组件根目录的 SW_Security_Level.md 可以看到,该驱动在 STM32Trust 软件安全分级中被归类为Medium(中)安全等级。该文件同时给出通用安全提示:任何安全认证与内置安全措施都不能绝对保证产品抵抗所有形式的攻击,集成方需要结合自身产品形态评估风险。
七、在 STM32duino 中的集成方式
作为 Arduino_Core_STM32 的子系统,该 HAL 组件被 STM32WB0x 系列构建流程直接引用:
- 构建入口:
boards.txt中GenWB0/Nucleo_64的 WB0 板卡项指向build.series=STM32WB0x; - 系统文件:system/STM32WB0x/stm32wb0x_hal_conf.h 与
stm32wb0x_hal_conf_default.h决定编译期加载哪些 HAL 模块;核心层的 cores/arduino/stm32/stm32_def_build.h 中可见对 WB0x 的构建宏分支; - HAL/LL 源码:
Src/目录下 40 余个驱动实现文件参与链接; - 变体映射:variants/STM32WB0x 下的
PeripheralPins.c与variant_generic.h将引脚编号、外设复用映射到 Arduino API 层; - 链接脚本:各变体目录的
ldscript.ld定义 WB0x 的 Flash/RAM 布局(与upload.address=0x10040000等上传参数配合)。
由于本仓库以 Arduino 核心为交付形态,该 HAL 组件通常无需用户手工配置stm32wb0x_hal_conf.h;如需精细裁剪模块或调整振荡器参数,可通过hal_conf_extra.h/hal_conf_custom.h机制覆盖默认值,这也是 STM32duino 社区推荐的自定义方式(可参考 docs/customization/HAL-configuration.md 了解 HAL 配置的完整说明)。
八、小结
stm32wb0x_hal_driver是 STM32CubeWB0 固件包中面向 STM32WB0x 无线系列的核心 HAL/LL 驱动组件。它既沿用了 STM32 HAL 库"配置宏裁剪 + 模块化 API + MSP 钩子"的经典架构,又通过 RADIO 的 ActionPacket 机制与 RADIO_TIMER 的射频调度 API 体现了无线 SoC 特有的软件栈设计。在 Arduino_Core_STM32 中,它以 system/Drivers/STM32WB0x_HAL_Driver 为源码本体、以 system/STM32WB0x/stm32wb0x_hal_conf.h 为配置入口、以 variants/STM32WB0x 为板级适配层,三层协同支撑起 STM32WB05/WB06/WB07/WB09 的 Arduino 开发体验。理解其版本管理原则(CMSIS 与 HAL 配套一致)、配置裁剪要点(振荡器参数、模块使能、射频开关)以及专属射频 API,是在 STM32WB0x 上开展 BLE 与专有射频应用开发的基础。
- 嵌入式
- 固件
- 驱动开发
- 硬件开发
【免费下载链接】Arduino_Core_STM32
STM32 core support for Arduino
相关推荐
STM32CubeF4 HAL 驱动库解析:STM32F4 系列 HAL-LL 驱动的架构、配置与 Arduino Core 集成
STM32CubeF4 HAL 驱动库解析:STM32F4 系列 HAL LL 驱动的架构、配置与 Arduino Core 集成 导读 本文围绕 Arduin
嵌入式固件驱动开发硬件开发INAV 中的 STM32CubeF7 HAL 驱动组件:HAL-LL 抽象层解析与飞控集成实践
INAV 中的 STM32CubeF7 HAL 驱动组件:HAL LL 抽象层解析与飞控集成实践 本文以 INAV 仓库内嵌的 STM32F7xx_HAL_Dr
无人机嵌入式智能硬件STM32H5xx HAL-LL 驱动组件详解:STM32CubeH5 HAL Driver 的架构、配置与版本演进
STM32H5xx HAL LL 驱动组件详解:STM32CubeH5 HAL Driver 的架构、配置与版本演进 导读 本文围绕 Arduino_Core_
嵌入式固件驱动开发硬件开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考