Linux 内核中的 STM32F746 支持概览:Cortex-M7 MCU 的架构特性与设备树实现
2026/9/12 1:20:53 网站建设 项目流程

Linux 内核中的 STM32F746 支持概览:Cortex-M7 MCU 的架构特性与设备树实现

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

导读

本文基于 Linux 内核仓库中 Documentation/arch/arm/stm32/stm32f746-overview.rst 文档,系统梳理 STMicroelectronics STM32F746 微控制器(Cortex-M7 内核 MCU)的硬件资源,并结合内核源码中的平台代码(arch/arm/mach-stm32)、设备树(arch/arm/boot/dts/st/stm32f746.dtsi、arch/arm/boot/dts/st/stm32f746-disco.dts)与默认内核配置(arch/arm/configs/stm32_defconfig),逐项印证每个外设在内核中的落地方式。读完本文,你将理解 STM32F746 在 Linux 内核中的支持现状、各外设节点的设备树描述方式,以及如何在 ARMv7-M 平台上编译并引导该内核。

STM32F746 芯片概览

STM32F746 是面向多种应用场景的 Cortex-M7 微控制器。文档列出的核心特性如下:

  • Cortex-M7 内核,主频最高可达216MHz
  • 1MB 内部 Flash320KB 内部 RAM(另有 4KB 备份 SRAM);
  • FMC 控制器,用于连接 SDRAM、NOR 与 NAND 存储器;
  • 双模式 QSPI(Dual mode QSPI);
  • SD/MMC/SDIO支持;
  • 以太网控制器(Ethernet controller);
  • USB OTG FS 与 HS 控制器
  • I2C、SPI、CAN 总线支持;
  • 多个 16 位与 32 位通用定时器
  • 串行音频接口(Serial Audio Interface,SAI);
  • LCD 控制器(LTDC);
  • HDMI-CEC
  • SPDIFRX(S/PDIF 数字音频接收)。

这些特性共同决定了 STM32F746 的定位:一颗集成显示、音频、网络与存储接口的高性能 MCU,常见于带屏的人机交互设备与工业控制面板。

文档署名作者为 Alexandre Torgue(alexandre.torgue@st.com),并注明芯片的 Datasheet 与参考手册在 ST 官网公开获取(原文档中的 STM32F746 链接指向 st.com 产品页)。

内核中的 STM32F746 平台支持

平台代码与机器描述

STM32F746 属于 STM32 家族中的 Cortex-M(MCU)分支,其平台支持位于 arch/arm/mach-stm32。平台入口 board-dt.c 的DT_MACHINE_START描述中注册了"st,stm32f746"兼容字符串,说明该平台采用 Flattened Device Tree(扁平设备树)通用板级支持,即任意 compatible 匹配的板卡均可通过设备树直接启动,无需为每块板子编写独立机器代码。

在 arch/arm/mach-stm32/Kconfig 中,STM32F746 以MACH_STM32F746配置项呈现,默认开启(default y),但已被明确标记为 DEPRECATED(弃用):Kconfig 的 help 文本说明基于 Cortex-M 的早期变体支持已废弃,计划于 2027 年初移除。这意味着使用 STM32F746 进行新项目选型时应关注该时间线,后续移植应优先考虑 STM32MP1 系列(Cortex-A)平台。

内核配置

对于 MCU(Cortex-M)变体,文档说明使用默认配置编译内核:

make stm32_defconfig

在 arch/arm/configs/stm32_defconfig 中,可以看到为 STM32 平台启用的关键子系统:

  • CONFIG_ARCH_STM32=y:平台总开关;
  • CONFIG_SERIAL_STM32=yCONFIG_SERIAL_STM32_CONSOLE=y:STM32 USART 串口驱动与内核控制台;
  • CONFIG_I2C=yCONFIG_I2C_STM32F4=yCONFIG_I2C_STM32F7=y:I2C 总线及 F4/F7 两代控制器驱动;
  • CONFIG_MMC=yCONFIG_MMC_ARMMMCI=y:SD/MMC 卡支持(对应 SDMMC 外设);
  • CONFIG_RTC_DRV_STM32=y:STM32 RTC 驱动;
  • CONFIG_STM32_DMA=yCONFIG_STM32_DMAMUX=yCONFIG_STM32_MDMA=y:DMA 控制器与 DMA 请求复用器;
  • CONFIG_STM32_ADC_CORE=yCONFIG_STM32_ADC=y:ADC 核心与驱动。

