一、启动介质与映射:主流启动介质与设备映射表

大家好,我是你们的嵌入式系统讲师。今天咱们聊聊BootROM启动中一个非常核心的话题——启动介质与映射。说白了,就是芯片上电后,到底从哪儿把代码读进来?

我做了这么多年底层开发,见过不少工程师在启动这块栽跟头。有一次,一个同事调试了整整三天,最后发现是启动设备映射表配错了。嗯,这种坑,咱们今天一次性讲清楚。

1.1 主流启动介质:各有各的脾气

先说说常见的启动介质。每种介质都有自己的性格,选错了,板子可能就起不来。

NOR Flash

NOR Flash的特点是支持XIP(eXecute In Place),也就是代码可以直接在Flash上执行,不需要拷贝到RAM里。我个人习惯在调试阶段用NOR Flash,因为它的读取速度快,而且支持随机访问。

但NOR Flash的缺点也很明显——容量小、价格贵。一般用在代码量不大的场景,比如BIOS或者一些简单的嵌入式系统。

关键点:NOR Flash的接口通常是Parallel或SPI,启动时BootROM会直接映射到CPU的地址空间。

NAND Flash

NAND Flash就不一样了。它容量大、价格便宜,但坏块多、读取速度慢。而且NAND Flash不支持XIP,代码必须先读到RAM里才能执行。

我在项目中遇到过一个问题:NAND Flash的坏块管理没做好,导致启动代码读出来全是错的。后来我加了个坏块跳过机制,才搞定。

注意:NAND Flash的启动流程比NOR复杂得多。BootROM需要先读取一段小的引导代码(通常是4KB),这段代码负责初始化控制器、加载剩余代码。

eMMC

eMMC其实是NAND Flash加上一个控制器,对外暴露的是MMC接口。它内部帮你处理了坏块管理、ECC校验这些脏活累活。所以用eMMC启动,BootROM的工作会轻松很多。

我建议,如果产品对可靠性要求高,优先考虑eMMC。虽然贵一点,但省心。

SD卡

SD卡和eMMC的协议基本一样,只是封装不同。SD卡常用于开发调试阶段,或者一些需要用户更换存储介质的场景。

我记得有一次,客户要求产品支持从SD卡升级固件。嗯,这个功能实现起来不难,但要注意SD卡的初始化时序,有些卡反应慢,BootROM需要加超时处理。

SPI Flash

SPI Flash是成本最低的选择。它通过SPI接口连接,引脚少、布线简单。但SPI Flash的读取速度慢,而且不支持XIP(除非用特殊的映射模式)。

说白了,SPI Flash适合代码量小、对成本敏感的产品。比如一些IoT设备,用SPI Flash启动完全够用。

1.2 启动设备映射表(Boot Device Map)

芯片上电后,BootROM怎么知道该从哪个设备启动?答案就是——启动设备映射表。

这个表通常固化在芯片的ROM里,或者通过硬件引脚的电平状态来决定。我画了一张图,帮你理解这个过程:

启动设备映射与选择流程 芯片上电 BootROM执行 读取启动设备映射表 硬件引脚电平 eFuse/OTP配置 默认启动顺序 确定启动设备 → 加载代码

映射表里记录了每个启动设备的优先级和地址范围。举个例子:

优先级 启动设备 基地址 大小 说明
0(最高) eMMC 0x0000_0000 4GB 首选启动设备
1 NAND Flash 0x1000_0000 512MB 备选,坏块需跳过
2 SPI Flash 0x2000_0000 16MB 最后尝试
3 UART/USB N/A N/A 下载模式,用于调试
小技巧:我建议你在设计板子时,把调试用的UART下载模式放在最低优先级。这样正常启动时不会干扰,需要调试时又能手动进入。

1.3 启动优先级与回退机制

启动优先级,说白了就是BootROM先试哪个设备,不行就换下一个。这个机制非常重要,尤其是在产品量产阶段。

我曾经遇到过一个问题:某批次eMMC芯片有缺陷,导致启动失败。幸好BootROM有回退机制,自动切换到NAND Flash启动,产品才没有大面积报废。

回退机制通常是这样工作的:

  1. 尝试最高优先级设备:BootROM读取设备头部的签名或校验码。
  2. 校验失败:如果签名不对、CRC错误、或者设备无响应,就标记为失败。
  3. 切换到下一个设备:按照映射表的优先级顺序,尝试下一个设备。
  4. 全部失败:如果所有设备都失败,BootROM进入下载模式,等待外部工具通过UART/USB/以太网烧录固件。
注意:回退机制不是万能的。如果所有设备都坏了,板子就变砖了。所以量产时一定要做好启动介质的可靠性测试。

1.4 实际项目中的避坑指南

最后,分享几个我在项目中踩过的坑:

  • SPI Flash的时序问题:有些SPI Flash的读取速度跟不上BootROM的时钟,导致数据错位。我建议在BootROM初始化时,先降低SPI时钟频率,等代码跑起来后再调整。
  • eMMC的初始化延迟:eMMC上电后需要几十毫秒才能响应命令。BootROM如果不等够时间,就会误判设备不存在。我曾经加了个500ms的延时,问题就解决了。
  • NAND Flash的坏块问题:如果BootROM代码恰好放在坏块上,启动就会失败。我建议在烧录时,把启动代码放在NAND Flash的前几个好块里,并在BootROM中加坏块跳过逻辑。

好了,这一章的内容就到这里。启动介质和映射表是BootROM的基础,理解了这些,后面的分区适配就好办了。

核心总结:
  • NOR Flash支持XIP,适合小代码量场景
  • NAND Flash容量大,但需要坏块管理
  • eMMC最省心,但成本高
  • SPI Flash成本低,但速度慢
  • 启动设备映射表决定了BootROM从哪儿读代码
  • 回退机制是产品可靠性的最后一道防线
可可精品资料库