Linux 内核中的 STM32F429 平台支持解析:Cortex-M4 特性、设备树与驱动栈
2026/9/12 13:52:21 网站建设 项目流程

Linux 内核中的 STM32F429 平台支持解析:Cortex-M4 特性、设备树与驱动栈

【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux

STM32F429 是意法半导体(STMicroelectronics)面向工业、物联网与消费类应用推出的 Cortex-M4 微控制器,本文以其在内核文档 Documentation/arch/arm/stm32/stm32f429-overview.rst 中的官方概述为骨架,结合当前 Linux 内核源码树(arch/arm、drivers、Documentation)中的平台代码、设备树与默认内核配置,全面解析 STM32F429 在 Linux 中的硬件能力、内核适配方式、设备树描述以及各外设驱动实现。读完本文,你将掌握如何在 Linux 中定位 STM32F429 平台代码、理解其 device tree 描述结构、编译对应内核,并追踪典型外设(时钟、串口、LCD、触摸屏、USB OTG)的驱动实现路径。

STM32F429 硬件特性总览

STM32F429 是 STM32F4 系列中的高性能成员,官方概述文档(stm32f429-overview.rst)开篇即点明其核心定位:一款面向多种应用场景的 Cortex-M4 微控制器。其关键特性如下:

特性说明
处理器核心ARM Cortex-M4,最高 180 MHz,带硬件浮点单元(FPU)
片内 Flash2 MB 内部 Flash 存储器
外部存储器扩展通过 FMC 控制器支持 PSRAM、SDRAM、NOR、NAND
通信接口I2C、SPI、SAI、CAN、USB OTG、以太网控制器
显示与影像LCD 控制器与摄像头接口(DCMI)
安全特性硬件加密处理器(CRYP)

这一特性集合决定了它在 Linux 中的适配边界:作为 ARMv7-M(Cortex-M)架构的 MCU,STM32F429 运行 Linux 时没有 MMU,属于无 MMU 的 ARM 单内核(ARM_SINGLE_ARMV7M)平台,这一结论可以从平台 Kconfig 的依赖关系中得到印证(见下文"内核平台适配"一节)。

内核平台适配:arch/arm/mach-stm32 与 Kconfig

平台代码组织

文档 overview.rst 说明,STM32 多个机器家族的平台代码统一位于arch/arm/mach-stm32,其中包含一个支持 Flattened Device Tree(扁平设备树)的通用板文件。当前仓库中的具体实现为 arch/arm/mach-stm32/board-dt.c:

  • 该文件通过DT_MACHINE_START(STM32DT, "STM32 (Device Tree Support)")注册了一个通用机器描述;
  • stm32_compat兼容字符串表包含"st,stm32f429""st,stm32f469""st,stm32f746""st,stm32f769""st,stm32h743""st,stm32h747""st,stm32h750"以及 STM32MP 系列;
  • CONFIG_ARM_SINGLE_ARMV7M使能时,将restart回调设置为armv7m_restart,即无 MMU 的 Cortex-M 平台通过 v7-M 系统控制机制实现重启。

这意味着:任何 compatible 字符串匹配"st,stm32f429"的设备树都能被这个通用机器描述识别,无需为每块板卡单独编写 mach 文件——这正是文档所述"适用于任何 compatible 的设备树板卡"的具体实现。

配置选项与维护状态

平台级配置定义在 arch/arm/mach-stm32/Kconfig:

menuconfig ARCH_STM32 bool "STMicroelectronics STM32 family" depends on ARM_SINGLE_ARMV7M || ARCH_MULTI_V7 ... config MACH_STM32F429 bool "STMicroelectronics STM32F429 (DEPRECATED)" default y

需要注意两点:

  1. MACH_STM32F429等 Cortex-M 变体选项的文本明确标注了DEPRECATED(已弃用),Kconfig help 说明 Cortex-M 变体的支持"计划在 2027 年初移除",STM32 平台当前的发展重心已转向基于 Cortex-A7 的 STM32MP1/MP13 应用处理器;
  2. ARCH_STM32同时依赖ARM_SINGLE_ARMV7M(Cortex-M,无 MMU)与ARCH_MULTI_V7(Cortex-A,有 MMU)两条架构路径,两条路径分别使能ARMV7M_SYSTICKSTM32_EXTIARM_GICARM_PSCI等不同的基础设施。

构建配置:stm32_defconfig 与 multi_v7_defconfig

文档 overview.rst 给出两条构建路径:

# MCU(Cortex-M,含 STM32F429) make stm32_defconfig # MPU(Cortex-A,STM32MP 系列) make multi_v7_defconfig

