3. STM32MP启动模式与BootROM机制
STM32MP系列(如STM32MP157、STM32MP135)上电后并不是直接运行用户固件,而是先执行固化在芯片内部ROM中的一段只读代码——BootROM。BootROM是芯片出厂时写入的“第一段程序”,它负责读取启动引脚(BOOT引脚)的采样电平,决定从哪个外设或存储器加载下一级引导程序(FSBL,通常是TF-A的BL2),再把控制权交给它。理解BootROM的判定逻辑,是排查“板子上电没反应”“串口无输出”“卡在ROM阶段”这类问题的前提。
启动引脚与启动模式选择
STM32MP1的启动源选择由BOOT0、BOOT1、BOOT2三个引脚在上电复位释放瞬间的电平组合决定。这三个引脚在复位期间被BootROM采样,采样结果锁存到内部寄存器,之后引脚可以复用为普通GPIO。常见的组合含义如下(以STM32MP157为例):
| BOOT2 | BOOT1 | BOOT0 | 启动源 |
|---|---|---|---|
| 0 | 0 | 0 | eMMC/SD卡(SDMMC接口) |
| 0 | 0 | 1 | 串口/USB下载(工程模式) |
| 0 | 1 | 0 | NOR Flash / SPI-NAND |
| 1 | 0 | 0 | NAND Flash |
实际硬件上,这些引脚通常通过拨码开关或跳线帽接地/接VDD来选择。需要注意的是,BOOT引脚必须在复位释放前稳定,且不能悬空——悬空引脚电平不确定,会导致启动源随机。设计时一般给每个BOOT引脚加10kΩ下拉或上拉,再用拨码开关短接到相反电平。
BootROM的启动流程
BootROM的执行可以概括为几个阶段:上电复位后,CPU从ROM的固定入口开始执行;BootROM初始化基本时钟和必要外设;读取BOOT引脚;根据启动源尝试加载FSBL;对加载到的镜像做头部校验(STM32 Header);校验通过则跳转到FSBL入口,否则尝试下一个启动源或进入下载模式。
这里有一个关键机制:BootROM支持“启动源回退”。如果首选启动源(比如eMMC)中没有有效镜像,BootROM会自动尝试下一个候选源,最终如果所有源都失败,就进入USB/串口下载模式并等待主机连接。这个回退链是排查启动失败时的重要线索——串口打印“ROM”相关日志,往往说明BootROM已经跑起来了,只是没找到合法镜像。
串口/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读到的就是无效数据,校验失败后回退。
启动失败排查与日志分析
排查启动失败,第一步是接串口。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阶段。
最后要强调,BootROM是只读的,无法修改。所有启动行为的调整都只能通过BOOT引脚、存储介质内容和外部电路来实现。理解它的判定逻辑和回退机制,才能在板级联调时快速区分“BootROM阶段失败”和“FSBL之后失败”,把问题范围缩小到正确的方向上。