尧图精选

RIOT 板级支持详解:STM32 Nucleo-F412ZG(nucleo-f412zg)移植与开发指南

🕒 发布时间:2026/9/18 23:27:18 📁 来源:尧图网络
RIOT 板级支持详解STM32 Nucleo-F412ZGnucleo-f412zg移植与开发指南【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT导读本文围绕 RIOT 操作系统对STM32 Nucleo-F412ZG开发板的板级支持Board Support Package展开完整介绍该板在 RIOT 中的识别信息、MCU 外设规格、periph_conf.h中的引脚与时钟配置、构建系统集成方式以及基于 OpenOCD / ST-Link MSD / stm32flash 的烧录流程和 ST-Link VCP 串口 Shell 接入方法。读完本文你将能够在nucleo-f412zg目标上从零编译并烧录 RIOT 应用并清楚了解板级配置文件中每个外设项的含义与修改方法。板卡概览Nucleo 家族中的 Cortex-M4 高配成员nucleo-f412zg是 RIOT 对 ST 公司 Nucleo-144 系列开发板STM32 Nucleo-F412ZG的官方板级支持目标。在 RIOT 源码树中该板的完整支持位于 boards/nucleo-f412zg/它通过ingroup boards_common_nucleo144与所有 Nucleo-144 板共享公共配置公共部分见 boards/common/nucleo144/包括Makefile.include、Makefile.features以及board.h、arduino_iomap.h、gpio_params.h等公共头文件。核心板卡信息如下表所示MCU 项参数MCU 型号STM32F412ZG内核架构ARM Cortex-M4F带 FPU厂商STMicroelectronicsRAM256 KiBFlash1 MiB最高主频100 MHzFPU支持定时器17 个2×看门狗、1×SysTick、2×32 位、12×16 位ADC1× 12 位最多 16 通道UART4 个USARTI2C4 个SPI5 个CAN2 个RTC1 个数据手册STM32F412ZG Datasheetst.com 资源参考手册RM0402STM32F412 高级 ARM 32 位 MCU 参考手册编程手册PM0214STM32 Cortex-M4 MCU/MPU 编程手册板卡手册UM1974 / DM00244518STM32 Nucleo-144 板用户手册注原文档中的 Datasheet、Reference Manual、Programming Manual 与 Board Manual 均为 ST 官方公开文档读者可在 st.com 按上述编号检索获取。RIOT 文档本身通过 Doxygendefgroup boards_nucleo-f412zg将该板归入boards_common_nucleo144分组便于在 API 文档中统一索引。在 RIOT 中板卡名即为nucleo-f412zg后续所有make命令均通过BOARDnucleo-f412zg指定该目标。MCU 与板级功能从 Makefile 看板卡能力声明RIOT 的板级支持由一组Makefile.*文件声明nucleo-f412zg通过这些文件宣告它提供了哪些外设与特性。外设特性声明Makefile.featuresboards/nucleo-f412zg/Makefile.features 首先固定 CPU 型号再按字母序声明该板提供的外设特性CPU stm32 CPU_MODEL stm32f412zg # Put defined MCU peripherals here (in alphabetical order) FEATURES_PROVIDED periph_adc FEATURES_PROVIDED periph_dma FEATURES_PROVIDED periph_i2c FEATURES_PROVIDED periph_pwm FEATURES_PROVIDED periph_rtc FEATURES_PROVIDED periph_spi FEATURES_PROVIDED periph_timer FEATURES_PROVIDED periph_uart FEATURES_PROVIDED periph_usbdev # Put other features for this board (in alphabetical order) FEATURES_PROVIDED tinyusb_device # load the common Makefile.features for Nucleo-144 boards include $(RIOTBOARD)/common/nucleo144/Makefile.features这些FEATURES_PROVIDED条目意味着在编译任意应用时RIOT 的依赖解析机制见 makefiles/features_check.inc.mk会认可该板已自带periph_adc、periph_dma、periph_i2c、periph_pwm、periph_rtc、periph_spi、periph_timer、periph_uart、periph_usbdev以及tinyusb_device等能力应用代码无需再额外声明即可直接使用这些外设 API。值得注意的是板卡虽然支持tinyusb_deviceUSB 设备栈但 ST-Link 的 VCP虚拟串口由板载调试器独立提供二者互不干扰。末尾的 include 将公共的 Nucleo-144 特性声明并入构建具体可查看 boards/common/nucleo144/Makefile.features。构建目录与依赖Makefile / Makefile.dep / Makefile.includeboards/nucleo-f412zg/Makefile将板卡模块目录指向$(RIOTBOARD)/common/nucleo即复用 Nucleo 系列公共的板级 C 源码。boards/nucleo-f412zg/Makefile.dep包含$(RIOTBOARD)/common/nucleo/Makefile.dep拉入公共依赖如 GPIO、时钟等基础模块。boards/nucleo-f412zg/Makefile.include包含$(RIOTBOARD)/common/nucleo144/Makefile.include负责将 ST-Link、OpenOCD 等烧录/调试工具链参数引入构建环境。Kconfig 集成boards/nucleo-f412zg/Kconfig 将该板接入 RIOT 的 Kconfig 配置体系config BOARD default nucleo-f412zg if BOARD_NUCLEO_F412ZG config BOARD_NUCLEO_F412ZG bool default y select BOARD_COMMON_NUCLEO144 select CPU_MODEL_STM32F412ZG source $(RIOTBOARD)/common/nucleo144/Kconfig当选择该板时会自动选中BOARD_COMMON_NUCLEO144与CPU_MODEL_STM32F412ZG从而在 Kconfig 层面锁定 CPU 型号并继承 Nucleo-144 公共配置项如时钟树、电源配置等保证与 Makefile 体系的行为一致。引脚与外设映射periph_conf.h 深度解析板级外设的具体引脚映射定义在 boards/nucleo-f412zg/include/periph_conf.h 中这是将物理引脚与 RIOT 外设抽象UART/SPI/PWM/ADC/DMA对接的核心文件。下面逐项解析。时钟源与公共配置文件开头声明该板同时提供 LSE 与 HSE 晶振并引入 STM32 公共时钟配置与复用配置头#ifndef CONFIG_BOARD_HAS_LSE #define CONFIG_BOARD_HAS_LSE 1 #endif #ifndef CONFIG_BOARD_HAS_HSE #define CONFIG_BOARD_HAS_HSE 1 #endif #include periph_cpu.h #include clk_conf.h #include cfg_i2c1_pb8_pb9.h #include cfg_timer_tim5.h #include cfg_usb_otg_fs.hcfg_i2c1_pb8_pb9.hI2C1 复用到 PB8/PB9这是 Nucleo 板上 Arduino 兼容接头常用的 I2C 引脚。cfg_timer_tim5.h选用 TIM5 作为系统高精度定时器ztimer的时钟源。cfg_usb_otg_fs.h配置 USB OTG FS 外设与FEATURES_PROVIDED periph_usbdev/tinyusb_device呼应。UART 配置含 ST-Link VCP 串口uart_config[]定义了 3 个可用 UART 实例均未绑定 DMADMA_STREAM_UNDEF/UINT8_MAX实例外设RX 引脚TX 引脚总线中断UART_0USART3PD9PD8APB1USART3_IRQnUART_1USART6PG9PG14APB2USART6_IRQnUART_2USART2PD6PD5APB2USART2_IRQn对应的中断处理函数绑定为isr_usart3、isr_usart6、isr_usart2。其中USART3UART_0正是 Nucleo-144 板上 ST-Link VCP 的连接口RIOT 默认的stdio即经由它输出。因此通过 USB 连接板子后在宿主机打开对应串口115200、8N1即可看到 RIOT Shell 提示符详见下文访问 RIOT Shell一节。PWM 配置pwm_config[]提供两个 PWM 设备引脚均标注了 Nucleo 丝印D3/D5/D6/D9方便对照板面使用设备通道映射AF总线TIM1PE9→cc0D6、PE11→cc1D5、PE13→cc2D3GPIO_AF1APB2TIM4PD15→cc3D9GPIO_AF2APB1未使用的通道统一填GPIO_UNDEF避免误初始化。SPI 配置提供 1 个 SPI 设备SPI1同时支持 DMA 传输static const spi_conf_t spi_config[] { { .dev SPI1, .mosi_pin GPIO_PIN(PORT_A, 7), .miso_pin GPIO_PIN(PORT_A, 6), .sclk_pin GPIO_PIN(PORT_A, 5), .cs_pin GPIO_PIN(PORT_A, 4), .mosi_af GPIO_AF5, .miso_af GPIO_AF5, .sclk_af GPIO_AF5, .cs_af GPIO_AF5, .rccmask RCC_APB2ENR_SPI1EN, .apbbus APB2, #ifdef MODULE_PERIPH_DMA .tx_dma 0, .tx_dma_chan 3, .rx_dma 1, .rx_dma_chan 3, #endif } };PA4~PA7 对应 Nucleo 板 Arduino 接头的 D10/D12/D11/D13CS/MISO/MOSI/SCLK可直接对接标准 SPI 模块。ADC 配置ADC 只配置了 6 个模拟输入通道 1 个内部 VBAT 通道对应 Arduino 接头 A0~A5引脚ADC 线号PA33A0PC010A1PC313A2PC111A3PC414A4PC515A5内部VBAT18VBAT_ADC被定义为ADC_LINE(6)应用可通过adc_sample(VBAT_ADC, ...)读取电池电压。源文件注释明确说明此处并未按 STM32F412ZG 的全部通道顺序逐一配置而是仅覆盖 Nucleo Arduino 头 A0~A5 与 VBAT避免不必要的配置膨胀。DMA 配置DMA 用于 SPI1 的收发使用 DMA2 的两个 Streamstatic const dma_conf_t dma_config[] { { .stream 11 }, /* DMA2 Stream 3 - SPI1_TX */ { .stream 10 }, /* DMA2 Stream 2 - SPI1_RX */ }; #define DMA_0_ISR isr_dma2_stream3 #define DMA_1_ISR isr_dma2_stream2 #define DMA_NUMOF ARRAY_SIZE(dma_config)当应用启用periph_dma后SPI1 的收发将自动走 DMA 通道降低 CPU 负载。编译一个应用从 hello-world 开始以 RIOT 自带的 hello-world 示例为例在仓库根目录执行make BOARDnucleo-f412zg -C examples/basic/hello-world该命令会依据CPU_MODEL stm32f412zg引入 cpu/stm32/ 下的 STM32 公共实现并生成可烧录的.elf、.hex与.bin文件。你可以随后用make BOARDnucleo-f412zg -C examples/basic/hello-world term连接串口查看输出。提示Nucleo-144 公共头文件位于 boards/common/nucleo144/include/board.hLED、按键等板载器件定义Arduino 引脚映射见同目录的 arduino_iomap.h需要将外设映射到 Arduino 引脚编号时可参考它们。烧录与调试三种方式详解Nucleo-144 板载 ST-Link 调试器RIOT 官方对 STM32 板的烧录指引见 doc/guides/board_specific/stm32.md。针对nucleo-f412zg有以下三种烧录路径。方式一OpenOCD默认推荐Nucleo32/64/144 均板载 ST-LINK 编程器可直接用 OpenOCD 烧录且 OpenOCD 是 Nucleo 板的默认PROGRAMMER无需额外设置环境变量。至少需要 OpenOCD 0.11.0make BOARDnucleo-f412zg flash -C examples/basic/hello-world如果你的环境未将 OpenOCD 设为默认可显式指定make BOARDnucleo-f412zg PROGRAMMERopenocd flash注意事项摘自官方 STM32 烧录指南Nucleo 板出厂时 ST-Link 固件可能很旧若烧录失败建议先升级 ST-Link 固件使用 STM32CubeProgrammer 或官方升级工具 STSW-LINK007。OpenOCD 版本过旧时不支持新的 ST-Link V3可能出现Error: libusb_open() failed with LIBUSB_ERROR_ACCESS之类的错误新发布芯片也可能暂未被最新 OpenOCD 支持例如早期 OpenOCD 无法识别 STM32C0/G0/G4/L4/L5 等系列。方式二ST-Link 大容量存储设备cpy2remedNucleo 板插入 USB 后ST-Link 会同时枚举为一个 U 盘Mass Storage Device。将 HEX 文件复制进该盘即可触发 ST-Link 自动烧录。RIOT 提供了cpy2remedcopy to removable media脚本封装此流程make BOARDnucleo-f412zg PROGRAMMERcpy2remed flash注意此方式在 WSL 下不便使用——标准 WSL 内核不支持大容量存储设备且无法同时通过 usbipd 访问 VCP。方式三stm32flash串口引导加载stm32flash通过 STM32 片内 ROM 引导加载器经串口烧录需要将 RST 引脚接 DTR、BOOT0 接 RTS。RIOT 提供STM32FLASH_RESET与STM32FLASH_RESET_INVERT两个变量控制复位时序make BOARDnucleo-f412zg PROGRAMMERstm32flash STM32FLASH_RESET1 flashSTM32FLASH_RESET1先拉高 BOOT0 复位进入引导加载器烧录完成后再次复位BOOT0 拉低进入应用。STM32FLASH_RESET_INVERT默认1表示假定 TTL 适配器的 RTS/DTR 信号为反相若你的适配器为非反相则设为0。访问 RIOT ShellST-Link VCP 串口Nucleo-144 公共文档 boards/common/nucleo144/doc.md 明确说明默认的 RIOT Shell 通过 ST-Link VCP虚拟串口访问。不同 Nucleo 型号使用的 USART 各不相同具体实例需查看对应板的include/periph_conf.h。对nucleo-f412zg而言这个串口就是上文 UART 配置表中的USART3UART_0PD8/PD9。连接参数波特率115200数据格式8N18 数据位、无校验、1 停止位在 Linux 下可用minicom -D /dev/ttyACM0设备节点可能因系统而异或执行make BOARDnucleo-f412zg termmake term会自动读取Makefile.include中继承的串口配置打开终端。进入 Shell 后即可执行help查看可用命令或运行ps、ifconfig需网络模块等 RIOT 内置命令验证系统状态。与姊妹板 nucleo-f413zh 的关系nucleo-f412zg与 boards/nucleo-f413zh/ 为同一 PCB 上的孪生兄弟两者共用同一份引脚图原文档中的 pinout 图即为 nucleo-f412zg-and-f413zh.svg差异仅在 MCU 型号F412ZG 与 F413ZH及随之而来的外设能力。在阅读 ST 官方 UM1974 用户手册第 34 页的 144 引脚排布图时两份文档可互相参考两板的periph_conf.h结构也基本同源便于对比学习。小结与扩展阅读nucleo-f412zg板级支持完整覆盖了 RIOT 从构建到烧录再到 Shell 交互的整条链路Makefile.features声明外设能力periph_conf.h落实引脚映射与时钟Kconfig 统一配置入口ST-Link/OpenOCD/cpy2remed/stm32flash 提供多路径烧录方案而 VCP 串口USART3115200 8N1则是默认的调试交互通道。如需进一步深入推荐在仓库中继续阅读boards/common/nucleo144/doc.mdNucleo-144 系列公共说明与 Shell 访问说明boards/nucleo-f413zh/doc.md孪生板卡文档对照阅读更易理解差异doc/guides/board_specific/stm32.mdSTM32 全系烧录指南OpenOCD / MSD / stm32flashdoc/guides/getting-started/flashing.mdx 与 doc/guides/build-system/flashing.mdRIOT 通用烧录与构建系统机制doc/guides/advanced_tutorials/porting_boards.mdx若想将自己的开发板移植进 RIOT本文介绍的整套文件结构即是最佳模板。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →