引言:为什么“烧录”决定了 MP1 的生死?
STM32MP1 是一颗「Linux 级」异构 MPU,但上电第一行代码不在 DDR,也不在 eMMC,而是藏在 片上 ROM 。
从 ROM 到 Linux 用户空间,要经过 三代引导程序 :
ROM → TF-A(FSBL) → U-Boot(SSBL) → Linux
每一级都定义了一套 串行协议 ——USB DFU 或 USART ,用于 空板烧录、产线升级、现场救砖 。
AN5275 就是这份「三代协议白皮书」:
- 35 页、20 张图、19 张表
- 覆盖 ROM、TF-A、U-Boot 三线协议时序
- 给出阶段 ID、数据包格式、校验算法
本文把它拆成「原理 → 时序 → 工具 → 产线」四段,带你 10 分钟看懂 STM32MP1 的整个烧录链路 。
1. 总体架构:一张图看懂「谁加载谁」
表格复制
| 阶段 |
载体 |
运行地址 |
协议角色 |
阶段 ID |
| ROM |
片上固化 |
SYSRAM |
USB/USART 从机 |
0x01 |
| TF-A |
二进制 |
SYSRAM |
初始化 DDR |
0x01 / 0x03 |
| U-Boot |
FIP 包 |
DDR |
烧录服务 |
0x03 / 0x00 |
| Layout |
TSV 文本 |
DDR |
分区清单 |
0x00 |

结论:ROM 永远是「从」,PC 端 STM32CubeProgrammer 是「主」 ;
三代程序共用同一套 DFU/USART 帧格式 ,只是阶段 ID 不同。
2. 协议层:DFU vs USART——「同一帧格式,两种物理层」
2.1 帧结构(共用)
表格复制
| 字段 |
长度 |
说明 |
| Command |
1 B |
0x31 = Download … |
| XOR |
1 B |
Command ^ 0xFF |
| Payload |
N B |
地址/长度/数据 |
| CheckSum |
1 B |
全字节 XOR = 0x00 |
- ACK = 0x79 NACK = 0x1F ABORT = 0x5F
- USART 额外偶校验 ;USB 由 CRC16 保障
2.2 USB DFU 状态机(DFU 1.1)
appIDLE → DFU_DETACH → dfuIDLE → DFU_DNLOAD → dfuMANIFEST
- STM32MP1 不支持 DFUSE 扩展 → 只能用标准 DFU 1.1
- bitManifestationTolerant = 1 → 允许在 dfuIDLE 直接表现,减少一次 USB Reset
2.3 USART 波特率
- 115200 8E1 (8 位 + 偶校验 + 1 停止)
- 先发 0x7F 唤醒 ,ROM 回 0x79 表示就绪
- 支持 256 B 块下载 → 与 USB 对齐,方便同一份 Layout 文件复用
3. 阶段 ID:Layout 文件里的「导航地图」
Layout 是 制表符分隔的 TSV ,每行 = 一个分区,字段:
Name Offset Size PhaseID Binary
表格复制
| PhaseID |
含义 |
谁加载 |
是否签名 |
| 0x00 |
Layout 自身 |
U-Boot |
❌ |
| 0x01 |
TF-A (FSBL) |
ROM |
✅ |
| 0x03 |
U-Boot (SSBL) |
TF-A |
✅ |
| 0x10~0xF0 |
用户分区 |
U-Boot |
❌/可选 |
| 0xF2 |
OTP |
U-Boot |
❌ |
| 0xF4 |
PMIC-NVM |
U-Boot |
❌ |
| 0xFE |
End Of Operation |
— |
— |
| 0xFF |
Reset |
— |
— |
产线技巧:
把 PhaseID 写在标签上 ,扫码枪一扫就知道烧到哪一步 ;0xFE/0xFF 出现 → 绿灯亮,板子下线
4. 烧录时序:USB 与 USART「三线」对比
4.1 案例 1——空板 USB 烧录(最常见)
PC ↔ ROM ↔ TF-A ↔ U-Boot
- USB 枚举 →
idVendor=0x0483 idProduct=0xDF11
- GetPhase=0x01 → PC 下发 TF-A 二进制 (带 STM32 头)
- 表现后 ROM 跳转到 TF-A → DDR 初始化完成
- GetPhase=0x03 → PC 下发 U-Boot-FIP (含 OP-TEE/SCP)
- GetPhase=0x00 → PC 下发 Layout 文件
- 循环 GetPhase=N → U-Boot 依次烧写 bootfs/rootfs/userfs
- GetPhase=0xFE → Operation End → 自动复位
耗时:eMMC 8 GB Class10 → 约 4 min 30 s (USB 2.0 HS)
4.2 案例 2——已装系统,U-Boot 下“增量更新”
- 上电按 USER 键 → U-Boot 停在
stm32prog> 模式
- 同一套 DFU 协议 → 只烧改动的分区 → 30 s 完成
- 支持 dfu-util / STM32CubeProgrammer CLI → 易集成 CI/CD
4.3 案例 3——USART 产线烧录(无 USB 夹具)
- 夹具只接 RX/TX/GND → 3 线即可
- 115200 8E1 → CRC + 偶校验 → 误码率 < 10^-9
- 256 B 块下载 → eMMC 8 GB 约 12 min → 适合白牌代工

5. 安全与签名:「关闭器件」必须过的一道坎
- STM32MP1 分为 Open / Closed 两种生命周期
- Open :不验签,任何二进制都能烧
- Closed :ROM 强制 ECDSA 验证 STM32 头 → 失败直接 Abort
表格复制
| 阶段 |
签名工具 |
密钥长度 |
备注 |
| TF-A |
sign-tool |
ECDSA P-256 |
由 ST-RoT 导出 |
| U-Boot-FIP |
sign-tool |
ECDSA P-256 |
可打包 OP-TEE |
| 用户分区 |
可选 RSA-2048 |
由客户 OEM 控制 |
|
产线建议:
烧录前一次性签名 → 把 .sig 文件和 .bin 放同一目录 → STM32CubeProgrammer 自动校验
6. 产线落地:从「手工」到「无人化」的 5 步
表格复制
| 工站 |
动作 |
耗时 |
关键配置 |
| 1. ICT |
3 线夹具 USART 烧空 Boot |
30 s |
PhaseID=0x01/0x03 |
| 2. 功能测 |
USB DFU 烧 Linux + DTB |
90 s |
PhaseID=0x10/0x11 |
| 3. 老化 |
SSH 拉脚本,循环重启 |
600 s |
检查 0xFE 计数 |
| 4. OTA 密钥 |
写入 OTP RSA-2048 Hash |
10 s |
PhaseID=0xF2 |
| 5. 下线 |
扫描 SN → MES 上传 |
5 s |
JSON 含 CRC、耗时 |
结果:
单班 8 h 产能 1200 板 ,一次通过率 99.7% (ST 深圳代工厂数据)
7. 常见坑:别让“小阶段”变成“大砖块”
表格复制
| 现象 |
根因 |
快速修复 |
| USB 枚举不到 |
时钟未起 |
检查 HSE 8 MHz + BOOT0=1 |
| 烧录 Abort |
签名失败 |
关闭器件 → 必须签名 ;Open→Closed 不可逆 |
| USART 0x7F 无回应 |
偶校验错 |
串口设置 8E1 ;先发 0x7F 唤醒帧 |
| GetPhase=0xFF |
上一步 CRC 错 |
重发上一包 ;NACK 重试 3 次 |
| 烧完不启动 |
GPT 分区表未写 |
Layout 里必须含 MBR+GPT ;eMMC 需 mmc partconf 使能 |
|