嵌入式存储介质:NOR Flash、NAND Flash、eMMC、SD卡的特点与差异

做嵌入式系统,选存储介质是基本功。我见过不少项目,硬件选型时没想清楚,后期软件适配改到崩溃。说白了,每种存储介质都有自己的脾气,摸透了才能用好。

这一章我们聊聊四种最常见的嵌入式存储介质:NOR Flash、NAND Flash、eMMC 和 SD 卡。它们各有各的用武之地,也各有各的坑。

NOR Flash:代码就地执行的老将

NOR Flash 最大的特点是什么?支持 XIP(eXecute In Place,就地执行)。这意味着 CPU 可以直接从 NOR Flash 里读取指令并执行,不需要先把代码拷贝到 RAM 里。你想想看,这对那些对启动速度要求极高的场景有多重要。

我记得做第一个车载项目时,要求上电后 200ms 内必须显示 Logo。当时用的就是 NOR Flash 存放 Bootloader,CPU 直接在上面跑,省掉了从别处搬运代码的时间。

NOR Flash 核心特性:

  • 读取速度快,适合存代码
  • 写入和擦除速度慢(擦除以块为单位,通常 64KB~128KB)
  • 容量偏小,常见 1MB~256MB
  • 接口简单(SRAM-like 并行接口或 SPI 串行接口)
  • 可靠性高,坏块率极低

我的经验:SPI NOR Flash 现在很流行,引脚少、布线简单。但要注意,SPI 模式下 XIP 效率会受限于时钟频率。如果 CPU 主频很高,建议用 Quad SPI 或 Dual Quad SPI 模式,能提升不少读取吞吐量。

NAND Flash:大容量存储的主力

NAND Flash 和 NOR 走的是完全不同的路线。它容量大、成本低,但操作方式复杂得多。为什么?因为 NAND 的存储单元是串行连接的,读写必须按页(Page)进行,擦除按块(Block)进行。

这里有个关键点:NAND Flash 天生就有坏块。这不是质量问题,是工艺决定的。出厂时就有坏块,使用过程中还会产生新的坏块。所以,用 NAND 必须搭配坏块管理和 ECC(纠错码)。

我曾经接手过一个项目,前任工程师直接把 NAND 当 NOR 用,不做坏块管理。结果产品用了三个月,文件系统就崩了。嗯,那场面挺惨的。

对比项 NOR Flash NAND Flash
读取速度 快(支持 XIP) 较快(需先读到 RAM)
写入速度 慢 快(页编程)
擦除速度 慢 快
容量 小(MB 级) 大(GB 级)
坏块 极少 有(需管理)
接口 SRAM-like / SPI NAND 接口 / SPI
典型用途 BootROM、代码存储 文件系统、大容量数据

避坑指南:我曾经在选型时忽略了一个细节——NAND Flash 的页大小。早期 NAND 是 512B 页,现在主流是 4KB 甚至 8KB 页。如果你的文件系统块大小和 NAND 页大小不匹配,性能会大打折扣。建议选型时直接确认好页大小和块大小,再决定用什么文件系统(比如 YAFFS、UBIFS)。

eMMC:把复杂留给自己

eMMC 本质上是一颗 NAND Flash 加上一个控制器,封装在一起。控制器帮你处理了坏块管理、ECC、磨损均衡这些脏活累活。对外暴露的是标准 MMC 接口,用起来像操作一块硬盘。

我个人习惯在需要大容量存储且不想折腾底层 NAND 驱动时,优先选 eMMC。尤其是 Linux 系统,eMMC 可以直接挂载为块设备,省心很多。

但 eMMC 也有它的脾气:

  • 启动过程复杂:eMMC 有 Boot Partition、RPMB(Replay Protected Memory Block)、User Area 等多个分区区域。BootROM 要从 eMMC 启动,必须先把代码放到 Boot Partition 里。
  • 寿命问题:虽然控制器做了磨损均衡,但频繁写入还是会让 eMMC 提前退休。我见过一个数据采集设备,每天写几十 GB 数据,eMMC 半年就挂了。
  • 固件依赖:eMMC 内部有固件,不同厂商的固件行为有差异。换供应商时,一定要重新做兼容性测试。

我的建议:如果项目对可靠性要求高,比如车规级或工业级,选 eMMC 时要注意温度等级和耐久度(P/E Cycle)。消费级 eMMC 的 P/E 一般在 1000~3000 次,工业级可以到 5000 次以上。别为了省几块钱选错等级,后期返修成本会让你哭。

SD 卡:可插拔的便利与风险

SD 卡和 eMMC 本质上是一家人——内部都是 NAND + 控制器。但 SD 卡是可插拔的,这就带来了两个问题:接触可靠性和热插拔。

我做过一个手持设备,用 SD 卡存日志。刚开始没做防抖处理,用户插拔时经常导致文件系统损坏。后来加了检测电路和软件卸载流程,才算稳定下来。

SD 卡在嵌入式系统里的典型用法:

  • 数据存储:日志、图片、视频等大文件
  • 系统升级:把固件放到 SD 卡,Bootloader 读取后更新
  • 扩展存储:主存储不够时,插卡扩容

但要注意,SD 卡不是为频繁写入设计的。尤其是那些便宜的卡,写入寿命可能只有几百次 P/E。如果项目需要频繁写数据,建议用工业级 SD 卡,或者干脆换 eMMC。

四种介质的选择逻辑

说了这么多,到底怎么选?我画了一张图,帮你理清思路。

嵌入式存储介质选型决策流程 存储需求分析 是否需要代码就地执行(XIP)? 是 NOR Flash 否 NAND / eMMC / SD 是否需要可插拔? 是 SD 卡 否 eMMC 说明 NAND 适合裸片级开发 eMMC/SD 适合块设备场景

选型时,我一般按这个思路走:

  1. 先看是否需要 XIP——需要的话,NOR Flash 是唯一选择。BootROM 和早期启动代码通常放这里。
  2. 再看容量需求——超过 256MB,基本告别 NOR,进入 NAND 阵营。
  3. 然后看是否需要可插拔——需要就选 SD 卡,不需要就选 eMMC。
  4. 最后看开发资源——如果团队有 NAND 驱动经验,裸 NAND 成本更低;如果想省事,eMMC 是更好的选择。

总结一下:

  • NOR Flash:代码执行,启动快,容量小
  • NAND Flash:大容量,成本低,需要坏块管理和 ECC
  • eMMC:NAND + 控制器,块设备接口,省心但贵一点
  • SD 卡:可插拔,方便扩展,但可靠性不如 eMMC