RIOT OS 中的 STM32F429I-DISC1 开发板支持:外设配置、引脚定义与烧录指南
2026/9/18 23:29:57 网站建设 项目流程

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 RAM2 MiB Flash。在 RIOT 中,它是老款 STM32F429I-DISCO 的替代型号,两者在板级定义上存在继承关系,但 DISCO 版本目前在仓库中仅保留了Makefile.featuresMakefile.depMakefile.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 的完整资源表,这是理解后续外设配置的基础:

项目参数
MCUSTM32F429ZI
内核家族ARM Cortex-M4F
厂商ST Microelectronics
RAM256 KiB
Flash2 MiB
主频最高 180 MHz(RIOT 中设为 180 MHz)
RIOT 默认主频180 MHz
FPU支持(硬件浮点)
以太网10/100 Mbps
定时器17 个(2 个看门狗、1 个 SysTick、2 个 32 位、12 个 16 位)
ADC3 个 12 位(最多 24 通道)
UART4
I2C3
SPI6
CAN2
RTC1

该表同时对应 STM32F429ZI Datasheet、RM0090 参考手册、PM0214 编程手册 以及 UM1670 板卡手册,后文的外设配置细节均可在这些官方资料中找到寄存器级依据。

说明:RIOT 的板级支持以 CPU 型号为粒度组织。在 boards/stm32f429i-disc1/Makefile.features 中通过CPU = stm32CPU_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_fmcperiph_fmc_16bitperiph_fmc_sdram表明板载FMC 外部存储器控制器64 Mbit SDRAM(型号 IS42S16400J-7TL)可用;
  • periph_usbdevperiph_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又进一步展开为i3g4250dl3gd20l3gxxxx_spi,对应板载的L3GD20(Rev. B01/C01)或 I3G4250D(Rev. D02/E01)三轴陀螺仪

板载外设引脚映射(board.h)

boards/stm32f429i-disc1/include/board.h 集中定义了板级资源:

LED

板上有两颗用户可控 LED,均挂在 GPIOG 端口,可通过宏直接控制:

端口引脚号板载丝印
LED0_PINLED0_PIN_NUM=13,LED0_PORT_NUM=PORT_GGPIOG13LD3(绿色)
LED1_PINLED1_PIN_NUM=14,LED1_PORT_NUM=PORT_GGPIOG14LD4(红色)

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.hclk_conf.hcfg_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_pinGPIO_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_SDRAMMODULE_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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询