设备树中的外设节点:从芯片手册到内核描述

arch/arm/boot/dts/st/stm32f746.dtsi 是 STM32F746 SoC 级设备树包含文件,把文档列举的每类外设映射为内核可解析的设备节点。下面按文档特性逐类对照。

存储器控制器:FMC 与 QSPI

文档提到的FMC 控制器(连接 SDRAM、NOR、NAND)与双模式 QSPI属于芯片级存储接口。从当前 stm32f746.dtsi 的节点清单看,这些控制器未在该 SoC 包含文件中显式建模为独立节点,其支持更多依赖驱动框架与板级扩展。这是设备树建模颗粒度的体现:SoC 级文件仅收录内核驱动实际使用的外设,未建模的控制器不代表芯片不具备该能力。

定时器:16 位与 32 位通用定时器

文档列出的"多个 16 位与 32 位通用定时器"在设备树中有着最完整的映射。SoC 文件为TIM2~TIM14逐个声明了节点,统一使用st,stm32-timers兼容字符串,基地址从0x40000000(TIM2)到0x40014800(TIM11)按 0x400 步进排布,并挂载在 RCC 的 APB1/APB2 时钟域上:

timers2: timers@40000000 { compatible = "st,stm32-timers"; reg = <0x40000000 0x400>; clocks = <&rcc 0 STM32F7_APB1_CLOCK(TIM2)>; clock-names = "int"; status = "disabled"; pwm { compatible = "st,stm32-pwm"; #pwm-cells = <3>; status = "disabled"; }; timer@1 { compatible = "st,stm32-timer-trigger"; reg = <1>; status = "disabled"; }; };

从源码结构可以推断:每个 timers 节点内嵌pwm子节点(st,stm32-pwm,用于输出比较/PWM)和timer-trigger子节点(用于触发 ADC 等外设),体现出定时器在 Linux 中通过 PWM 子系统、时钟事件等框架复用的设计。其中 LPTIMER(低功耗定时器)单独建模为 lptimer1,包含st,stm32-pwm-lpst,stm32-lptimer-triggerst,stm32-lptimer-counterst,stm32-lptimer-timer四个子功能,并通过 EXTI 23 边沿触发中断。

在板级文件 stm32f746-disco.dts 中,TIM5 被覆盖(override)为st,stm32-timer并启用中断 50,用作clockevent(时钟事件设备)——这是无 MMU 的 ARMv7-M 平台上内核调度时钟的关键来源,同时删除了其 PWM 与 trigger 子节点以简化功能。

I2C / SPI / CAN 总线

  • I2C:文档列的 I2C 总线支持对应设备树中的i2c1@40005400~i2c4@40006000四个节点,兼容st,stm32f7-i2c,各带两个中断(事件/错误)与 RCC 复位控制(如resets = <&rcc STM32F7_APB1_RESET(I2C1)>)。驱动对应CONFIG_I2C_STM32F7
  • SPIspi1~spi6六个节点(基址0x40003800~0x40015400),兼容st,stm32f7-spi,分布于 APB1/APB2 两个时钟域。
  • CANcan1can2两个节点,兼容st,stm32f4-bxcan,每个节点带 tx/rx0/rx1/sce 四路命名中断,并通过st,can-primary/st,can-secondary属性与共享的gcan1st,stm32f4-gcan,syscon)关联,体现 CAN 双实例共享控制块(bxCAN 架构)的内核建模方式。

SD/MMC/SDIO

文档的 SD/MMC/SDIO 支持对应sdio1: mmc@40012c00sdio2: mmc@40011c00两个节点。它们采用 ARM PrimeCell PL180 兼容描述:

sdio1: mmc@40012c00 { compatible = "arm,pl180", "arm,primecell"; arm,primecell-periphid = <0x00880180>; reg = <0x40012c00 0x400>; clocks = <&rcc 0 STM32F7_APB2_CLOCK(SDMMC1)>; clock-names = "apb_pclk"; interrupts = <49>; max-frequency = <48000000>; status = "disabled"; };

在 stm32f746-disco.dts 板级文件中,sdio1被启用并配置为 4 位总线(bus-width = <4>)、vmmc-supply = <&vcc_3v3>供电、cd-gpios卡检测引脚(GPIOC13,低电平有效),以及 default/opendrain/sleep 三套 pinctrl 状态,对应内核中CONFIG_MMC_ARMMMCI(arm,pl180 驱动)。

USB OTG FS 与 HS

文档列的 USB OTG FS & HS 控制器在设备树中分别为:

  • usbotg_fs: usb@50000000:兼容st,stm32f4x9-fsotg(对应内核 dwc2 驱动框架),挂 AHB2 时钟域STM32F7_AHB2_CLOCK(OTGFS)
  • usbotg_hs: usb@40040000:兼容st,stm32f7-hsotg(对应内核 dwc2/dwc3 高速 OTG 驱动),挂 AHB1 时钟域STM32F7_AHB1_CLOCK(OTGHS),并预设了 FIFO 尺寸:g-rx-fifo-size = <256>g-np-tx-fifo-size = <32>g-tx-fifo-size = <128 128 64 64 64 64 32 32>,这些参数直接决定 dwc2 gadget 模式下各端点的缓冲分配。

板级文件 stm32f746-disco.dts 将两个控制器均配置为dr_mode = "host",HS 控制器通过usb-nop-xceiv假 PHY 节点usbotg_hs_phy接 ULPI 时钟,FS 控制器则通过固定稳压器vcc5v_otg_fs(GPIO PD5 控制 VBUS)供电——这正是 STM32F746-DISCO 板载 USB Host 端口的实际启用方式。

串口(USART/UART)

设备树中声明了usart1/usart2/usart3(含st,stm32f7-uart兼容)以及usart4~usart8uart4/uart5/uart7/uart8等节点,覆盖 8 个串行口,分别挂载CLK_USARTx/CLK_UARTx时钟。板级文件中将usart1作为默认调试串口(stdout-path = "serial0:115200n8"aliases { serial0 = &usart1; }),对应CONFIG_SERIAL_STM32_CONSOLE

LCD 控制器(LTDC)

文档列的 LCD 控制器对应ltdc: display-controller@40016800节点,兼容st,stm32-ltdc,带两路中断(88/89,分别为全局与寄存器错误),时钟CLK_LCD,挂 APB2 复位域LTDC

在 stm32f746-disco.dts 板级实现中,LTDC 通过ltdc_out_rgb端点与panel-rgb(Rocktech RK043FN48H 4.3 寸 RGB 屏)的panel_in_rgb端点建立remote-endpoint连接,配合gpio-backlight(GPIO PK3)与 I2C3 上的edt,edt-ft5306电容触摸屏(分辨率 480x272,i2c3以 400kHz 快速模式运行),构成一套完整的内核 DRM/KMS 显示链路。这正是"带屏 HMI 应用"在内核中的典型落地方案。

HDMI-CEC

文档列的 HDMI-CEC 对应cec: cec@40006c00节点,兼容st,stm32-cec,挂两个时钟源(cechdmi-cec),中断 94。它通常与 LTDC 显示链路配套,用于消费类显示设备间的 CEC 控制协议。

其他关键基础设施节点

除文档直接列举的外设外,stm32f746.dtsi 还包含支撑整机运行的基础设施节点,可一并了解:

  • RCCrcc@40023800):兼容st,stm32f746-rcc#clock-cells = <2>#reset-cells = <1>,是所有外设时钟与复位引用的源头;节点中通过assigned-clock-rates = <1000000>CLK_HSE_RTC配置为 1MHz;
  • DMA1/DMA2dma-controller@40026000/@40026400):兼容st,stm32-dma#dma-cells = <4>,DMA2 额外带st,mem2mem属性支持内存到内存搬运;
  • EXTIinterrupt-controller@40013c00):兼容st,stm32-exti,以interrupts = <1>, <2>, <3>, ...将 14 条 EXTI 线汇聚到 NVIC;
  • RTCrtc@40002800):兼容st,stm32-rtc,通过assigned-clock-parents = <&rcc 1 CLK_LSE>选择 LSE 时钟源;
  • CRCcrc@40023000):兼容st,stm32f7-crc
  • SYSCFGsyscon@40013800)与PWRCfgpower-config@40007000):作为 syscon 提供寄存器级共享访问。

