1. Boot 模式选择、进度、异常状态寄存器说明
BootMode 寄存器(基地址0x2030_7F00)
用于识别当前实际进入的启动模式,[2:0]位代表 Boot Mode 编号,[7:5]为 Boot Option。
Boot 执行进度信息寄存器(基地址0x2030_7F08)
每一位标记 Boot 执行阶段、故障类型;包含:BOOTROM_START_BOOT、BOOTROM_IN_FLASH_BOOT、BOOTROM_IN_UART_BOOT、BOOTROM_IN_CAN_BOOT、各类 Fault/NMI 异常标志位、BOOTROM_BOOT_COMPLETE 启动完成标志。
Boot 执行异常信息寄存器组
| 地址 | 名称 | 作用 |
|---|---|---|
| 0x20307F0C | hard_fault_status | HardFault SCB_HFSR 状态 |
| 0x20307F10 | cbrom_fault_status | NMI 异常 NMI_FLG 状态 |
| 0x20307F14 | bus_fault_adress | 总线故障 BFAR 地址 |
| 0x20307F18 | bus_fault_status | BFSR 寄存器 |
| 0x20307F1C | mem_manage_fault_address | 内存管理 MMFAR 地址 |
| 0x20307F20 | mem_manage_fault_status | MMFSR 寄存器 |
| 0x20307F24 | usage_fault_status | 使用故障 UFSR 寄存器 |
发生启动死机、HardFault,可以读取这一组内存,定位 BootROM 内部异常。
资料获取:AN1137_G32R501 BootLoader 用户手册
2. Boot 等待点(Wait Point)故障定位地址
CPU 卡死在 BootROM 内部循环时,读取 PC 程序计数器,对照等待点地址区间判断卡死原因:
| 等待点类型 | PC 地址区间 |
|---|---|
| In Wait Boot | 0x1000_17DC — 0x1000_17F4 |
| In UART Boot | 0x1001_1DC4 — 0x1001_1E14 |
| In Hard Fault Handler | 0x1000_0212 — 0x1000_0312 |
| In NMI Handler | 0x1000_0316 — 0x1000_044E |
| Failed secure Flash CMAC verification loop | 0x1001_0F80 — 0x10010FB8 |
3. 整体复位‑Boot 执行完整流程逻辑
- 芯片上电 / 复位,跳转至片上 BootROM;
- 判断
TRST引脚状态,区分仿真启动 / 独立启动;- TRST=1(仿真器连接):读取 EMU 仿真配置寄存器;
- TRST=0(独立运行):读取 OTP 的 BOOTPIN‑CONFIG;校验 KEY=0x5A 有效,读取 BOOTDEF 模式表;
- 根据配置选择对应 Boot 模式:Flash / RAM / UART / CAN / SPI / I2C / Parallel‑IO / Secure Boot / Wait;
- 如果属于下载类 Boot(UART/CAN 等):等待外部主机发送标准 Boot 数据流;
- 解析数据流,调用
CopyData()将数据块搬运至目标内存地址; - 全部数据接收完毕,跳转至数据流指定 EntryPoint 入口地址,执行用户程序。
4. Boot 通用标准数据流格式解析
所有外设 Boot 统一使用同一套数据流协议。
- 头部 16bit 键值 0x08AA,键值校验失败直接中止下载,退回 Flash 启动;
- 后续 8 个 16bit 保留字,SPI/I2C/CAN 会利用保留字配置外设时钟、波特率参数,UART、Parallel‑IO 直接丢弃;
- 32bit 程序入口点 EntryPoint 地址;
- 循环数据块:2 字节块大小 +4 字节目标存储地址 + 块数据;
- 块大小等于 0x0000,代表数据流传输结束。
字节序规则:8bit 数据流 LSB 在前,MSB 在后;32 位地址 MSW 高字在前,LSW 低字在后。
5. CopyData 公共数据复制函数机制
CopyData()是所有下载 Boot 共用底层函数。
- 函数接收函数指针
GetWordData,不同外设(UART / CAN / SPI / I2C / Parallel‑IO)实现各自的 GetWordData 读取接口; - 读取 BlockSize 块大小;块大小 = 0,直接返回结束;
- 读取目标 DestAddr;
- 循环读取块数据,搬运到芯片内部对应内存地址;
- 循环直到块大小为 0。
6. 各类外设 Boot 底层技术要点
- UART Boot:支持自动波特率检测;接收每个字节回波输出;>100k 波特率时自动波特锁定存在失效风险,建议先用低波特完成下载,应用层再切换高速波特率。
- Parallel‑IO 并行 GPIO Boot:GPIO0‑7 数据口;GPIO16 为 MCU 就绪输出,GPIO12 为主机就绪输入;需要外部上拉电阻,双向握手通信,主机与 MCU 速度互不约束。
- SPI Boot(Master 模式):作为 SPI 主机,读取外部 SPI EEPROM;SPI 初始化默认低速;数据流保留字可以修改 SPI 波特率、LOSPCP 时钟预分频。
- I2C Boot(Master 模式):I2C 主机,默认访问从机地址 0x50 的 EEPROM;默认 100Kbps,数据流保留字可以改写 I2C 时钟预分频,最高可到 400Kbps;初始化阶段不允许总线存在其他 I2C 主机。
- CAN Boot:标准 11bit ID,MSGID=0x01;默认波特率 100kbps;数据流可以传入 BTR 寄存器值动态修改 CAN 波特率;每次传输 2 字节,LSB 优先。
- Secure Boot 安全启动:读取 Flash 指定 8KB 区域,使用 OTP 内 128bit CMAC 密钥计算校验值,与 Golden 标签对比;校验成功跳转入口;校验失败进入 Wait Boot 等待循环。
阅读全文
113