2、启动模式与介质:启动模式选择(Boot Mode)、常见启动介质(NAND、eMMC、SPI NOR、SD卡)

芯片上电后,第一件事是什么?

不是跑操作系统,也不是初始化外设。而是——找启动代码。

BootROM 就像芯片的“本能反应”。它固化在硅片上,上电即执行。但它面临一个核心问题:从哪里加载启动代码?

这就引出了我们今天要聊的两个关键概念:启动模式(Boot Mode)和启动介质(Boot Media)。

2.1 启动模式:芯片的“第一选择”

说白了,启动模式就是告诉 BootROM:“嘿,你去哪个地方找启动代码?”

芯片厂商会预留几个 GPIO 引脚,专门用来配置启动模式。这些引脚在芯片复位时被采样,电平组合决定了启动顺序。

核心要点:启动模式的选择,本质上是硬件引脚电平的“投票结果”。

我见过不少工程师,软件调了半天,结果发现是启动模式引脚没拉对。嗯,这种坑我踩过不止一次。

常见的启动模式配置方式有两种:

  • 硬件引脚直接选择:比如 BOOT0、BOOT1 引脚,上拉或下拉决定启动介质。
  • eFuse / OTP 配置:一次性编程,出厂后不可更改。适合量产产品。

举个例子,某款主流 ARM Cortex-A 芯片的启动模式配置如下:

BOOT_MODE[1:0] 启动介质 优先级
00 SPI NOR Flash 第一优先
01 NAND Flash 第一优先
10 eMMC / SD 卡 第一优先
11 USB / UART 下载模式 特殊模式

你想想看,如果 BOOT_MODE 引脚被意外拉高到 11,芯片就会进入下载模式,而不是从 Flash 启动。很多开发板变砖,其实就是这个原因。

2.2 常见启动介质:各有各的脾气

不同的启动介质,有不同的接口协议、时序要求和初始化流程。BootROM 必须“认识”它们,才能正确读取数据。

2.2.1 SPI NOR Flash

这是最“老实”的启动介质。接口简单,时序固定,读操作几乎不需要配置。

  • 接口:SPI(Serial Peripheral Interface),通常使用 Quad SPI 提高速度。
  • 特点:XIP(Execute In Place)执行,代码可以直接在 Flash 上运行。
  • 容量:一般 1MB ~ 32MB,适合存放 Bootloader。

我的经验:SPI NOR 的启动速度其实不慢。我做过一个项目,用 Quad SPI 模式,读取速度能到 80MB/s 以上。但要注意,有些 Flash 需要发特定命令才能进入 Quad 模式,BootROM 不一定支持。

2.2.2 NAND Flash

NAND 就“矫情”多了。它天生有坏块,需要 ECC 校验,而且不能 XIP。

  • 接口:8 位或 16 位并行接口,也有 SPI NAND。
  • 特点:容量大(几百 MB 到几 GB),价格便宜。
  • 痛点:BootROM 必须实现坏块管理和 ECC 算法,否则启动会失败。

注意:NAND 的初始化流程很复杂。我曾经遇到一个案例,芯片上电后死活读不到 NAND 的 ID,最后发现是 NAND 的 Ready/Busy 引脚没接对。BootROM 在等待 NAND 就绪时超时了。

2.2.3 eMMC

eMMC 是“封装好的 NAND”。它内部集成了控制器,负责坏块管理和 ECC。对 BootROM 来说,eMMC 就像一个黑盒子。

  • 接口:MMC/SD 协议,通常使用 4 位或 8 位数据线。
  • 特点:启动速度快,容量大(4GB ~ 128GB),可靠性高。
  • 启动分区:eMMC 有专门的 Boot Area Partition,BootROM 可以直接读取。

我个人习惯用 eMMC 做量产产品的启动介质。省心,稳定。但要注意,eMMC 的初始化时序比较严格,BootROM 必须按照规范发送 CMD0、CMD1 等命令。

2.2.4 SD 卡

SD 卡和 eMMC 协议类似,但更“亲民”。很多开发板用 SD 卡启动,方便调试。

  • 接口:SD 协议,支持 SPI 模式和 SD 模式。
  • 特点:可插拔,方便更换。
  • 限制:BootROM 通常只支持从 SD 卡的特定扇区读取数据(比如扇区 0)。

避坑指南:我曾经遇到过 SD 卡启动失败,原因是 SD 卡的分区表格式不对。BootROM 只认 MBR 分区表,GPT 分区表它不认识。嗯,这个坑我踩了整整一天。

2.3 启动介质选择的核心逻辑

BootROM 在选择启动介质时,通常遵循以下逻辑:

  1. 读取启动模式引脚:确定第一优先级的启动介质。
  2. 初始化介质控制器:配置 GPIO、时钟、时序参数。
  3. 发送识别命令:比如 SPI 的 Read ID、NAND 的 Read ID、eMMC 的 CMD2。
  4. 读取启动数据:从固定地址(如 SPI NOR 的 0x0、eMMC 的 Boot Partition)读取 Bootloader。
  5. 校验数据完整性:通常使用 CRC 或 Checksum。
  6. 跳转到 Bootloader:如果校验通过,PC 指针跳转到加载地址。

如果第一步失败,BootROM 会尝试下一个启动介质。这就是所谓的“启动回退”机制。

我的建议:在设计产品时,一定要预留一个“救砖”启动模式。比如 USB 下载模式或 UART 下载模式。这样即使 Flash 里的代码坏了,也能通过外部工具重新烧录。

2.4 知识体系图:启动模式与介质

下面这张图展示了本章的核心逻辑:

启动模式与介质选择流程 芯片上电 读取 BOOT_MODE 引脚 选择介质 SPI NOR Flash NAND Flash eMMC SD 卡 加载 Bootloader

这张图很直观:芯片上电后,先读引脚,再选介质,最后加载代码。每一步都有坑,但每一步也都有规律可循。

2.5 小结

启动模式与介质,是 BootROM 启动流程的“第一关”。

  • 启动模式由硬件引脚决定,设计时要留好上下拉电阻。
  • 不同介质有不同的初始化流程,BootROM 必须“适配”它们。
  • SPI NOR 最简单,NAND 最复杂,eMMC 最省心,SD 卡最灵活。
  • 一定要预留“救砖”模式,这是量产产品的底线。

我个人觉得,理解这些底层细节,比单纯调 API 更有价值。因为当你遇到启动失败时,你能从根上分析问题,而不是盲目试错。

嗯,下一章我们会深入 BootROM 的代码执行流程,看看它到底是怎么一步步把控制权交给 Bootloader 的。


可可精品资料库