2、BootROM存储介质:NOR Flash、NAND Flash、eMMC、SPI Flash的特点与选择

做嵌入式启动这块,选存储介质是个绕不开的坎。说白了,BootROM 放哪儿、怎么读、能不能扛得住量产和现场升级,全看这一步选得对不对。我这些年见过不少项目,硬件画完了才发现 Flash 型号不支持 XIP,或者 NAND 的坏块管理没预留空间,最后只能改板子——那叫一个难受。

今天咱们就把这四种主流介质掰开揉碎聊清楚。你想想看,它们各自适合什么场景?为什么有些场合非 NOR 不可,有些地方用 eMMC 反而更省心?

核心观点:没有最好的介质,只有最合适的。选型的关键在于——你的 BootROM 需不需要就地执行?代码量多大?现场升级频率如何?成本敏感度多高?

2.1 NOR Flash:能直接跑代码的老将

NOR Flash 最大的特点就是支持 XIP(eXecute In Place)。什么意思?就是 CPU 可以直接从 NOR Flash 里取指令执行,不用先把代码拷到 RAM 里。这对 BootROM 来说太重要了——上电瞬间 RAM 还没初始化,代码就得跑起来,NOR 是唯一能胜任的。

我记得有个项目做工业控制器,要求上电到输出控制信号不能超过 50ms。用 NOR 做 BootROM,CPU 上电后直接从 NOR 的 0x0 地址开始执行,省掉了拷贝时间,最终 30ms 就完成了启动。

特性 NOR Flash
接口 并行(CFI)/ SPI
读取速度 快(支持随机访问)
写入速度 慢(擦除前需写 0xFF)
密度 低(通常 ≤ 512Mb)
可靠性 高(坏块极少)
成本 高(每 MB 单价最贵)
我的习惯:只要 BootROM 代码量在 2MB 以内,且需要 XIP,我首选 Quad SPI NOR。引脚少、布线简单,读取速度也能到 80MB/s 以上,够用了。

2.2 NAND Flash:大容量但需要“伺候”

NAND Flash 密度高、价格低,但用起来麻烦。它不支持 XIP,所以 BootROM 必须先把一段最小启动代码(通常是 SPL)加载到内部 SRAM 里,再由 SPL 初始化 DRAM,最后把完整的 BootROM 从 NAND 拷到 DRAM 执行。

还有一个大坑——坏块。NAND 出厂就有坏块,使用过程中还会产生新坏块。BootROM 如果直接读到一个坏块,启动就挂了。

我曾经在一个车机项目里吃过这个亏。量产了 2000 台,有 30 台启动失败。查到最后,是 NAND 的某个块在老化测试后变成了坏块,而 BootROM 的坏块跳过算法没覆盖到那个边界条件。从那以后,我要求所有用 NAND 的项目必须做全盘坏块扫描,并且在 BootROM 里保留至少 4 个备份块。

避坑指南:NAND 的页大小和块大小因型号而异。选型时一定要确认 BootROM 的加载器能适配具体的页大小(常见 2KB/4KB/8KB)和 OOB 区域大小。我曾经见过有人把 4KB 页的驱动用在 2KB 页的芯片上,读出来的数据全是乱的。

2.3 eMMC:省心但启动流程复杂

eMMC 本质上就是 NAND Flash 加了一个控制器,坏块管理、磨损均衡、ECC 都由内部搞定了。对固件工程师来说,eMMC 就是个标准的块设备,用 MMC 协议读写就行。

但 eMMC 的启动有个特殊机制——Boot Partition。eMMC 内部有专门的 Boot Area,可以配置为上电后自动输出启动数据。CPU 只需要在 BootROM 里实现一个简单的 MMC 初始化序列,就能从 eMMC 的 Boot Partition 里把代码读出来。

我建议你在用 eMMC 做启动介质时,一定要仔细看芯片的 datasheet 里的 Boot Operation 章节。不同厂商(三星、东芝、海力士)的 Boot 时序有细微差别,尤其是 ACK 超时时间和重试次数。

特性 eMMC
接口 MMC(4/8 bit)
启动方式 Boot Partition / 用户分区
坏块管理 内置(对软件透明)
密度 高(4GB ~ 256GB)
启动速度 中等(需初始化控制器)
成本 中等
个人经验:eMMC 的 Boot Partition 大小通常是 4MB 或 8MB,刚好够放一个精简的 BootROM。我会把 BootROM 放在 Boot Partition,把 kernel 和 rootfs 放在用户分区。这样即使 rootfs 坏了,BootROM 还能进恢复模式。

