RIOT OS 板级支持详解:STM32 Nucleo-F746ZG(ARM Cortex-M7 开发板)的资源配置、烧录与调试
【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT
Nucleo-F746ZG 是 ST 官方 Nucleo-144 系列中面向高性能应用的代表板卡,搭载 STM32F746ZG 微控制器(ARM Cortex-M7 内核,主频最高 216 MHz),拥有 320 KiB RAM 与 1 MiB Flash。本文以 RIOT OS 仓库中 boards/nucleo-f746zg/doc.md 为骨架,结合板级源码(periph_conf.h、Makefile.features、Makefile.dep等)与通用 STM32 烧录基础设施,系统讲解该板卡在 RIOT OS 下的硬件资源配置、外设可用性、编译烧录流程与串口调试方法,帮助你快速将 RIOT 应用跑在 Nucleo-F746ZG 上。
板卡总览:Nucleo-F746ZG 与 RIOT 的适配情况
Nucleo-F746ZG 属于 ST 的 Nucleo-144(板级通用组boards_common_nucleo144)系列,RIOT OS 为其提供了完整的板级支持,板卡名称为nucleo-f746zg。该板的核心特征如下:
- 板载STM32F746ZG(ARM Cortex-M7,带双精度 FPU 的浮点单元);
- 存储资源充裕:320 KiB RAM、1 MiB Flash,适合运行 RIOT 网络栈、文件系统或较高复杂度的应用;
- 板载ST-Link 调试器(同时提供虚拟串口 VCP),开箱即可烧录与查看 RIOT shell 输出;
- 板载以太网 PHY,RIOT 侧通过
stm32_eth驱动即可启用 Ethernet; - 引脚布局兼容 Arduino UNO / Mega 类扩展板(来自 Nucleo-144 公共特性)。
RIOT 的板级支持目录结构如下(boards/nucleo-f746zg):
boards/nucleo-f746zg/ ├── include/periph_conf.h # 外设引脚与 DMA 配置 ├── Kconfig # 板级 Kconfig 配置 ├── Makefile # 板级构建规则 ├── Makefile.dep # 板级模块依赖 ├── Makefile.features # 板级提供的特性列表 ├── Makefile.include # 公共头文件路径 └── doc.md # 板级文档(本文章骨架)MCU 参数与资源一览
原文档在“MCU”小节给出了 STM32F746ZG 的完整规格表,这是评估应用可行性的关键依据:
| MCU | STM32F746ZG |
|---|---|
| 内核 | ARM Cortex-M7 |
| 厂商 | ST Microelectronics |
| RAM | 320 KiB |
| Flash | 1 MiB |
| 主频 | 最高 216 MHz |
| FPU | 支持(Cortex-M7 双精度) |
| 定时器 | 18 个(12×16-bit、2×32-bit、1×RTC、1×SysTick、2×看门狗) |
| ADC | 3×12-bit(共 24 通道) |
| UART | 4 个(USART/UART) |
| SPI | 6 个 |
| CAN | 2 个 |
| RTC | 1 个 |
| I2C | 4 个 |
| 供电电压 | 1.7V - 3.6V |
其中 RAM/Flash 容量、216 MHz 主频与 320 KiB RAM 是选择该板运行 RIOT 的关键考量:例如在开启 IPv6/CoAP 网络栈或挂载文件系统时,充裕的 RAM 能显著降低内存压力。官方数据手册、参考手册(RM0385)、编程手册与板卡手册的获取方式均列在原文档中,可在实际开发中对照查阅。
引脚分布(Pinout)
原文档附有来自 STM 用户手册 UM1974(第 32 页)的引脚分布图:
Nucleo-144 系列共用同一套板级引脚布局,因此该图同样适用于 Nucleo-F746ZG。图中标注了 Arduino 兼容排针(CN7/CN10)与 ST 形态排针(CN11/CN12)的引脚定义。需要说明的是,RIOT 中实际启用的引脚并非全部遵循 Arduino 命名,而是以 boards/nucleo-f746zg/include/periph_conf.h 中的GPIO_PIN(PORT_x, n)定义为准(如 PWM 通道的注释中同时标注了D6/D5/D3等 Arduino 引脚号,便于对照扩展板)。
外设配置深度解析:periph_conf.h 中的资源映射
板级适配的核心是 boards/nucleo-f746zg/include/periph_conf.h,它通过static const配置数组向 RIOT 外设子系统(periph_*)声明了可用的 DMA、PWM、UART、SPI 与 ETH。下面逐项拆解。
DMA 流配置
板级声明了 8 条 DMA 流,供 UART/SPI/ETH 复用:
static const dma_conf_t dma_config[] = { { .stream = 4 }, /* DMA1 Stream 4 - USART3_TX */ { .stream = 14 }, /* DMA2 Stream 6 - USART6_TX */ { .stream = 6 }, /* DMA1 Stream 6 - USART2_TX */ { .stream = 10 }, /* DMA2 Stream 2 - SPI1_RX */ { .stream = 13 }, /* DMA2 Stream 5 - SPI1_TX */ { .stream = 11 }, /* DMA2 Stream 3 - SPI4_RX */ { .stream = 12 }, /* DMA2 Stream 4 - SPI4_TX */ { .stream = 8 }, /* DMA2 Stream 0 - ETH_TX */ };对应中断服务函数由DMA_n_ISR宏映射(如isr_dma1_stream4、isr_dma2_stream6等),DMA_NUMOF由ARRAY_SIZE(dma_config)推导。这些 DMA 通道只有在编译期启用MODULE_PERIPH_DMA时才会被 UART/SPI 驱动引用(见下文条件编译块)。
UART:3 路可用串口
板级声明了 3 路 UART(USART3、USART6、USART2),配置项包括引脚、复用功能(AF)、时钟总线与 IRQ,且在MODULE_PERIPH_DMA开启时绑定对应的 DMA 索引与通道:
| UART 索引 | 外设 | RX 引脚 | TX 引脚 | 时钟/总线 | DMA(dma/chan) |
|---|---|---|---|---|---|
| 0 | USART3 | PD9 | PD8 | APB1 | 0 / 7(USART3_TX) |
| 1 | USART6 | PG9 | PG14 | APB2 | 1 / 5(USART6_TX) |
| 2 | USART2 | PD6 | PD5 | APB1 | 2 / 4(USART2_TX) |
中断入口通过UART_n_ISR宏映射到isr_usart3/isr_usart6/isr_usart2。需要特别注意的是,ST-Link 虚拟串口(VCP)对应的默认控制台 UART各 Nucleo 型号并不相同,务必以本板periph_conf.h中STDIO_UART_DEV的实际接线为准——RIOT 通用文档也明确提示要查阅对应板卡的periph_conf.h确认该连接。
SPI:SPI1 与 SPI4
板级提供 2 路 SPI。其中 SPI1 有一个值得注意的引脚冲突处理:默认 MOSI 为 PA7(为兼容 Arduino 类扩展板),但 PA7 同时连接板载以太网 PHY 的 RMII_DV 信号,因此当启用板载以太网时(MODULE_PERIPH_ETH),SPI1 的 MOSI 会被重映射到 PB5:
#ifdef MODULE_PERIPH_ETH .mosi_pin = GPIO_PIN(PORT_B, 5), #else .mosi_pin = GPIO_PIN(PORT_A, 7), #endif该行为在 boards/nucleo-f746zg/Makefile 中也有呼应——当USEMODULE包含stm32_eth时,构建系统会打印一条提示信息,告知 SPI_DEV(0) 的 MOSI 已从 PA7 重映射到 PB5 以解决引脚冲突。SPI 配置同样在MODULE_PERIPH_DMA下绑定收发 DMA(SPI1 用 DMA 索引 4/3,SPI4 用 6/5)。
PWM:TIM1 与 TIM4
板级通过 TIM1 和 TIM4 提供 8 路 PWM 通道,注释中标注了对应的 Arduino 引脚号,便于直接驱动电机、LED 等:
- TIM1(APB2):PE9(D6/CN10-4)、PE11(D5/CN10-6)、PE13(D3/CN10-10)、PE14(D38/CN10-28);
- TIM4(APB1):PD12(D29/CN10-21)、PD13(D28/CN10-19)、PD14(D10/CN7-16)、PD15(D9/CN7-18)。
ETH:板载 RMII 以太网
板级定义了完整的eth_conf_t配置,使能 RMII 模式、100 Mbit/s 全双工,PHY 地址为0x00:
static const eth_conf_t eth_config = { .mode = RMII, .speed = MII_BMCR_SPEED_100 | MII_BMCR_FULL_DPLX, .dma = 7, .dma_chan = 8, .phy_addr = 0x00, .pins = { PG13, PB13, PG11, PC4, PC5, PA7, PC1, PA2, PA1 }, };ETH 的 TX 使用 DMA2 Stream 0(ETH_DMA_ISR映射为isr_dma2_stream0)。在模块层面,boards/nucleo-f746zg/Makefile.dep 规定:只要应用使用了netdev_default(默认网络设备选择),就会自动追加stm32_eth模块,从而实现“编译即带以太网”。
板级特性与模块依赖
boards/nucleo-f746zg/Makefile.features 声明了该板提供的 RIOT 特性(FEATURES_PROVIDED):
periph_dma periph_eth periph_i2c periph_pwm periph_rtc periph_rtt periph_spi periph_timer periph_uart periph_usbdev riotboot tinyusb_device即:除常规的 UART/SPI/I2C/PWM/定时器外,该板还额外提供 DMA、以太网、USB 设备(periph_usbdev)、riotboot启动引导与tinyusb_device(TinyUSB 设备栈)支持。
此外,通过引入boards/common/nucleo144/Makefile.features(见 boards/common/nucleo144/Makefile.features),该板还继承了 Nucleo-144 公共特性:
arduino_analog arduino_i2c arduino_pins arduino_shield_mega arduino_shield_uno arduino_spi arduino_uart这意味着 Nucleo-F746ZG 可兼容 Arduino UNO 与 Mega 类扩展板,arduino_*特性供 RIOT 的 Arduino API 兼容层(pkg/arduino_api)使用。CPU 型号在构建系统中定义为CPU = stm32、CPU_MODEL = stm32f746zg。
依赖关系方面,Makefile.dep中除netdev_default → stm32_eth外,还引入了boards/common/nucleo/Makefile.dep以继承公共依赖。Kconfig 侧(boards/nucleo-f746zg/Kconfig)则声明BOARD_NUCLEO_F746ZG会select BOARD_COMMON_NUCLEO144与select CPU_MODEL_STM32F746ZG,并source公共的nucleo144/Kconfig,保证菜单配置与构建系统一致。
烧录与调试:从编译到运行
支持的程序员(Programmer)
Nucleo-F746ZG 板载 ST-Link,RIOT 的 STM32 通用烧录基础设施(makefiles/boards/stm32.inc.mk)默认选择OpenOCD,并支持以下程序员:
PROGRAMMER ?= openocd PROGRAMMERS_SUPPORTED += bmp dfu-util openocd stm32flash- openocd(默认):调试适配器默认为
stlink(OPENOCD_DEBUG_ADAPTER ?= stlink),并且默认启用OPENOCD_RESET_USE_CONNECT_ASSERT_SRST = 1——这是 STM32 板的重要容错设置:当固件硬故障(hardfault)导致板子无法正常复位时,仍可通过 assert SRST 恢复可烧录状态。 - stm32flash:使用串口/UART 引导加载器烧录,
PROG_BAUD默认 57600,烧录地址由ROM_START_ADDR与ROM_OFFSET计算,可通过STM32FLASH_RESET/STM32FLASH_RESET_INVERT控制 BOOT0/RST 的自动切换时序(需 TTL 适配器将 BOOT0 接 RTS、RST 接 DTR)。 - bmp(Blackmagic Probe)与dfu-util(USB DFU)为可选备选方案。
此外,Nucleo 公共构建文件(boards/common/nucleo/Makefile.include)还支持cpy2remed程序员(将固件复制到 ST-Link 的可移动磁盘),其目标目录名由板名推导(如NODEF746ZG)。
常用烧录命令
使用默认 OpenOCD/ST-Link 烧录当前应用:
make BOARD=nucleo-f746zg flash如需显式指定其他程序员(以 stm32flash 为例):
make BOARD=nucleo-f746zg PROGRAMMER=stm32flash flash访问 RIOT shell
Nucleo 系列板卡统一通过ST-Link 虚拟串口(VCP)提供 RIOT shell 访问(见 boards/common/nucleo144/doc.md),默认波特率为115200,8N1。Linux 下通常体现为/dev/ttyACM0之类的设备节点,连接命令示例:
make BOARD=nucleo-f746zg term或使用 miniterm 手动连接:
miniterm.py /dev/ttyACM0 115200ST-Link 虚拟串口同时承担调试器串口标识的作用——构建系统通过DEBUG_ADAPTER_ID_IS_TTY_SERIAL := 1与TTY_BOARD_FILTER(--model 'STM32 STLink')在多板共存时自动筛选出正确的串口设备。
快速上手:一个最小示例
以 RIOT 示例应用(如examples/hello-world)在本地编译并烧录到 Nucleo-F746ZG:
# 在示例目录编译 make BOARD=nucleo-f746zg -C examples/hello-world # 烧录(默认 OpenOCD + ST-Link) make BOARD=nucleo-f746zg -C examples/hello-world flash # 打开 shell(115200 8N1) make BOARD=nucleo-f746zg -C examples/hello-world term若应用包含netdev_default(例如网络示例),构建系统会自动引入stm32_eth模块并启用板载以太网,同时 SPI1 MOSI 会自动重映射到 PB5,无需手动干预。
小结
Nucleo-F746ZG 是 RIOT OS 中一款“资源富裕”的 Cortex-M7 板卡:1 MiB Flash、320 KiB RAM、板载以太网、USB 设备支持与 Arduino 兼容特性使其非常适合网络协议栈、存储类与中等复杂度 IoT 应用的快速原型。通过本板periph_conf.h中清晰的引脚与 DMA 映射、Makefile.features中声明的特性,以及 STM32 通用烧录链路(默认 OpenOCD + ST-Link),开发者可以用标准的make BOARD=nucleo-f746zg flash流程完成从编译、烧录到 shell 调试的完整闭环。需要更深入的板级实现时,可继续阅读 boards/common/nucleo144 与 cpu/stm32 下的公共代码。
【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考