时钟源方面,SoC 文件声明了 HSE(频率由板级覆盖)、LSE(32.768kHz)、LSI(32kHz)、I2S_CKIN(48MHz)等 fixed-clock,板级文件 stm32f746-disco.dts 将 HSE 设为 25MHz。

参考板卡与启动路径

文档以 STM32F746 为通用 MCU 视角介绍,内核仓库中还包含两块基于该芯片的参考板设备树,可直接对照:

  • stm32f746-disco.dts:对应STM32F746-DISCO 评估板model = "STMicroelectronics STM32F746-DISCO board"compatible = "st,stm32f746-disco", "st,stm32f746"
  • stm32746g-eval.dts:对应STM32746G-EVAL 评估板

两块板在 arch/arm/boot/dts/st/Makefile 中均被编译进 dtb 目标。板级文件还展示了 STM32F746-DISCO 的完整板载外设布局:内存节点(memory@c0000000,8MB SDRAM 映射于 0xC0000000)、CMA 保留内存(512KBshared-dma-pool)、GPIO LED(heartbeat 触发)、gpio-keys 用户按键、以及上文提到的 SD 卡、USB Host、LCD+触摸屏。

启动路径上,板级chosen节点指定bootargs = "root=/dev/ram"(initramfs 根文件系统)与stdout-path = "serial0:115200n8"。结合 arch/arm/mach-stm32/Kconfig 中ARM_SINGLE_ARMV7M分支(选择ARMV7M_SYSTICKSTM32_EXTI),以及 stm32f746.dtsi 末尾对systick的启用,可以看出该平台依赖 SysTick 与 TIM5 clockevent 提供节拍,属于典型的 ARMv7-M 无 MMU 启动模型(配合CONFIG_ARM_SINGLE_ARMV7M)。

