RIOT OS 中的 STM32F429I-DISC1 开发板支持:外设配置、引脚定义与烧录指南
【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT
本指南以 RIOT OS 仓库中的 boards/stm32f429i-disc1/doc.md 为骨架,结合该板卡目录下的外设配置、构建脚本与 Kconfig 定义,系统讲解 STM32F429I-DISC1(ST Discovery 系列)在 RIOT 中的支持情况。读完本文,你将掌握该板卡的 MCU 资源全貌、板载外设的 GPIO 映射、如何查看外设时钟与 FMC/SDRAM 配置、如何通过 OpenOCD 烧录,以及如何在 RIOT 应用中启用板载 LCD、触摸屏、陀螺仪等模块。
板卡概述:从 STM32F429I-DISCO 到 STM32F429I-DISC1
STM32F429I-DISC1 是 ST 公司 Discovery 系列中的一款开发板,搭载 ARM Cortex-M4F 内核的STM32F429ZI微控制器,拥有256 KiB RAM与2 MiB Flash。在 RIOT 中,它是老款 STM32F429I-DISCO 的替代型号,两者在板级定义上存在继承关系,但 DISCO 版本目前在仓库中仅保留了Makefile.features、Makefile.dep、Makefile.include与 doc.md 等精简骨架,社区已把主开发精力转移到 DISC1 上。
RIOT 中该板卡的名称(BOARD 值)为stm32f429i-disc1,对应board模块位于 boards/stm32f429i-disc1。编译任何面向该板卡的 RIOT 应用时,都使用:
BOARD=stm32f429i-disc1 make -C examples/hello-world flash term其中flash目标负责烧录,term目标打开串口终端查看输出(详见后文烧录章节)。
MCU 资源总览
原文档给出了该板卡所使用 MCU 的完整资源表,这是理解后续外设配置的基础:
| 项目 | 参数 |
|---|---|
| MCU | STM32F429ZI |
| 内核家族 | ARM Cortex-M4F |
| 厂商 | ST Microelectronics |
| RAM | 256 KiB |
| Flash | 2 MiB |
| 主频 | 最高 180 MHz(RIOT 中设为 180 MHz) |
| RIOT 默认主频 | 180 MHz |
| FPU | 支持(硬件浮点) |
| 以太网 | 10/100 Mbps |
| 定时器 | 17 个(2 个看门狗、1 个 SysTick、2 个 32 位、12 个 16 位) |
| ADC | 3 个 12 位(最多 24 通道) |
| UART | 4 |
| I2C | 3 |
| SPI | 6 |
| CAN | 2 |
| RTC | 1 |
该表同时对应 STM32F429ZI Datasheet、RM0090 参考手册、PM0214 编程手册 以及 UM1670 板卡手册,后文的外设配置细节均可在这些官方资料中找到寄存器级依据。
说明:RIOT 的板级支持以 CPU 型号为粒度组织。在 boards/stm32f429i-disc1/Makefile.features 中通过
CPU = stm32、CPU_MODEL = stm32f429zi声明了该板卡所依赖的 CPU 与型号,实际的外设驱动实现则位于 cpu/stm32 与 drivers/periph_common。
引脚布局(Pinout)
原文档引用 stm32f429i-disc1.svg 展示板卡底面引脚布局图(出自 STM 用户手册 UM1607 第 12 页,注意文档中给出的实际 PDF 链接为 UM1670)。该图对硬件接线至关重要——在使用 SAUL、SPI、I2C 等模块前,务必对照引脚图确认信号与 GPIO 端口的对应关系。
RIOT 侧外设使能:features 与依赖解析
在 boards/stm32f429i-disc1/Makefile.features 中,该板卡向 RIOT 的 feature 系统声明了以下能力(按字母序):
FEATURES_PROVIDED += periph_dma FEATURES_PROVIDED += periph_fmc FEATURES_PROVIDED += periph_fmc_16bit FEATURES_PROVIDED += periph_fmc_sdram FEATURES_PROVIDED += periph_i2c FEATURES_PROVIDED += periph_spi FEATURES_PROVIDED += periph_timer FEATURES_PROVIDED += periph_uart FEATURES_PROVIDED += periph_usbdev FEATURES_PROVIDED += periph_usbdev_hs FEATURES_PROVIDED += riotboot其中:
periph_fmc、periph_fmc_16bit、periph_fmc_sdram表明板载FMC 外部存储器控制器与64 Mbit SDRAM(型号 IS42S16400J-7TL)可用;periph_usbdev与periph_usbdev_hs表明 USB OTG HS 外设可用;riotboot表明该板卡支持 RIOT 的 bootloader 机制;- 当目标板卡确为
stm32f429i-disc1时,额外提供tinyusb_devicefeature(见该文件末尾的ifneq判断),供 pkg/tinyusb 使用。
Makefile.dep 则描述了模块间的自动依赖:
ifneq (,$(filter periph_usbdev,$(USEMODULE))) USEMODULE += periph_usbdev_hs endif ifneq (,$(filter periph_fmc,$(USEMODULE))) FEATURES_REQUIRED += periph_fmc_16bit endif ifneq (,$(filter saul_default,$(USEMODULE))) USEMODULE += saul_gpio USEMODULE += l3gxxxx endif ifneq (,$(filter disp_dev,$(USEMODULE))) USEMODULE += ili9341 endif ifneq (,$(filter touch_dev,$(USEMODULE))) USEMODULE += stmpe811_i2c endif ifneq (,$(filter l3gxxxx,$(USEMODULE))) USEMODULE += i3g4250d USEMODULE += l3gd20 USEMODULE += l3gxxxx_spi endif从源码结构可以清晰地看到该板卡板载外设与 RIOT 模块的映射关系:
- 使用
saul_default(SAUL 默认传感器注册)时,自动启用saul_gpio与陀螺仪驱动l3gxxxx; - 使用
disp_dev(显示设备抽象)时,自动启用ILI9341 LCD 控制器驱动; - 使用
touch_dev(触摸设备抽象)时,自动启用STMPE811 触摸控制器驱动(I2C 接口); l3gxxxx又进一步展开为i3g4250d、l3gd20与l3gxxxx_spi,对应板载的L3GD20(Rev. B01/C01)或 I3G4250D(Rev. D02/E01)三轴陀螺仪。
板载外设引脚映射(board.h)
boards/stm32f429i-disc1/include/board.h 集中定义了板级资源:
LED
板上有两颗用户可控 LED,均挂在 GPIOG 端口,可通过宏直接控制:
| 宏 | 端口 | 引脚号 | 板载丝印 |
|---|---|---|---|
LED0_PIN(LED0_PIN_NUM=13,LED0_PORT_NUM=PORT_G) | GPIOG | 13 | LD3(绿色) |
LED1_PIN(LED1_PIN_NUM=14,LED1_PORT_NUM=PORT_G) | GPIOG | 14 | LD4(红色) |
RIOT 的标准 LED 接口宏(LED0_ON/LED0_OFF/LED0_TOGGLE等)通过 stm32_leds.h 提供,应用代码可直接使用。
用户按键
#define BTN0_PIN GPIO_PIN(PORT_A, 0) /**< GPIO used for BTN0 */ #define BTN0_MODE GPIO_IN用户按键 BTN0(丝印 "USER")接在 PA0,配置为输入模式。
板载陀螺仪 L3GD20 / I3G4250D
#define L3GXXXX_SPI_DEV SPI_DEV(0) /**< SPI 总线 */ #define L3GXXXX_SPI_CS GPIO_PIN(PORT_C, 1) /**< SPI CS 引脚 */ #define L3GXXXX_INT1_PIN GPIO_PIN(PORT_A, 1) /**< INT1 引脚 */ #define L3GXXXX_INT2_PIN GPIO_PIN(PORT_A, 2) /**< INT2/DRDY 引脚 */陀螺仪挂在SPI0 总线上,片选 PC1,中断引脚为 PA1/PA2。不同硬件版本(Rev. B01/C01 为 L3GD20,Rev. D02/E01 为 I3G4250D)通过 Makefile.dep 自动选择对应驱动模块。
触摸屏 STMPE811
#define STMPE811_PARAM_XYCONV (STMPE811_MIRROR_Y | STMPE811_SWAP_XY)板载 STMPE811 触摸控制器在 RIOT 中使用stmpe811_i2c驱动,坐标转换参数XYCONV做了 Y 轴镜像与 X/Y 交换,以匹配 LCD 的实际安装方向。
外设时钟与总线配置(periph_conf.h)
boards/stm32f429i-disc1/include/periph_conf.h 是 RIOT 中该板卡外设配置的核心,声明了板载HSE(外部高速晶振)与 LSE(外部低速晶振):
#ifndef CONFIG_BOARD_HAS_LSE #define CONFIG_BOARD_HAS_LSE 1 #endif #ifndef CONFIG_BOARD_HAS_HSE #define CONFIG_BOARD_HAS_HSE 1 #endif同时通过 Kconfig 中的select BOARD_HAS_HSE/select BOARD_HAS_LSE与时钟配置联动。该文件引用了periph_cpu.h、clk_conf.h、cfg_timer_tim5.h(32 位 TIM5 定时器)与cfg_usb_otg_hs_phy_fs.h(USB OTG HS 使用 FS PHY 的预配置)。
UART
该板卡默认仅配置 1 个 UART(USART1),用于 RIOT 的 stdio 与 shell:
static const uart_conf_t uart_config[] = { { .dev = USART1, .rcc_mask = RCC_APB2ENR_USART1EN, .rx_pin = GPIO_PIN(PORT_A, 10), .tx_pin = GPIO_PIN(PORT_A, 9), .rx_af = GPIO_AF7, .tx_af = GPIO_AF7, .bus = APB2, .irqn = USART1_IRQn, #ifdef MODULE_PERIPH_DMA .dma = DMA_STREAM_UNDEF, .dma_chan = UINT8_MAX, #endif } }; #define UART_0_ISR (isr_usart1) #define UART_NUMOF ARRAY_SIZE(uart_config)要点:
- 串口引脚为PA9(TX)/ PA10(RX),复用功能 AF7,挂在APB2总线上;
- 默认不启用 DMA(
DMA_STREAM_UNDEF),仅当编译时使能MODULE_PERIPH_DMA才保留 DMA 字段; - 板载ST-Link将该串口桥接为 USB 虚拟串口,即
make term时连接的设备。
SPI
默认配置 1 个 SPI(SPI5),专用于板载外设(陀螺仪等):
static const spi_conf_t spi_config[] = { { .dev = SPI5, .mosi_pin = GPIO_PIN(PORT_F, 9), .miso_pin = GPIO_PIN(PORT_F, 8), .sclk_pin = GPIO_PIN(PORT_F, 7), .cs_pin = GPIO_UNDEF, /* CS 由驱动层管理(如 L3GXXXX_SPI_CS) */ .mosi_af = GPIO_AF5, .miso_af = GPIO_AF5, .sclk_af = GPIO_AF5, .cs_af = GPIO_AF5, .rccmask = RCC_APB2ENR_SPI5EN, .apbbus = APB2, #ifdef MODULE_PERIPH_DMA .tx_dma = 0, .tx_dma_chan = 7, .rx_dma = 1, .rx_dma_chan = 7, #endif } }; #define SPI_NUMOF ARRAY_SIZE(spi_config)SPI5 引脚为PF7(SCLK)/ PF8(MISO)/ PF9(MOSI),复用 AF5,挂 APB2 总线。注意cs_pin为GPIO_UNDEF,片选由上层驱动(如陀螺仪的L3GXXXX_SPI_CS)单独指定。该配置还引用了 periph_conf.h 顶部定义的 DMA 流(dma_config[]中 stream 14 对应 DMA2 Stream 6 用于 SPI5_TX,stream 13 对应 DMA2 Stream 5 用于 SPI5_RX),使能periph_dma后 SPI 传输可走 DMA。
I2C
默认配置 1 个 I2C(I2C3),供 STMPE811 触摸控制器等 I2C 外设使用:
static const i2c_conf_t i2c_config[] = { { .dev = I2C3, .speed = I2C_SPEED_NORMAL, .scl_pin = GPIO_PIN(PORT_A, 8), .sda_pin = GPIO_PIN(PORT_C, 9), .scl_af = GPIO_AF4, .sda_af = GPIO_AF4, .bus = APB1, .rcc_mask = RCC_APB1ENR_I2C3EN, .clk = CLOCK_APB1, .irqn = I2C3_EV_IRQn, } }; #define I2C_0_ISR isr_i2c3_ev #define I2C_NUMOF ARRAY_SIZE(i2c_config)I2C3 引脚为PA8(SCL)/ PC9(SDA),复用 AF4,挂 APB1 总线,速率模式为I2C_SPEED_NORMAL(100 kHz)。
FMC 与板载 SDRAM
该板卡最具特色的资源之一是FMC 外部存储器控制器与板载64 Mbit SDRAM(IS42S16400J-7TL)。periph_conf.h 给出了完整的 FMC 引脚与 SDRAM 时序配置:
- 地址线 A0–A11(12 位行地址),数据线 D0–D15(16 位),字节使能 NBL0/NBL1;
- 控制信号:BA0/BA1、SDCLK、SDNWE、SDNRAS、SDNCAS、SDCKE1、SDNE1,全部使用
GPIO_AF12复用; - SDRAM 连接在Bank 6,映射地址
0xd0000000,容量按MiB(8)(4M × 16 bit)配置; - 关键时序参数:
clk_period = 2(SDCLK = 2 × HCLK)、cas_latency = 3、行/列地址位 12/8、刷新周期 64 ms 等。
FMC 配置由MODULE_PERIPH_FMC_SDRAM、MODULE_PERIPH_FMC_16BIT两个编译开关控制(见代码中的#if块)。在 Makefile.include 中还有对应的链接器内存布局定义:
FMC_RAM_ADDR=0xd0000000 FMC_RAM_LEN=8192K这表示 RIOT 的链接脚本会额外把 SDRAM 的 8 MiB 地址空间暴露给系统使用(如mtd、外部堆或文件系统挂载点)。
SAUL 外设注册(gpio_params.h)
boards/stm32f429i-disc1/include/gpio_params.h 把板载 LED 与按键注册进 SAUL 外设框架,供saulshell 命令枚举与读写:
static const saul_gpio_params_t saul_gpio_params[] = { { .name = "LD3 (green)", .pin = LED0_PIN, .mode = GPIO_OUT }, { .name = "LD4 (red)", .pin = LED1_PIN, .mode = GPIO_OUT }, { .name = "BTN USER", .pin = BTN0_PIN, .mode = BTN0_MODE }, };启用saul_default后,运行 RIOT shell 中的saul命令即可看到LD3 (green)、LD4 (red)、BTN USER三个条目,其中 LED 为OUT类(可写),按键为IN类(可读),这是验证板卡 SAUL 栈是否工作最简单的途径。
烧录与调试(Flashing)
STM32F429I-DISC1 板载ST-Link 调试器,因此 RIOT 默认使用OpenOCD作为烧录工具链。Makefile.include 中明确声明:
PROGRAMMER ?= openocd OPENOCD_DEBUG_ADAPTER ?= stlink PROGRAMMERS_SUPPORTED += openocd烧录方法(在任意应用目录下):
BOARD=stm32f429i-disc1 make flash如果系统中有多个调试器或需要指定 OpenOCD 接口配置,可通过变量覆盖,例如:
BOARD=stm32f429i-disc1 OPENOCD_DEBUG_ADAPTER=stlink make flash打开串口终端(ST-Link 虚拟串口):
BOARD=stm32f429i-disc1 make term此外,由于板卡声明了riotbootfeature,也支持 RIOT 的 riotboot 双分区升级机制。更详细的 STM32 板卡烧录说明可参考 RIOT 指南中 board_specific/stm32 相关内容。
在应用中启用板载外设
综合 Makefile.dep 与各驱动模块,在应用Makefile中可按需声明以下模块:
# 基础:SAUL + 板载陀螺仪(自动展开 l3gxxxx、i3g4250d/l3gd20、l3gxxxx_spi) USEMODULE += saul_default # 显示:ILI9341 LCD(自动展开 ili9341 与 disp_dev) USEMODULE += disp_dev # 触摸:STMPE811(自动展开 stmpe811_i2c 与 touch_dev) USEMODULE += touch_dev # 外部 SDRAM / FMC(自动要求 periph_fmc_16bit) USEMODULE += periph_fmc_sdram # USB 设备(自动展开 periph_usbdev_hs) USEMODULE += periph_usbdev # 串口 / SPI / I2C 外设抽象 USEMODULE += periph_uart periph_spi periph_i2c编译运行:
BOARD=stm32f429i-disc1 make -C examples/hello-world flash term小结
围绕 boards/stm32f429i-disc1/doc.md 这一板卡文档,结合 periph_conf.h、board.h、gpio_params.h 及三个 Makefile 与 Kconfig,可以看出 STM32F429I-DISC1 在 RIOT 中是一块外设覆盖相当全面的评估板:180 MHz Cortex-M4F、硬件 FPU、USART1 串口(ST-Link 桥接)、SPI5 驱动的板载陀螺仪、I2C3 驱动的触摸屏、ILI9341 LCD,以及通过 FMC 连接的 8 MiB 板载 SDRAM。开发者只要正确设置BOARD=stm32f429i-disc1并在应用 Makefile 中声明对应模块,即可自动获得完整的外设驱动与依赖解析,快速投入原型开发。
【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考