启动模式与介质选择:BootROM 如何找到你的镜像

芯片上电后,第一件事就是跑 BootROM。但 BootROM 怎么知道该从哪儿加载镜像?是 NAND Flash,还是 SPI NOR,还是 USB?

这个问题,说白了就是启动模式的选择。我早年做第一款 SoC 时,觉得这不过是读几个 GPIO 电平的事。直到有一次,板子死活起不来,查了三天才发现是启动引脚的上拉电阻焊错了。嗯,从那以后,我对启动模式这部分再也不敢掉以轻心。

BootROM 支持的启动介质

不同的芯片,支持的介质种类会有差异。但主流嵌入式 SoC 基本都覆盖了下面这几类:

介质类型 典型接口 速度等级 常见场景
SPI NOR Flash SPI / QSPI / OSPI 中低速(~100MB/s) 小容量固件、安全启动、FPGA 配置
NAND Flash Raw NAND 接口 中速(~50MB/s) 大容量存储、低成本方案
eMMC MMC / SD 接口 高速(~400MB/s) 主流嵌入式 Linux 系统
UART UART(串口) 极低速(115200bps) 调试、工厂烧录、救砖
USB USB 2.0 / 3.0 中高速(~480MB/s) 开发阶段下载、量产烧录
我个人的习惯:量产产品尽量用 eMMC 或 SPI NOR。NAND 虽然便宜,但坏块管理、ECC 校验在 BootROM 阶段处理起来很麻烦。UART 和 USB 只用于开发调试,别指望它们做产品级启动。

启动模式引脚配置

芯片怎么知道用哪种介质?靠的是启动模式引脚(Boot Mode Pins)。

这些引脚通常在芯片复位时被采样,采样值决定了 BootROM 的行为。采样方式有两种:

  • 硬件引脚采样:芯片上电时,通过 GPIO 电平组合确定启动介质。比如 3 个引脚,可以编码 8 种模式。
  • OTP / eFuse 配置:一次性可编程存储,出厂后不可更改。适合安全要求高的场景。

我见过一个项目,工程师把启动引脚直接悬空了。结果芯片每次上电都随机选一种介质启动,十次里有八次起不来。你想想看,这种问题查起来多崩溃。

避坑指南:启动引脚必须用外部电阻拉高或拉低,不能悬空。我曾经在量产前才发现某批次板子的启动引脚虚焊,差点导致整批返工。建议在 PCB 设计阶段就把启动引脚的测试点留出来。

启动优先级与回退机制

BootROM 不是只试一次就放弃的。它有一套优先级逻辑,按顺序尝试各个介质。如果第一个介质没找到有效镜像,就自动跳到下一个。

典型的优先级顺序是这样的:

  1. USB / UART(开发模式,优先级最高)
  2. eMMC(主存储介质)
  3. NAND Flash(备选存储)
  4. SPI NOR(最后兜底)

为什么 USB/UART 优先级最高?因为开发阶段你经常需要强制从 PC 下载镜像。如果芯片先尝试了 Flash 里的旧镜像,可能就跳过了你的新固件。

回退机制的核心逻辑是:BootROM 在每个介质上都会尝试加载一个合法的镜像头(Boot Header)。如果头校验失败,就认为该介质无效,继续尝试下一个。

关键点:回退机制不是无限循环的。BootROM 通常只完整扫描一轮,如果所有介质都失败,芯片会进入一个死循环或等待状态。这时候只能靠硬件复位或外部干预。

启动流程的完整逻辑

我把整个启动模式选择的逻辑画成了一张图,方便你理解:

BootROM 启动模式选择与回退流程 BootROM 启动模式选择与回退流程 芯片上电 / 复位 采样启动模式引脚 USB/UART 是否使能? 是 USB/UART 下载 否 尝试 eMMC 启动 eMMC 有效? 是 否 尝试 NAND 启动 NAND 有效? 是 否 所有介质失败 → 死循环 说明 BootROM 按优先级 依次尝试各介质。 一旦某个介质校验 通过,立即跳转 执行,不再回退。

这张图展示的是典型的四阶段回退流程。实际芯片可能会更多或更少,但逻辑是一样的:按优先级尝试,失败就跳下一个,直到成功或彻底失败。

实际项目中的选择建议

说了这么多理论,我结合自己的经验给你几条实在的建议:

  • 量产产品:优先用 eMMC 或 SPI NOR。eMMC 自带坏块管理和 ECC,BootROM 处理起来最省心。SPI NOR 虽然慢,但可靠性极高,适合安全启动。
  • 开发阶段:保留 USB 或 UART 启动模式。我习惯在 PCB 上留一组跳线,可以强制进入 USB 下载模式。这样即使 Flash 里的镜像坏了,也能通过 USB 重新烧录。
  • 多介质冗余:如果产品对可靠性要求极高(比如车规、工业控制),可以考虑 SPI NOR + eMMC 双备份。SPI NOR 放最小启动镜像,eMMC 放完整系统。BootROM 先试 eMMC,失败后回退到 SPI NOR 启动恢复程序。
注意:多介质冗余虽然可靠,但会显著增加 BootROM 的复杂度。我见过一个项目,BootROM 代码里光介质切换逻辑就占了 40% 的容量。如果你的 BootROM 空间有限(比如只有 64KB),别贪多,选一两种主流介质就够了。