构建与启用要点

结合文档与源码,在 Linux 内核中启用 STM32F746 支持的关键步骤可归纳为:

  1. 配置内核:使用默认配置make stm32_defconfig(MCU 平台)。该配置已在 arch/arm/configs/stm32_defconfig 中预置串口控制台、I2C、MMC、RTC、DMA、ADC 等驱动开关。
  2. 选择机器:确认CONFIG_ARCH_STM32=yMACH_STM32F746(arch/arm/mach-stm32/Kconfig)为开启状态(默认开启)。
  3. 提供设备树:板级设备树需包含st,stm32f746compatible,可参考 stm32f746-disco.dts 组织 memory、aliases、外设 pinctrl 与 status。
  4. 引导:通过 u-boot 加载内核与 dtb,控制台默认在 USART1(115200 8N1),根文件系统可置于 initramfs(root=/dev/ram)。

结语

STM32F746 的官方内核文档虽以简短的特性清单呈现,但其背后是 arch/arm/mach-stm32 平台代码、stm32f746.dtsi SoC 级设备树与两块参考板设备树共同支撑的完整软件栈。从本文的对照可以看到:文档中每一类外设——定时器、I2C/SPI/CAN、SDIO、USB OTG、LTDC、HDMI-CEC——都能在内核源码中找到对应的节点与驱动痕迹。同时需要提醒的是,该平台已进入弃用周期(计划 2027 年初移除),评估新设计时应将此纳入考量。如需深入某个具体外设的驱动实现,可直接在内核源码树中检索对应的st,stm32-*兼容字符串及CONFIG_*_STM32*配置项。

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

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

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

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

立即咨询