RIOT OS 板级支持指南:STM32 Nucleo-F207ZG(nucleo-f207zg)外设配置与开发上手
【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT
本指南基于 RIOT 仓库中boards/nucleo-f207zg/doc.md的板级文档,结合同目录下的periph_conf.h、Makefile.*与Kconfig等源码配置,系统讲解 STM32 Nucleo-F207ZG 在 RIOT 中的硬件资源、外设映射、实现状态以及从编译烧录到进入 Shell 的完整流程。读完本文,你将掌握该板卡的可用外设清单、各外设的引脚与 DMA 配置细节,并能在自己的 RIOT 应用中正确选择BOARD=nucleo-f207zg进行开发。
板卡概览(Overview)
Nucleo-F207ZG 是意法半导体(ST)Nucleo 家族中的一员,属于 Nucleo-144 封装规格。它搭载一颗 ARM Cortex-M3 内核的STM32F207ZG微控制器,提供128 KiB SRAM与1 MiB Flash,主频最高 120 MHz。板卡上同时集成 ST-Link 调试器(VCP 虚拟串口)与以太网 PHY(RMII 接口),使其在 RIOT 中具备完整的网络开发能力。
该板卡在 RIOT 中的注册名为nucleo-f207zg,其通用构建逻辑、Arduino 引脚映射与烧录方式与所有 Nucleo-144 板卡共用一套基础实现(见 boards/common/nucleo144 与 boards/common/nucleo 目录)。板卡级 Kconfig 入口位于 boards/nucleo-f207zg/Kconfig,其中通过select BOARD_COMMON_NUCLEO144与select CPU_MODEL_STM32F207ZG显式声明其家族归属与 CPU 型号。
MCU 硬件规格
以下硬件参数摘录自板级文档的 MCU 一览表,对应 STM32F207ZG 数据手册:
| 项目 | 参数 |
|---|---|
| MCU | STM32F207ZG |
| 内核家族 | ARM Cortex-M3 |
| 厂商 | ST Microelectronics |
| RAM | 128 KiB |
| Flash | 1 MiB |
| 主频 | 最高 120 MHz |
| FPU | 无(Cortex-M3 为软浮点) |
| 定时器 | 17 个(2 个看门狗、1 个 SysTick、12 个 16 位、2 个 32 位 [TIM2/TIM5]) |
| ADC | 3 个 12 位(共 24 通道) |
| UART | 6 个 |
| SPI | 3 个 |
| I2C | 3 个 |
| RTC | 1 个 |
| CAN | 2 个 |
| USB | 1 个 |
| Ethernet | 1 个(MAC) |
| 工作电压 Vcc | 1.8V – 3.6V |
上述参数在板级文档中仅给出表格;本仓库的
Makefile.features(见 boards/nucleo-f207zg/Makefile.features)则进一步声明了 RIOT 实际向应用暴露的能力:periph_adc、periph_dma、periph_eth、periph_i2c、periph_pwm、periph_rtc、periph_spi、periph_timer、periph_uart、periph_usbdev,同时提供riotboot与tinyusb_device支持。
引脚布局(Pinout)
板级文档引用了一张基于 ST 用户手册 UM1974(第 32 页)绘制的引脚图(svg 图位于上游仓库,当前源码树中未包含该图片文件),并提示读者在 ST 板卡手册的表 13(第 37 页)中查阅引脚与 ADC 通道的对应关系。
从 boards/nucleo-f207zg/include/periph_conf.h 的实现看,RIOT 为这块板卡实际启用的引脚集中在 Arduino 兼容排针与 ST-Link 区域上,例如:
- PWM 输出:D6(PE9/TIM1_CH1)、D5(PE11/TIM1_CH2)、D3(PE13/TIM1_CH3)、D9(PD15/TIM4_CH4);
- UART 串口:USART2 的 RX/TX 位于 PD6/PD5(对应 ST-Link VCP 与 D0/D1),USART3 位于 PD9/PD8,USART6 位于 PG9/PG14;
- SPI:SPI1 位于 PA5–PA7(Arduino D13/D12/D11 区域),SPI2 位于 PB13–PB15 与 PC2;
- ADC 采样:A0–A5 分别对应 PA3、PC0、PC3、PF3、PF5、PF10,另有内部 VBAT 通道。
作为 Nucleo-144 家族成员,板卡还通过 boards/common/nucleo144/Makefile.features 提供arduino_analog、arduino_i2c、arduino_pins、arduino_shield_mega、arduino_shield_uno、arduino_spi、arduino_uart等 Arduino 兼容特性,可以直接搭配 UNO/MEGA 扩展板使用。
外设实现状态
板级文档给出了 RIOT 对该板卡各外设的支持矩阵,整理如下:
| 设备 | ID | 支持状态 | 备注 |
|---|---|---|---|
| MCU | STM32F207ZG | 部分支持 | 低功耗模式尚未完全利用 |
| 底层驱动 GPIO | — | 支持 | |
| PWM | — | 支持(7 个引脚可用) | 对应 PR #6192 引入的能力 |
| UART | 2 个 | 支持 | USART2(ST-Link/USB 或 D0=RX/D1=TX)与 USART6(PA12=RX/PA11=TX) |
| I2C | 1 个 | 支持 | |
| SPI | 1 个 | 支持 | |
| USB | — | 不支持 | |
| Timer | 2 个 32 位 | 支持 | TIM2、TIM5 |
需要指出的是,文档中的表格是基于早期提交的历史快照。从当前 periph_conf.h 的实际配置看,实现状态已有明显推进,具体差异在下一节结合源码逐一说明。
外设配置的源码级解读
UART:三路串口与 ST-Link VCP
当前源码在uart_config[]中注册了3 路 UART(比文档表格多出一路),依次为:
| 索引 | 设备 | RX 引脚 | TX 引脚 | 总线 | DMA(启用periph_dma时) |
|---|---|---|---|---|---|
| UART_0 | USART3 | PD9 | PD8 | APB1 | dma=2, chan=4 |
| UART_1 | USART6 | PG9 | PG14 | APB2 | dma=4, chan=5 |
| UART_2 | USART2 | PD6 | PD5 | APB1 | dma=5, chan=4 |
其中USART2(UART_2)正是连接板载 ST-Link 虚拟串口(VCP)的通道,对应 Nucleo 排针上的 D0(RX)/D1(TX)。打开终端工具连接 ST-Link VCP 后即可访问 RIOT Shell,默认波特率为115200,8N1(见 boards/common/nucleo144/doc.md)。三路 UART 的 RX/TX 复用功能(AF)分别配置为GPIO_AF7(USART3/USART2)与GPIO_AF8(USART6),并在#ifdef MODULE_PERIPH_DMA分支中为每路指定了 DMA 流,说明启用 DMA 后串口收发不占用 CPU。
SPI:两路主机接口
spi_config[]注册了两路 SPI:
- SPI1:MOSI=PA7、MISO=PA6、SCLK=PA5、CS=PA4,全部使用
GPIO_AF5,挂载在 APB2 总线;启用 DMA 时 TX 走 dma=1(DMA1 Stream 3),RX 走 dma=0(DMA2 Stream 2)。 - SPI2:MOSI=PB15、MISO=PC2、SCLK=PB13、CS=PB12,同样
GPIO_AF5,挂载在 APB1 总线;DMA 通道为 TX dma=3 / RX dma=2。
注意:SPI2 的 SCLK 引脚 PB13 与以太网 RMII 复用引脚存在潜在冲突(见下文 ETH 配置),实际应用中若同时启用两个模块需留意引脚复用关系。
Timer:两路 32 位高精度定时器
RIOT 定时器驱动在此板卡上使用TIM2与TIM5,两者max = 0xffffffff,即完整的 32 位计数范围,均位于 APB1 总线,中断分别路由到isr_tim2与isr_tim5。这为需要长时间跨度或高分辨率计时的应用(如 ztimer 与调度统计)提供了硬件基础。
PWM:7 个可用输出通道
pwm_config[]定义了 2 组 PWM 设备:
- TIM1(APB2):CH1→PE9(Arduino D6)、CH2→PE11(D5)、CH3→PE13(D3),复用
GPIO_AF1,第 4 通道为GPIO_UNDEF; - TIM4(APB1):仅 CH3→PD15(D9),复用
GPIO_AF2。
加上 TIM1 的三个输出,共 4 个物理 PWM 引脚在源码中直接可见;文档所称“7 pins available”(PR #6192)指的是 TIM1 三相 + TIM4 等组合的历史状态,具体以当前periph_conf.h为准。
ADC:Arduino A0–A5 与内部 VBAT
adc_config[]按 Nucleo 排针布局注册了 6 个采样通道 + 1 个内部电池电压通道:
| 引脚 | 设备 | 通道 | 对应标识 |
|---|---|---|---|
| PA3 | dev 0 | 3 | ADC123_IN3 |
| PC0 | dev 0 | 10 | ADC123_IN10 |
| PC3 | dev 0 | 13 | ADC123_IN13 |
| PF3 | dev 2 | 9 | ADC3_IN9 |
| PF5 | dev 2 | 15 | ADC3_IN15 |
| PF10 | dev 2 | 8 | ADC3_IN8 |
| GPIO_UNDEF | dev 0 | 18 | VBAT(内部通道) |
注释中特别说明:STM32F207ZG 的 ADC 通道并未全部开放,RIOT 只暴露了 Arduino 排针 A0–A5 与内部 VBAT 通道;VBAT_ADC定义为ADC_LINE(6),即数组索引 6 对应内部 VBAT 采样线。若需新增通道,可依据板卡手册“ADC[X]_IN[Y]”规则(X 为设备序号、Y 为通道序号)扩展该数组。
DMA:跨外设的流分配
dma_config[]集中定义了 7 条 DMA 流及其中断服务函数映射,覆盖 SPI1、SPI2、USART2/3/6 与以太网 TX:
| 索引 | 流 | 用途 | ISR |
|---|---|---|---|
| 0 | DMA2 Stream 2 | SPI1_RX | isr_dma2_stream2 |
| 1 | DMA2 Stream 3 | SPI1_TX | isr_dma2_stream3 |
| 2 | DMA1 Stream 3 | SPI2_RX / USART3_TX | isr_dma1_stream3 |
| 3 | DMA1 Stream 4 | SPI2_TX | isr_dma1_stream4 |
| 4 | DMA2 Stream 6 | USART6_TX | isr_dma2_stream6 |
| 5 | DMA1 Stream 6 | USART2_TX | isr_dma1_stream6 |
| 6 | DMA2 Stream 0 | ETH_TX | isr_dma2_stream0 |
由此可以看到,启用periph_dma模块后,UART 发送与 SPI 收发均可以借助 DMA 完成,降低 CPU 占用。
以太网(Ethernet):RMII + 板载 PHY
eth_config配置了RMII 模式、默认 100 Mbps 全双工(MII_BMCR_SPEED_100 | MII_BMCR_FULL_DPLX)、PHY 地址0x00,使用 DMA2 Stream 0(索引 6)。RMII 所需的 9 个引脚(PG13、PB13、PG11、PC4、PC5、PA7、PC1、PA2、PA1)均已列出。在应用层,只要启用默认网络模块,boards/nucleo-f207zg/Makefile.dep 会自动把stm32_eth加入USEMODULE:
ifneq (,$(filter netdev_default,$(USEMODULE))) USEMODULE += stm32_eth endif这意味着只需在应用 Makefile 中声明USEMODULE += netdev_default(或gnrc_netdev_default等),编译时即可自动拉入以太网驱动,配合 RIOT 的gnrc/lwip网络栈实现 TCP/IP 通信。
构建、烧录与 Shell 使用
选择板卡并编译
RIOT 通过BOARD变量选择目标板卡。在任意应用目录(如examples/hello-world)执行:
make BOARD=nucleo-f207zg构建系统会依据 boards/nucleo-f207zg/Makefile 将MODULE = board与公共的nucleo目录纳入编译,并由Makefile.features声明CPU = stm32、CPU_MODEL = stm32f207zg,同时加载 Nucleo-144 家族的公共特性;Makefile.include则引入公共头文件路径与烧录逻辑。
烧录(Flashing)
Nucleo 板卡自带 ST-Link 调试器,RIOT 官方文档对 STM32 板卡的烧录有专门章节(板级文档中给出了对应指南页)。板级文档明确给出的板卡名即为nucleo-f207zg,使用该名称执行make flash即可:
make BOARD=nucleo-f207zg flash常见的烧录方式包括通过 ST-Link 使用openocd/stlink工具写入 Flash,以及使用 RIOT 提供的riotboot引导方案(该板卡声明了riotboot特性)进行 A/B 分区升级。
访问 RIOT Shell
板卡上电并烧录包含 Shell 的应用后,用 USB 线连接板卡,系统会枚举出 ST-Link 虚拟串口(VCP)。以 115200、8N1 参数打开该串口(例如minicom -D /dev/ttyACM0 -b 115200或任意串口工具),即可看到 RIOT Shell 提示符并交互式执行help、ifconfig、ps等命令。各 Nucleo 板卡用于 VCP 的 USART 不尽相同,本板卡为 USART2(PD6/PD5),对应关系以 periph_conf.h 中的uart_config[]为准。
小结
Nucleo-F207ZG 在 RIOT 中是一块外设齐全、网络能力突出(板载以太网 PHY)的 Cortex-M3 开发板。通过本文的梳理可以看到:板级文档给出了宏观的资源清单与支持矩阵,而periph_conf.h则精确规定了 UART/SPI/PWM/ADC/DMA/ETH 的具体引脚、复用功能、总线时钟与中断路由。开发者在编写应用时,应优先查阅这两份资料,再结合 boards/common/nucleo144 的 Arduino 兼容能力快速搭建原型。
【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考