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) |
| 片内 Flash | 2 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需要注意两点:
MACH_STM32F429等 Cortex-M 变体选项的文本明确标注了DEPRECATED(已弃用),Kconfig help 说明 Cortex-M 变体的支持"计划在 2027 年初移除",STM32 平台当前的发展重心已转向基于 Cortex-A7 的 STM32MP1/MP13 应用处理器;ARCH_STM32同时依赖ARM_SINGLE_ARMV7M(Cortex-M,无 MMU)与ARCH_MULTI_V7(Cortex-A,有 MMU)两条架构路径,两条路径分别使能ARMV7M_SYSTICK、STM32_EXTI与ARM_GIC、ARM_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.h与dt-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 板卡移植的权威参考模板。其关键设计如下:
- 板级标识与内存:
compatible = "st,stm32f429i-disco", "st,stm32f429",memory@90000000定义 8 MB 外部 SDRAM(0x90000000 起始,0x800000 大小),启动参数root=/dev/ram、stdout-path = "serial0:115200n8"; - 板载资源:
- LED:PG13(绿色,heartbeat 触发器)与 PG14(红色)两个 GPIO LED;
- 用户按键:PA0,映射为
KEY_HOME; - U-Boot 配置节点
options/u-boot,指定boot-led;
- 时钟配置:
&clk_hse { clock-frequency = <8000000>; }覆盖板级 8 MHz 外部晶振频率; - 触摸屏:I2C3 总线上挂载 STMPE811 触摸控制器(地址 0x41),完整配置了 ADC 时钟、12 位模式、采样时间、触摸屏驱动电流与触摸检测延迟等参数;
- 显示链路:
<dc(LCD 控制器)使能,通过端点(endpoint)与 SPI 接口上的 ILI9341 面板(st,sf-tc240t-9370-t)连接成显示管道;SPI5 同时挂载 L3GD20 三轴陀螺仪; - USB OTG:
&usbotg_hs以dr_mode = "host"运行,并配置 vbus 供电稳压器(由 PC4 控制); - 时钟事件:
&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 | 驱动路径(节选) |
|---|---|---|
| 时钟/RCC | st,stm32f4-rcc | drivers/clk/clk-stm32f4.c(定义见 drivers/clk/Kconfig) |
| 引脚复用 | st,stm32f429-pinctrl | drivers/pinctrl/stm32/pinctrl-stm32f429.c |
| 串口 | st,stm32-usart | drivers/tty/serial/stm32-usart.c |
| I2C | st,stm32f4-i2c | drivers/i2c/busses/i2c-stm32f4.c |
| LCD 控制器 | st,stm32-ltdc | drivers/gpu/drm/stm/ltdc.c |
| RTC | st,stm32-rtc | drivers/rtc/rtc-stm32.c |
| DMA | st,stm32-dma | drivers/dma/stm32-dma.c |
| 温度传感器 | st,stm32-ts | drivers/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 链路配置产生,具体倍频系数可在板级设备树或引导参数中按晶振实际频率调整。
支持状态与移植注意事项
综合文档与源码可以得出以下结论:
- 支持深度完整:从 SoC 级 dtsi、板级 dts、默认内核配置到驱动源码,STM32F429 拥有从"boot 到 console"再到 LCD/触摸/网络/USB 等完整外设的端到端 Linux 支持;
- Cortex-M 平台的特殊性:STM32F429 作为 ARMv7-M MCU 无 MMU,运行的是精简 Linux 内核,依赖 ARM_SINGLE_ARMV7M 配置路径,重启通过
armv7m_restart实现; - 维护状态需关注:Kconfig 已将
MACH_STM32F429等 Cortex-M 选项标记为 DEPRECATED,并注明计划在 2027 年初移除,STM32 内核开发重心已转向 STM32MP 应用处理器系列;对于长期产品,建议关注主线内核的迁移公告; - 移植新板卡的路径:复制 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),仅供参考