其中 arch/arm/configs/stm32_defconfig 与 STM32F429 平台直接相关,从中可以看到官方默认使能的外设驱动子集(关键条目节选):

CONFIG_ARCH_STM32=y CONFIG_SERIAL_STM32=y CONFIG_SERIAL_STM32_CONSOLE=y CONFIG_I2C=y CONFIG_I2C_STM32F4=y CONFIG_I2C_STM32F7=y CONFIG_NEW_LEDS=y CONFIG_LEDS_GPIO=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_RTC_DRV_STM32=y CONFIG_STM32_DMA=y CONFIG_STM32_DMAMUX=y CONFIG_IIO=y CONFIG_STM32_ADC_CORE=y CONFIG_STM32_ADC=y

这份配置勾勒出 STM32F429 在 Linux 中的典型部署形态:串口控制台(SERIAL_STM32)、GPIO LED(含 heartbeat 触发器)、I2C 总线、RTC、DMA 以及基于 IIO 框架的 ADC 采样。SPI 与 DRM(LCD)等驱动虽未在截取片段中列出,但设备树与驱动源码中均具备完整支持(见下文)。

设备树描述:SoC 级 stm32f429.dtsi 与板级 dts

SoC 级描述 stm32f429.dtsi

SoC 级设备树 arch/arm/boot/dts/st/stm32f429.dtsi 是 STM32F429 所有板卡的公共骨架,其结构如下:

  • 引入../armv7-m.dtsi(ARMv7-M 无 MMU 公共设备树)、dt-bindings/clock/stm32fx-clock.hdt-bindings/mfd/stm32f4-rcc.h时钟绑定头文件;
  • 定义四个固定时钟节点:clk_hse(外部高速晶振,频率在板级覆盖)、clk_lse(32.768 kHz)、clk_lsi(32 kHz 内部低速 RC)、clk_i2s_ckin
  • soc节点下描述全部片上外设,例如:
efuse@1fff7800 { compatible = "st,stm32f4-otp"; reg = <0x1fff7800 0x400>; ts_cal1: calib@22c { reg = <0x22c 0x2>; }; ts_cal2: calib@22e { reg = <0x22e 0x2>; }; }; timers2: timers@40000000 { compatible = "st,stm32-timers"; reg = <0x40000000 0x400>; clocks = <&rcc 0 STM32F4_APB1_CLOCK(TIM2)>; ... pwm { compatible = "st,stm32-pwm"; ... }; timer@1 { compatible = "st,stm32-timer-trigger"; ... }; };

值得注意的是 efuse 节点中的ts_cal1/ts_cal2:它们指向 OTP 中出厂校准的温度传感器校准值,内核温度传感器驱动可据此修正读数,这是 MCU 平台设备树"描述硬件出厂数据"的典型例子。

引脚复用描述 stm32f429-pinctrl.dtsi

arch/arm/boot/dts/st/stm32f429-pinctrl.dtsi 描述了 STM32F429 的 GPIO 与引脚复用控制器:

&pinctrl { compatible = "st,stm32f429-pinctrl"; gpioa: gpio@40020000 { gpio-ranges = <&pinctrl 0 0 16>; }; gpiob: gpio@40020400 { gpio-ranges = <&pinctrl 0 16 16>; }; ... gpiok: gpio@40022800 { gpio-ranges = <&pinctrl 0 160 8>; }; };
  • GPIO A~K 共 11 个端口,基址从 0x40020000 起,每个端口寄存器块间隔 0x400;
  • gpio-ranges将每个 GPIO 引脚映射到 pinctrl 子系统的全局引脚编号空间(如 gpioa 对应引脚 0~15、gpiob 对应 16~31……gpiok 对应 160~167,仅 8 个引脚);
  • 驱动实现位于 drivers/pinctrl/stm32/pinctrl-stm32f429.c(由"st,stm32f429-pinctrl"compatible 绑定)。

板级描述 stm32f429-disco.dts:官方 Discovery 开发板

