3. STM32MP硬件平台认知
做BSP移植,第一步不是打开内核源码,而是把芯片“看透”。STM32MP15x与STM32MP13x虽然同属STM32MP系列,但定位差异明显:STM32MP15x是双核Cortex-A7(最高650MHz~800MHz)加一颗Cortex-M4协处理器,面向需要实时控制与Linux应用并存的场景;STM32MP13x则是单核Cortex-A7(最高650MHz~1GHz),去掉了M4,主打成本敏感、单一Linux系统的工业与消费类设备。理解这一差异,直接决定后续设备树怎么写、电源管理怎么做、外设如何分配。
一、芯片架构:从内核到总线
STM32MP15x内部可划分为三个世界:应用处理器子系统(AP)、微控制器子系统(MCU)和共享资源。AP侧包含Cortex-A7双核、L2 Cache、NEON/FPU,运行Linux;MCU侧是Cortex-M4,运行RTOS或裸机,负责实时任务。两者通过IPCC(处理器间通信控制器)和共享内存交互,这是异构通信的硬件基础。STM32MP13x没有MCU子系统,架构更简洁,但保留了大部分AP侧外设。
总线层面,STM32MP15x采用多层AHB/AXI矩阵,AP侧通过AXI连接到DDR控制器、GPU、显示控制器等高速外设;MCU侧通过AHB连接到自己的外设。两套总线在ETZPC(扩展信任区控制器)和RCC的协调下实现资源隔离与共享。BSP工程师需要关注的是:哪些外设挂在AP侧、哪些挂在MCU侧、哪些可被双方访问。例如UART4在STM32MP15x上默认分配给M4,若Linux要用,必须在设备树中正确配置并确保M4侧释放。
二、外设资源:BSP工程师的“资源地图”
STM32MP15x的外设资源可以按“高速、中速、低速、模拟”四类来梳理。高速外设包括DDR控制器(支持DDR3/DDR3L/LPDDR2/LPDDR3)、USB2.0 OTG、千兆以太网GMAC、SDMMC(支持SD3.0/eMMC)、显示控制器LTDC和DSI。中速外设是UART、I2C、SPI、CAN、SAI(音频)、SPDIF等。低速外设包括GPIO、TIM、WDT、RTC。模拟外设则有ADC、DAC、温度传感器。
STM32MP13x在保留上述大部分外设的同时,去掉了DSI、GPU和部分高速接口,但增加了MDF(多通道数字滤波器)和ADF(音频数字滤波器),适合工业信号采集。BSP移植时,外设资源的差异直接体现在设备树源文件(.dtsi)的包含关系上:STM32MP15x的板级dts通常包含stm32mp15xx.dtsi,而STM32MP13x包含stm32mp13xx.dtsi,两者外设节点名称和地址不同,不能直接复用。
一个常见的实操判断是:拿到一块新板子,先看原理图确认外设连接,再对照芯片数据手册的AF(Alternate Function)表确认引脚复用是否可行。例如,STM32MP157的PG11引脚可以复用为ETH1_GMII_TX_EN、UART4_TX、SPI1_SCK等,具体选哪个AF,取决于板级设计。设备树中通过pinctrl节点描述,格式如下:
&pinctrl {
uart4_pins_a: uart4-0 {
pins1 {
pinmux = <STM32_PINMUX('G', 11, AF6)>;
bias-disable;
};
};
};
这里的AF6就是数据手册中查到的复用编号。如果写错,串口无输出,但引脚电平可能正常,排查时容易误判为驱动问题。因此,BSP工程师必须养成“先查AF表,再写pinctrl”的习惯。
三、电源域:低功耗与上电时序的根基
STM32MP15x的电源域划分比较细,主要包括:VDD_CORE(内核供电,1.2V典型)、VDD_DDR(DDR供电,1.35V/1.5V)、VDD_IO(IO供电,1.8V/3.3V可配)、VDD_ADC(模拟供电)、VBAT(备份域)、VDD_USB等。每个域的上电时序有严格要求,例如VDD_CORE必须先于VDD_DDR稳定,否则DDR控制器可能初始化失败。
在BSP中,电源域的管理通过PWR外设和 regulators框架实现。设备树中需要描述每个regulator的输入输出、使能GPIO、电压范围。例如:
&vddcore: regulator-vddcore {
compatible = "regulator-fixed";
regulator-name = "vddcore";
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1200000>;
regulator-always-on;
};
低功耗场景下,Linux的cpuidle和suspend会按域关闭外设时钟和电源。如果某个域被错误地标记为always-on,系统待机功耗会明显偏高。实测中,STM32MP157在mem模式下待机电流可低至几毫安,但若DDR未进入自刷新,电流可能上升到几十毫安。因此,电源域配置是BSP移植中必须逐项核对的环节。
四、引脚复用框架:从AF表到设备树
STM32MP15x/13x的引脚复用框架由GPIO控制器、pinctrl子系统和AF表三者构成。每个GPIO引脚最多可配置为16种复用功能(AF0~AF15),其中AF0通常为GPIO输入输出,AF1~AF15对应不同外设。芯片数据手册的“Alternate function mapping”表格是唯一权威依据。
BSP移植时,引脚复用的配置流程是:查原理图确认外设连接 → 查AF表确认引脚和AF编号 → 在设备树pinctrl节点中定义 → 在设备节点中引用pinctrl。例如,以太网RMII接口需要配置REF_CLK、MDIO、MDC、CRS_DV、RXD0、RXD1、TX_EN、TXD0、TXD1等引脚,每个引脚的AF编号都不同。如果某个引脚被其他外设占用,pinctrl会报冲突,内核启动日志中会出现pin conflict或pin already requested提示。
cat /sys/kernel/debug/pinctrl/*/pinmux-pins查看引脚当前复用状态。如果显示为UNCLAIMED,说明设备树未正确引用pinctrl;如果显示为其他设备名,说明引脚被占用,需要检查设备树中的pinctrl引用关系。
五、BSP移植前的硬件认知清单
在动手修改设备树之前,建议按以下清单逐项确认,避免“边写边猜”:
- 芯片型号与封装:确认是STM32MP157还是STM32MP135,封装引脚数是否与原理图一致。
- DDR类型与容量:DDR3/DDR3L/LPDDR3,容量和位宽,这决定U-Boot中DDR初始化参数。
- 启动介质:eMMC、SD卡、NAND还是NOR,影响boot引脚配置和分区表。
- 外设连接:列出所有外设及其引脚,标注AF编号,形成“外设-引脚-AF”对照表。
- 电源域:确认各域电压、上电时序、使能GPIO,特别是DDR和IO域。
- 时钟源:外部晶振频率(通常24MHz)、RTC晶振(32.768kHz),影响时钟树配置。
- 调试接口:UART调试口是哪个,波特率多少,确保能拿到启动日志。
这份清单不是形式主义,而是BSP移植的“输入条件”。例如,如果DDR容量写错,U-Boot阶段就会卡死;如果调试串口AF配错,连日志都看不到,后续所有工作都无从谈起。把硬件认知做扎实,设备树修改才能有的放矢。
STM32MP15x与13x的架构差异、外设资源分布、电源域划分和引脚复用框架,共同构成了BSP移植的“硬件底座”。理解这些内容,不是为了背诵参数,而是为了在设备树中写出正确的节点、在启动失败时快速定位是电源、时钟还是引脚问题。下一阶段进入U-Boot与TF-A的移植时,这些硬件认知会直接转化为调试效率。