
RIOT 板级支持详解Nucleo-L552ZE-Q 与 STM32L552ZE 的 TrustZone 超低功耗开发实践【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT本指南围绕 RIOT 操作系统中的nucleo-l552ze-q板卡展开系统梳理 ST 官方 Nucleo144 开发板在 RIOT 中的硬件规格、板级支持文件结构、外设引脚配置UART/LPUART、SPI、PWM、I2C、板上 LED 与按键映射以及构建烧录流程。读完本文你将能够基于 RIOT 的板级配置体系Makefile 特性声明 periph_conf.h外设表 nucleo144 公共头文件快速定位该板的引脚资源并独立完成应用编译、烧录与串口调试。板卡概览Nucleo144 家族的一员Nucleo-L552ZE-Q 是 ST 官方 Nucleo 系列中的 144 引脚开发板核心搭载STM32L552ZE超低功耗微控制器采用ARM Cortex-M33内核并支持TrustZone安全扩展。该板在 RIOT 中被归入boards_common_nucleo144分组见 boards/common/nucleo144/doc.md意味着它复用了一整套 Nucleo144 公共板级代码——包括统一的 LED/按键定义、Arduino 引脚映射、SAUL GPIO 参数表以及公共的 Makefile 规则。从 Kconfig 的配置继承关系可以清楚看到这一层级结构boards/nucleo-l552ze-q/Kconfigconfig BOARD_NUCLEO_L552ZE_Q bool default y select BOARD_COMMON_NUCLEO144 select CPU_MODEL_STM32L552ZE即该板默认选中BOARD_COMMON_NUCLEO144公共配置并将 CPU 模型绑定为STM32L552ZE后者在 cpu/stm32/kconfigs/l5/Kconfig.models 中被定义为CPU_LINE_STM32L552XX系列的一员与 STM32L552CC/CE/QC/RE 等型号共享同一套外设与时钟框架。MCU 硬件规格下表完整列出了该板所搭载 STM32L552ZE 的关键硬件参数内容继承自板卡文档 doc.md 的 MCU 规格表项目规格MCUSTM32L552ZE内核家族ARM Cortex-M33厂商ST MicroelectronicsRAM256KiBFlash512KiB主频最高 110MHzFPU支持TrustZone支持定时器16UART63×USART、2×UART、1×LPUARTI2C4SPI3CAN1其中最具特色的是ARM Cortex-M33 TrustZone组合TrustZone 允许将 Flash/RAM/外设划分为安全区与非安全区配合 RIOT 中 stm32 CPU 层的实现开发者可以在一个固件内实现安全启动、安全存储与普通 RTOS 任务的隔离这也是 L5 系列区别于同代 L4 系列的关键卖点。此外110MHz 主频配合 256KiB RAM / 512KiB Flash足以支撑 RIOT 网络栈如gnrc、CoAP 服务或 LoRaWAN 等典型 IoT 应用场景。板级支持文件结构与构建系统集成nucleo-l552ze-q板卡目录boards/nucleo-l552ze-q非常精简共 7 个文件核心是 6 个构建/配置描述文件加 1 份文档boards/nucleo-l552ze-q/ ├── Makefile ├── Makefile.features ├── Makefile.dep ├── Makefile.include ├── Kconfig ├── doc.md └── include/ └── periph_conf.h各文件的职责与关键内容如下Makefile声明MODULE board并通过DIRS $(RIOTBOARD)/common/nucleo引入公共的 Nucleo 板级模块源码。Makefile.features声明CPU stm32、CPU_MODEL stm32l552ze并列出该板直接提供的 RIOT 外设特性periph_i2c、periph_spi、periph_pwm、periph_timer、periph_uart、periph_lpuart以及引导特性riotboot支持基于 riotboot 的 A/B 双区固件升级。随后include $(RIOTBOARD)/common/nucleo144/Makefile.features再补充 Nucleo144 家族的公共特性。Makefile.dep体现了一个重要的硬件细节——ST-Link 板载调试器虚拟串口连接到 MCU 的 LPUART1。因此当应用使用periph_uart时构建系统会强制追加FEATURES_REQUIRED periph_lpuart确保stdio通过 LPUART 输出到 ST-Link 虚拟串口。Makefile.include引入 nucleo144 公共 include 规则并手动设置烧录目录名DIR_NAME_AT_REMED NODE_L552ZE。文件注释说明该板的自动烧录目录名生成失败需按 PR #18057 的约定手动指定。这种最小化板级文件 公共代码复用的组织方式是 RIOT 板卡目录的标准设计模式硬件差异越大的板卡差异被封装得越干净。外设配置深度解析periph_conf.h板级外设的引脚复用与时钟总线配置集中在 include/periph_conf.h 中。该文件定义了多个static const外设配置表下面逐一拆解。时钟LSE 外部低速晶振#ifndef CONFIG_BOARD_HAS_LSE #define CONFIG_BOARD_HAS_LSE 1 #endif该板声明板载 32.768kHz LSE 晶振RIOT 的时钟配置逻辑clk_conf.h会据此启用低功耗 RTC/RTT 时钟源。同时文件还引用了cfg_rtt_default.h与cfg_timer_tim5.h分别提供 RTT 的默认配置基于 RTC和以 TIM5 作为ztimer后备定时器的配置。UARTLPUART1 负责调试输出USART3 对接 Arduino 排针static const uart_conf_t uart_config[] { { .dev LPUART1, .rcc_mask RCC_APB1ENR2_LPUART1EN, .rx_pin GPIO_PIN(PORT_G, 8), .tx_pin GPIO_PIN(PORT_G, 7), .rx_af GPIO_AF8, .tx_af GPIO_AF8, .bus APB12, .irqn LPUART1_IRQn, .type STM32_LPUART, .clk_src 0, /* Use APB clock */ }, { /* Connected to Arduino D0/D1 */ .dev USART3, .rcc_mask RCC_APB1ENR1_USART3EN, .rx_pin GPIO_PIN(PORT_D, 9), .tx_pin GPIO_PIN(PORT_D, 8), .rx_af GPIO_AF7, .tx_af GPIO_AF7, .bus APB1, .irqn USART3_IRQn, .type STM32_USART, .clk_src 0, /* Use APB clock */ }, };UART_0LPUART1引脚 PG8/PG7复用功能 AF8挂在 APB12 总线低功耗外设总线。这正是 ST-Link 虚拟串口的连接位置也是 RIOT 默认stdio_uart的输出通道对应中断处理函数isr_lpuart1。UART_1USART3引脚 PD9/PD8复用 AF7挂在 APB1 总线对应isr_usart3。代码注释明确标注Connected to Arduino D0/D1即通过板载 Arduino 兼容排针引出方便外接串口模块或传感器。UART_NUMOF由ARRAY_SIZE(uart_config)推导应用代码可通过UART_DEV(0)/UART_DEV(1)访问这两个串口。SPISPI1 复用为 Arduino SPI 排针static const spi_conf_t spi_config[] { { .dev SPI1, .mosi_pin GPIO_PIN(PORT_A, 7), /* Arduino D11 */ .miso_pin GPIO_PIN(PORT_A, 6), /* Arduino D12 */ .sclk_pin GPIO_PIN(PORT_A, 5), /* Arduino D13 */ .cs_pin GPIO_UNDEF, .mosi_af GPIO_AF5, .miso_af GPIO_AF5, .sclk_af GPIO_AF5, .cs_af GPIO_AF5, .rccmask RCC_APB2ENR_SPI1EN, .apbbus APB2, }, };SPI1 的 MOSI/MISO/SCLK 分别映射到 PA7/PA6/PA5与 Arduino 排针 D11/D12/D13 完全对应复用功能 AF5挂在 APB2 总线。cs_pin为GPIO_UNDEF表示片选信号不固定由 SPI 外设管理具体 CS 引脚由应用自行选择这也符合 RIOT 中 SPI 驱动如spi_dev类传感器驱动的通用用法。PWM三组定时器共 12 路输出PWM 配置由 TIM2、TIM3、TIM4 三个定时器提供每路通道都标注了对应的 Arduino/CN 排针位置定时器通道 0通道 1通道 2通道 3复用 AFTIM2PA0CN10 D32PA1CN10 A8PA2CN9 A1PA3CN9 A0AF1TIM3PB4CN7 D25PB5CN7 D22PB0CN9 A3PB1CN10 A6AF2TIM4PD12CN7 D19PB7Blue LD2PD14CN7 D10PD15CN7 D9AF2其中 TIM4 的通道 1PB7在板上同时连接蓝色 LED LD2意味着该 LED 既可作普通 GPIO 输出也可被 PWM 驱动实现呼吸灯效果。配置注释特别提醒具体引脚与通道对应关系需查阅 STM32L552ZE 数据手册的Alternate function AF0 to AF7表格Nucleo-L552ZE-Q 对应数据手册 Table 22, page 122cc_chan字段从 0 索引与手册中的 CH1 对应本结构的通道 0。I2C 与 RTTperiph_conf.h引用了公共配置头文件cfg_i2c1_pb8_pb9.h从文件名可以推断 I2C1 复用为 PB8SCL/PB9SDA——这是 Nucleo144 系列统一采用的 I2C 引脚位置RTT 则使用cfg_rtt_default.h的默认配置。这些公共配置头文件位于 stm32 CPU 目录的cfg_*系列中由 CPU 层统一维护板级只需一行 include 即可启用。板上资源三色 LED 与用户按键Nucleo144 公共头文件 boards/common/nucleo144/include/board.h 为 L552ZE 定制了 LED 引脚定义第 34-67 行#if defined(CPU_MODEL_STM32L496ZG) || defined(CPU_MODEL_STM32L4R5ZI) || \ defined(CPU_MODEL_STM32L552ZE) || defined(CPU_MODEL_STM32U575ZI) #define LED0_PIN_NUM 7 #define LED0_PORT GPIO_PORT_C /** GPIO port of LED 0 */ ... #if defined(CPU_MODEL_STM32L552ZE) #define LED2_PIN_NUM 9 #define LED2_PORT GPIO_PORT_A /** GPIO port of LED 2 */对应 Nucleo-L552ZE-Q 的实际板载资源LD1绿色PC7LED0_PINLD2蓝色PB7LED1_PINLD3红色PA9LED2_PINB1用户按键PC13BTN0_PIN模式为GPIO_IN_PD内部下拉按下时读到高电平注意 LD3 的引脚PA9针对 L552ZE 做了专门的条件编译分支说明 L5 板卡的红色 LED 位置与 L4 系列不同这是移植代码时容易踩坑的点。与此同时boards/common/nucleo144/include/gpio_params.h 将上述资源注册进 RIOT 的SAUL外设抽象层第 29-51 行LD1(green)、LD2(blue)、LD3(red)以GPIO_OUT模式注册B1(User button)以BTN0_MODE注册。启用saul_gpio模块后即可通过saulshell 命令直接读写这些 GPIO无需编写驱动代码。构建、烧录与串口调试该板在 RIOT 中的板卡名称为nucleo-l552ze-q所有make命令通过BOARD变量指定。以自带的 hello-world 示例为例在 examples/hello-world 目录下执行make BOARDnucleo-l552ze-q flash termflash目标使用板载ST-Link调试器烧录固件stm32 CPU 的烧录工具链默认支持 ST-Link。term目标打开终端连接 ST-Link 虚拟串口如前文所述该串口物理上连接 MCU 的LPUART1因此烧录后通过 USB 即可直接看到stdio输出无需额外接线。由于板卡特性声明了riotboot还可以用make BOARDnucleo-l552ze-q riotboot/flash进行基于 riotboot 的固件更新支持 A/B 分区与回滚。此外烧录目录名被手动固定为NODE_L552ZE见 Makefile.include该名称用于 flash 后通过串口触发自动烧录的目录匹配通常无需用户干预。一个最小可运行示例main.c如下#include stdio.h #include board.h #include periph/gpio.h int main(void) { puts(Nucleo-L552ZE-Q up and running!); /* 点亮板载蓝色 LED LD2 (PB7) */ gpio_init(LED1_PIN, GPIO_OUT); gpio_set(LED1_PIN); return 0; }搭配Makefile中的USEMODULE periph_gpio即可验证板卡基础功能。小结nucleo-l552ze-q是 RIOT 中对 Cortex-M33 TrustZone 超低功耗平台的良好示例板级目录只保留差异化的特性声明与外设引脚表Makefile.features、periph_conf.h其余 LED/按键/SAUL 定义全部复用 nucleo144 公共头文件。实际开发时重点关注三件事即可上手以 LPUART1 作为调试串口ST-Link 直连、以 SPI1/USART3/TIM2/3/4 的 Arduino 排针映射外接模块、以saul_gpio直接操作 LD1-LD3 与 B1 按键。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考