arch/arm/boot/dts/st/stm32f429-disco.dts 是官方 STM32F429i-DISCO 开发板的完整设备树,可作为 STM32F429 板卡移植的权威参考模板。其关键设计如下:

  1. 板级标识与内存compatible = "st,stm32f429i-disco", "st,stm32f429"memory@90000000定义 8 MB 外部 SDRAM(0x90000000 起始,0x800000 大小),启动参数root=/dev/ramstdout-path = "serial0:115200n8"
  2. 板载资源
    • LED:PG13(绿色,heartbeat 触发器)与 PG14(红色)两个 GPIO LED;
    • 用户按键:PA0,映射为KEY_HOME
    • U-Boot 配置节点options/u-boot,指定boot-led
  3. 时钟配置&clk_hse { clock-frequency = <8000000>; }覆盖板级 8 MHz 外部晶振频率;
  4. 触摸屏:I2C3 总线上挂载 STMPE811 触摸控制器(地址 0x41),完整配置了 ADC 时钟、12 位模式、采样时间、触摸屏驱动电流与触摸检测延迟等参数;
  5. 显示链路&ltdc(LCD 控制器)使能,通过端点(endpoint)与 SPI 接口上的 ILI9341 面板(st,sf-tc240t-9370-t)连接成显示管道;SPI5 同时挂载 L3GD20 三轴陀螺仪;
  6. USB OTG&usbotg_hsdr_mode = "host"运行,并配置 vbus 供电稳压器(由 PC4 控制);
  7. 时钟事件&timers5被覆写为st,stm32-timer并配置中断 50,作为系统 clockevent(时钟事件源)使用——在无 MMU 的 Cortex-M 平台上,这通常依赖 ARMv7-M SysTick,定时器覆写提供了额外的高精度时钟事件源。

另一块参考板 arch/arm/boot/dts/st/stm32429i-eval.dts 对应更高配的 Eval 评估板。两块板卡的设备树均收录于 arch/arm/boot/dts/st/Makefile 的 dtb 构建列表。

外设驱动实现:从设备树到驱动源码

STM32F429 的 Linux 支持不仅停留在设备树层面,其外设驱动分布在 drivers 目录下,可通过设备树 compatible 字符串定位:

外设compatible驱动路径(节选)
时钟/RCCst,stm32f4-rccdrivers/clk/clk-stm32f4.c(定义见 drivers/clk/Kconfig)
引脚复用st,stm32f429-pinctrldrivers/pinctrl/stm32/pinctrl-stm32f429.c
串口st,stm32-usartdrivers/tty/serial/stm32-usart.c
I2Cst,stm32f4-i2cdrivers/i2c/busses/i2c-stm32f4.c
LCD 控制器st,stm32-ltdcdrivers/gpu/drm/stm/ltdc.c
RTCst,stm32-rtcdrivers/rtc/rtc-stm32.c
DMAst,stm32-dmadrivers/dma/stm32-dma.c
温度传感器st,stm32-tsdrivers/iio/temperature/stm32-temp.c(使用 dtsi 中的 ts_cal1/ts_cal2 校准值)

以时钟子系统为例,drivers/clk/clk-stm32f4.c 解析st,stm32f4-rcc节点,根据dt-bindings/clock/stm32fx-clock.h中的时钟 ID 与dt-bindings/mfd/stm32f4-rcc.h中的寄存器定义,注册 PLL、系统时钟与各总线时钟;板级设备树中的clk_hse频率覆盖值(8 MHz)即作为 PLL 倍频的参考输入。从源码结构看,STM32F429 的 180 MHz 主频由 HSE + PLL 链路配置产生,具体倍频系数可在板级设备树或引导参数中按晶振实际频率调整。

支持状态与移植注意事项

综合文档与源码可以得出以下结论:

  1. 支持深度完整:从 SoC 级 dtsi、板级 dts、默认内核配置到驱动源码,STM32F429 拥有从"boot 到 console"再到 LCD/触摸/网络/USB 等完整外设的端到端 Linux 支持;
  2. Cortex-M 平台的特殊性:STM32F429 作为 ARMv7-M MCU 无 MMU,运行的是精简 Linux 内核,依赖 ARM_SINGLE_ARMV7M 配置路径,重启通过armv7m_restart实现;
  3. 维护状态需关注:Kconfig 已将MACH_STM32F429等 Cortex-M 选项标记为 DEPRECATED,并注明计划在 2027 年初移除,STM32 内核开发重心已转向 STM32MP 应用处理器系列;对于长期产品,建议关注主线内核的迁移公告;
  4. 移植新板卡的路径:复制 stm32f429-disco.dts 或 stm32429i-eval.dts 作为起点,修改 compatible、内存布局与板载外设引脚,加入 arch/arm/boot/dts/st/Makefile 的 dtb 列表,即可复用全部 SoC 级驱动。

如需深入了解 STM32 平台整体布局、DMA/MDMA 链式传输等进阶主题,可继续阅读 Documentation/arch/arm/stm32/overview.rst 与 Documentation/arch/arm/stm32/stm32-dma-mdma-chaining.rst。

【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

立即咨询