2、BootROM存储介质:NOR Flash、NAND Flash、eMMC、SPI Flash的特点与选择
做嵌入式启动这块,选存储介质是个绕不开的坎。说白了,BootROM 放哪儿、怎么读、能不能扛得住量产和现场升级,全看这一步选得对不对。我这些年见过不少项目,硬件画完了才发现 Flash 型号不支持 XIP,或者 NAND 的坏块管理没预留空间,最后只能改板子——那叫一个难受。
今天咱们就把这四种主流介质掰开揉碎聊清楚。你想想看,它们各自适合什么场景?为什么有些场合非 NOR 不可,有些地方用 eMMC 反而更省心?
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 单价最贵) |
2.2 NAND Flash:大容量但需要“伺候”
NAND Flash 密度高、价格低,但用起来麻烦。它不支持 XIP,所以 BootROM 必须先把一段最小启动代码(通常是 SPL)加载到内部 SRAM 里,再由 SPL 初始化 DRAM,最后把完整的 BootROM 从 NAND 拷到 DRAM 执行。
还有一个大坑——坏块。NAND 出厂就有坏块,使用过程中还会产生新坏块。BootROM 如果直接读到一个坏块,启动就挂了。
我曾经在一个车机项目里吃过这个亏。量产了 2000 台,有 30 台启动失败。查到最后,是 NAND 的某个块在老化测试后变成了坏块,而 BootROM 的坏块跳过算法没覆盖到那个边界条件。从那以后,我要求所有用 NAND 的项目必须做全盘坏块扫描,并且在 BootROM 里保留至少 4 个备份块。
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) |
| 启动速度 | 中等(需初始化控制器) |
| 成本 | 中等 |
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,不适合频繁升级的场景。
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 图是我画的一个选型决策流程,帮你快速定位该用哪种介质。
2.7 实战选型清单
最后,我把自己常用的选型检查清单分享给你。每次做 BootROM 存储选型时,对着这个清单过一遍,基本不会漏东西。
- 确认 BootROM 代码量——编译后的 .bin 文件多大?预留 50% 的余量给未来升级。
- 确认是否需要 XIP——上电后 RAM 是否可用?如果不可用,必须选 NOR 或 SPI Flash。
- 确认启动时序要求——从复位到执行第一行代码,允许多少时间?
- 确认现场升级策略——BootROM 是否支持 OTA?如果支持,要考虑双备份(A/B 分区)。
- 确认坏块处理能力——如果选 NAND,BootROM 里有没有实现坏块跳过?有没有备份块?
- 确认引脚和 PCB 空间——并行 NOR/NAND 需要 40+ 根线,SPI Flash 只要 6 根。你的板子布得下吗?
- 确认成本预算——批量 10K 以上,每片差 1 块钱就是 1 万块。SPI Flash 和 NAND 是低成本首选。