2.4 SPI Flash:小身材、低成本、够用

SPI Flash 其实是 NOR Flash 的一种,只不过接口改成了 SPI 总线。它继承了 NOR 的 XIP 能力,但引脚更少(6~8 个),封装更小,成本也更低。

现在很多 MCU 和 SoC 都支持从 SPI Flash 直接启动。你只需要把 Flash 的 CS、CLK、MOSI、MISO 四根线连到芯片的 SPI 接口上,上电后芯片会自动通过 SPI 读取前 512 字节(或更多)来执行。

嗯,这里要注意:SPI Flash 的读取速度受限于 SPI 时钟频率。常见的 W25Q64 系列,Quad SPI 模式下读速度能到 80MHz(约 40MB/s),但写速度只有几百 KB/s。所以 SPI Flash 适合放只读的 BootROM,不适合频繁升级的场景。

选型建议:如果你的 BootROM 小于 1MB,且不需要频繁更新,SPI Flash 是最经济的选择。一颗 W25Q16(2MB)批量价不到 2 块钱,比 NOR 便宜一个数量级。

2.5 四种介质的对比与选择

下面这张表是我自己整理的核心对比,每次选型我都会拿出来对照一下。

维度 NOR Flash NAND Flash eMMC SPI Flash
XIP 支持 ✅ 是 ❌ 否 ❌ 否 ✅ 是
典型密度 1MB ~ 64MB 128MB ~ 8GB 4GB ~ 256GB 512KB ~ 16MB
读速度 快(随机访问) 快(顺序读) 快(DMA 传输) 中(受 SPI 时钟限制)
写速度 慢 中 快 慢
坏块管理 无需 必须软件处理 内置 无需
引脚数 多(并行 40+) 多(并行 40+) 中(13~17) 少(6~8)
成本 高 低 中 极低
典型场景 BootROM、BIOS 嵌入式 Linux 启动 手机、平板、高端嵌入式 MCU 启动、IoT 设备

2.6 知识体系:存储介质选型决策流

下面这张 SVG 图是我画的一个选型决策流程,帮你快速定位该用哪种介质。

BootROM 存储介质选型决策流程 BootROM 存储介质选型决策流程 BootROM 存储需求 是否需要 XIP(就地执行)? 代码量 < 2MB 且上电即需执行 是 否 NOR Flash / SPI Flash 支持 XIP,引脚少 NAND / eMMC 需加载到 RAM 执行 成本敏感? 批量 > 10K 片 容量 > 4GB? 需存储大文件系统 是 否 是 否 SPI Flash 低成本,小容量,XIP NOR Flash 高可靠,中等容量,XIP eMMC 大容量,内置管理,省心 NAND Flash 大容量,低成本,需坏块管理 选型说明 • 如果 BootROM 代码量 < 2MB 且需要 XIP → SPI Flash 性价比最高 • 如果代码量 2~64MB 且需要高可靠性 → NOR Flash • 如果需要大容量存储 + 启动 → eMMC(省心)或 NAND(省钱)

2.7 实战选型清单

最后,我把自己常用的选型检查清单分享给你。每次做 BootROM 存储选型时,对着这个清单过一遍,基本不会漏东西。

  1. 确认 BootROM 代码量——编译后的 .bin 文件多大?预留 50% 的余量给未来升级。
  2. 确认是否需要 XIP——上电后 RAM 是否可用?如果不可用,必须选 NOR 或 SPI Flash。
  3. 确认启动时序要求——从复位到执行第一行代码,允许多少时间?
  4. 确认现场升级策略——BootROM 是否支持 OTA?如果支持,要考虑双备份(A/B 分区)。
  5. 确认坏块处理能力——如果选 NAND,BootROM 里有没有实现坏块跳过?有没有备份块?
  6. 确认引脚和 PCB 空间——并行 NOR/NAND 需要 40+ 根线,SPI Flash 只要 6 根。你的板子布得下吗?
  7. 确认成本预算——批量 10K 以上,每片差 1 块钱就是 1 万块。SPI Flash 和 NAND 是低成本首选。
最后提醒一句:别只看 datasheet 上的理论速度。实际读速度受 PCB 走线、信号完整性、CPU 的 Flash 控制器性能影响很大。我建议你在选型阶段就做一次实际读取测试——用示波器抓一下 CLK 和 Data 线的波形,看看有没有毛刺或反射。这个习惯帮我避免过至少三次量产事故。