• 正文
  • 相关推荐
申请入驻 产业图谱

BootLoader 寄存器、启动流程、数据流与各外设底层技术拆解

8小时前
113
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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 执行完整流程逻辑

  1. 芯片上电 / 复位,跳转至片上 BootROM;
  2. 判断TRST引脚状态,区分仿真启动 / 独立启动;
    • TRST=1(仿真器连接):读取 EMU 仿真配置寄存器;
    • TRST=0(独立运行):读取 OTP 的 BOOTPIN‑CONFIG;校验 KEY=0x5A 有效,读取 BOOTDEF 模式表;
  3. 根据配置选择对应 Boot 模式:Flash / RAM / UART / CAN / SPI / I2C / Parallel‑IO / Secure Boot / Wait;
  4. 如果属于下载类 Boot(UART/CAN 等):等待外部主机发送标准 Boot 数据流;
  5. 解析数据流,调用CopyData()将数据块搬运至目标内存地址;
  6. 全部数据接收完毕,跳转至数据流指定 EntryPoint 入口地址,执行用户程序。

4. Boot 通用标准数据流格式解析

所有外设 Boot 统一使用同一套数据流协议。

  1. 头部 16bit 键值 0x08AA,键值校验失败直接中止下载,退回 Flash 启动;
  2. 后续 8 个 16bit 保留字,SPI/I2C/CAN 会利用保留字配置外设时钟、波特率参数,UART、Parallel‑IO 直接丢弃;
  3. 32bit 程序入口点 EntryPoint 地址;
  4. 循环数据块:2 字节块大小 +4 字节目标存储地址 + 块数据;
  5. 块大小等于 0x0000,代表数据流传输结束。

字节序规则:8bit 数据流 LSB 在前,MSB 在后;32 位地址 MSW 高字在前,LSW 低字在后。

5. CopyData 公共数据复制函数机制

CopyData()是所有下载 Boot 共用底层函数。

  1. 函数接收函数指针GetWordData,不同外设(UART / CAN / SPI / I2C / Parallel‑IO)实现各自的 GetWordData 读取接口;
  2. 读取 BlockSize 块大小;块大小 = 0,直接返回结束;
  3. 读取目标 DestAddr;
  4. 循环读取块数据,搬运到芯片内部对应内存地址;
  5. 循环直到块大小为 0。

6. 各类外设 Boot 底层技术要点

  1. UART Boot:支持自动波特率检测;接收每个字节回波输出;>100k 波特率时自动波特锁定存在失效风险,建议先用低波特完成下载,应用层再切换高速波特率。
  2. Parallel‑IO 并行 GPIO Boot:GPIO0‑7 数据口;GPIO16 为 MCU 就绪输出,GPIO12 为主机就绪输入;需要外部上拉电阻,双向握手通信,主机与 MCU 速度互不约束。
  3. SPI Boot(Master 模式):作为 SPI 主机,读取外部 SPI EEPROM;SPI 初始化默认低速;数据流保留字可以修改 SPI 波特率、LOSPCP 时钟预分频。
  4. I2C Boot(Master 模式):I2C 主机,默认访问从机地址 0x50 的 EEPROM;默认 100Kbps,数据流保留字可以改写 I2C 时钟预分频,最高可到 400Kbps;初始化阶段不允许总线存在其他 I2C 主机。
  5. CAN Boot:标准 11bit ID,MSGID=0x01;默认波特率 100kbps;数据流可以传入 BTR 寄存器值动态修改 CAN 波特率;每次传输 2 字节,LSB 优先。
  6. Secure Boot 安全启动:读取 Flash 指定 8KB 区域,使用 OTP 内 128bit CMAC 密钥计算校验值,与 Golden 标签对比;校验成功跳转入口;校验失败进入 Wait Boot 等待循环。

相关推荐