3. STM32MP启动模式与BootROM机制

STM32MP系列(如STM32MP157、STM32MP135)上电后并不是直接运行用户固件,而是先执行固化在芯片内部ROM中的一段只读代码——BootROM。BootROM是芯片出厂时写入的“第一段程序”,它负责读取启动引脚(BOOT引脚)的采样电平,决定从哪个外设或存储器加载下一级引导程序(FSBL,通常是TF-A的BL2),再把控制权交给它。理解BootROM的判定逻辑,是排查“板子上电没反应”“串口无输出”“卡在ROM阶段”这类问题的前提。

启动引脚与启动模式选择

STM32MP1的启动源选择由BOOT0、BOOT1、BOOT2三个引脚在上电复位释放瞬间的电平组合决定。这三个引脚在复位期间被BootROM采样,采样结果锁存到内部寄存器,之后引脚可以复用为普通GPIO。常见的组合含义如下(以STM32MP157为例):

BOOT2BOOT1BOOT0启动源
000eMMC/SD卡(SDMMC接口)
001串口/USB下载(工程模式)
010NOR Flash / SPI-NAND
100NAND Flash

实际硬件上,这些引脚通常通过拨码开关或跳线帽接地/接VDD来选择。需要注意的是,BOOT引脚必须在复位释放前稳定,且不能悬空——悬空引脚电平不确定,会导致启动源随机。设计时一般给每个BOOT引脚加10kΩ下拉或上拉,再用拨码开关短接到相反电平。

调试阶段建议把BOOT0拨到“1”进入串口/USB下载模式,这样即使Flash里没有可启动固件,也能通过STM32CubeProgrammer连接芯片,烧写或恢复系统。

BootROM的启动流程

BootROM的执行可以概括为几个阶段:上电复位后,CPU从ROM的固定入口开始执行;BootROM初始化基本时钟和必要外设;读取BOOT引脚;根据启动源尝试加载FSBL;对加载到的镜像做头部校验(STM32 Header);校验通过则跳转到FSBL入口,否则尝试下一个启动源或进入下载模式。

这里有一个关键机制:BootROM支持“启动源回退”。如果首选启动源(比如eMMC)中没有有效镜像,BootROM会自动尝试下一个候选源,最终如果所有源都失败,就进入USB/串口下载模式并等待主机连接。这个回退链是排查启动失败时的重要线索——串口打印“ROM”相关日志,往往说明BootROM已经跑起来了,只是没找到合法镜像。

STM32MP BootROM 启动判定与回退流程 上电 / 复位释放 CPU 从 ROM 入口执行 采样 BOOT2/1/0 锁存启动源选择 按优先级尝试启动源 eMMC → SD → NOR → NAND 镜像头校验 STM32 Header 合法? 跳转 FSBL (TF-A BL2) 是 还有下一个启动源? 继续回退尝试 否 回退重试 进入 USB/串口下载模式 等待主机连接 否 串口日志关键线索 • "ROM" 字样 → BootROM 已运行 • "Boot source" → 当前选择的启动源 • "Header" 错误 → 镜像头不合法 • 无任何输出 → 时钟/供电/引脚问题 • 反复重试 → 回退链全部失败

串口/USB/Flash启动模式的实际差异

串口和USB启动模式(BOOT0=1)是工程调试最常用的入口。此时BootROM会初始化USART或USB OTG,等待主机通过STM32CubeProgrammer发送FSBL镜像。串口模式通常使用USART2或UART4(具体取决于芯片型号和封装),波特率由BootROM自动协商,常见为115200。USB模式则使用USB OTG HS/FS接口,速度更快,适合烧写大容量镜像。

Flash启动模式(eMMC/SD/NOR/NAND)则要求存储介质中已经存在合法的FSBL镜像。BootROM会从存储介质的固定偏移读取镜像头,检查魔术字、校验和、镜像长度等字段。以eMMC为例,FSBL通常烧写在用户分区的起始位置,或者按照STM32CubeProgrammer的FlashLayout规则写入指定分区。如果偏移不对,BootROM读到的就是无效数据,校验失败后回退。

注意:不同启动源的镜像头格式和偏移地址可能不同。例如SD卡启动时,BootROM会读取SD卡第一个分区的起始扇区;而eMMC启动时,可能读取boot分区或用户分区。烧写时务必使用与启动源匹配的FlashLayout文件,否则会出现“镜像明明烧进去了却启动不了”的情况。

启动失败排查与日志分析

排查启动失败,第一步是接串口。STM32MP的BootROM会在默认调试串口上输出少量信息,包括ROM版本、启动源选择、镜像校验结果等。如果串口完全无输出,优先检查:供电是否正常(VDD、VDDCORE、VDDA)、复位引脚是否被拉低、调试串口引脚是否被复用冲突、串口线序是否正确。可以用示波器测量复位释放时刻的BOOT引脚电平,确认采样值符合预期。

如果串口有输出但停在某一行,就要根据日志定位。常见日志与含义如下:

NOTICE:  CPU: STM32MP157FAC Rev.Z
NOTICE:  Model: STMicroelectronics STM32MP157F-DK2
INFO:    Boot source: eMMC
ERROR:   Header check failed on eMMC
INFO:    Trying SD card...
ERROR:   No valid image found
INFO:    Entering USB download mode

这段示例日志说明:BootROM先尝试eMMC,镜像头校验失败;回退到SD卡,也没有合法镜像;最终进入USB下载模式。此时应该检查eMMC中FSBL的烧写偏移和镜像头是否正确,或者直接用STM32CubeProgrammer通过USB重新烧写。

另一类常见问题是“启动源选错”。比如板子实际从SD卡启动,但BOOT引脚被误拨到eMMC,BootROM就会去读eMMC,自然找不到镜像。排查时先确认拨码开关状态,再对照芯片参考手册的BOOT引脚真值表。还有一类是“镜像头合法但FSBL跑飞”,这种情况BootROM已经跳转成功,串口会打印TF-A的日志,问题就转移到DDR初始化、时钟树配置或设备树匹配上,不再属于BootROM阶段。

排查顺序建议:先看串口有无输出 → 有输出看停在哪一步 → 确认BOOT引脚电平 → 确认启动源与烧写偏移 → 用CubeProgrammer重新烧写 → 仍失败则检查硬件供电和时钟。

最后要强调,BootROM是只读的,无法修改。所有启动行为的调整都只能通过BOOT引脚、存储介质内容和外部电路来实现。理解它的判定逻辑和回退机制,才能在板级联调时快速区分“BootROM阶段失败”和“FSBL之后失败”,把问题范围缩小到正确的方向上。