为什么这一选择决定整个设计 #
每个嵌入式和边缘系统都需要非易失性存储器来保存上电时运行的代码,而且往往还需要保存其采集的数据。两大主流技术——NOR Flash 和 NAND Flash——虽然共享“Flash”之名,但行为方式却大不相同。选错了一个,就会得到一块无法启动的板子、一份成本高于应有的物料清单,或者在真实现场条件下性能退化的存储。
这一决策不是“哪个更好”,而是“哪种访问模型与工作负载相匹配”。本指南将梳理架构差异、真正驱动选型的各个维度,以及最终决定选择的应用适配场景。
两种架构,两种访问模型 #
NOR Flash 的设计使主机可以通过内存映射总线直接读取任意字节。这使其可随机访问,并且关键在于能够就地执行代码(XIP)——CPU 直接从器件取指令。读取速度快且一致;写入和擦除相对较慢,因为擦除块相对较大(通常为 64–256 KB),而且该技术针对读取稳定性而非写入吞吐量进行了优化。串行 NOR(SPI、QSPI、Octal/OSPI)目前在启动和固件角色中占据主导地位,密度最高约达 2 Gb。
NAND Flash 按页和块组织,顺序读写。它不支持内存映射,也无法就地执行代码,需要控制器或软件栈来管理坏块、磨损均衡和纠错。但换来的好处是密度高得多——单颗器件容量从几吉比特到几太比特不等——每比特成本也低得多。批量编程/擦除吞吐量同样远高于 NOR。
一句话概括:NOR 用来读代码,NAND 用来存数据。 大多数两者都需要的系统会各用一颗。
决定选型的几个维度 #
| 维度 | NOR Flash | NAND Flash |
|---|---|---|
| 访问模型 | 随机访问,可按字节/字寻址,支持 XIP | 页/块顺序访问,不支持 XIP |
| 最佳读取模式 | 代码执行、频繁随机读取 | 批量顺序读写 |
| 典型容量 | 约 512 Mb – 2 Gb(串行 NOR) | 1 Gb – 数 Tb |
| 读取延迟 | 随机访问极低 | 较高;针对吞吐量优化 |
| 写入/擦除速度 | 慢 | 大批量时快 |
| 耐久性 | 高(通常 100k+ 次循环) | 每块较低,由控制器管理 |
| 可靠性开销 | 位错误罕见;ECC 需求极低 | 需要 ECC + 坏块管理 |
| 常见接口 | SPI、QSPI、Octal/OSPI、并行 | 原始 ONFI NAND、eMMC、UFS |
| 每比特成本 | 较高 | 较低 |
| 典型用途 | 引导加载程序、固件、配置 | 操作系统镜像、文件系统、数据记录 |
根据应用选择合适的存储器 #
- 需要执行的启动代码和固件: 选 NOR。几乎所有 MCU 或 SoC 都从 NOR 取第一条指令——要么是内部裸片闪存,要么是外部 QSPI 器件。复位向量需要的正是随机访问和 XIP 特性。
- 以读取为主的配置和校准数据: 还是 NOR。写入不频繁、读取频繁,正是它的用武之地。
- 操作系统镜像、大型固件、Linux 根文件系统: 选 NAND。一旦出货量达到几十或几百兆字节,NOR 的密度和每比特成本就撑不住了。
- 数据记录、事件记录、黑匣子缓冲: 选 NAND。这类负载顺序写入、写入量大,NAND 的擦除/写入吞吐量和密度更有优势。
- 现场固件更新(FOTA): 通常采用双 bank NOR 布局,或 NOR + NAND 组合——NOR 存放活动镜像和回退镜像,NAND 存放更大的更新载荷。
串行 NOR 的实际应用 #
启动和固件存储主要靠串行 NOR。Winbond 的 W25Q、GigaDevice 的 GD25 等系列覆盖 1 Mb 至 2 Gb,提供 SOIC、WSON、USON 封装,电源轨为 1.8 V 或 3.3 V,支持 QSPI 实现快速 XIP,Octal/OSPI 则可提高指令吞吐量。以 W25Q128JVSIQ 或 GD25Q128ESIGR 这类 128 Mbit 器件为例,足以容纳相当规模的引导加载程序和应用程序镜像,满足许多 Cortex-M 和 FPGA 配置流程的需求。
实践中的 NAND:原始型与托管型 #
原始 NAND(ONFI 兼容的并行或串行 NAND)成本低、灵活,但需要 FTL 或控制器来管理坏块表、磨损均衡和 ECC 引擎。托管 NAND——eMMC 和 UFS——把这些都封装在标准接口之后,对于不想自己维护闪存转换层的团队来说,通常风险更低。
NAND 内部,单元类型很关键:SLC 最可靠、耐久性最好(工业和汽车记录首选),MLC 以耐久性换取密度,TLC 则将密度和每比特成本推向极致,代价是写入寿命。伪 SLC(pSLC)是工业领域常见的折中方案。
接口与控制器成本 #
存储器价格只是账单的一部分。基于 SPI 的 NOR 几乎不需要控制器逻辑——MCU 内置的 QSPI 外设通常就足够了。NAND 需要 ECC 引擎,以及软件栈(用于原始 NAND)或 eMMC/UFS 控制器(用于托管 NAND)。这一差异体现在固件复杂度、验证时间上,对于原始 NAND 还体现在长期现场可靠性上。对于仅含小型固件的设计,即使原始器件成本更高,NOR 往往也是更便宜的*系统*。
实用选型清单 #
- 代码需要在启动时就地执行吗?→ NOR。
- 数据主要是顺序的且大于约 512 Mb 吗?→ NAND。
- 环境恶劣(宽温度、振动、长使用寿命)吗?→ NOR 或 SLC/pSLC NAND,如有要求则采用汽车级认证。
- 你既需要启动又需要大容量存储吗?→ 用于启动的 QSPI NOR 加上用于数据的托管 NAND,或内部 MCU 闪存加上外部 NAND。
- 固件简洁性优先于原始器件成本吗?→ 倾向于 托管 NAND 或 NOR。
购买前需要确认的事项 #
采购这两种技术时,别只看系列名称。串行 NOR 的容量、电压(1.8 V 还是 3.3 V)、封装(SOIC 还是 WSON/USON)、速度等级和汽车级认证(AEC-Q100)都藏在后缀里——W25Q128 的“JVSIQ”和“JVSIM”封装和温度等级就不同。NAND 则要确认单元类型(SLC/MLC/TLC)、是托管还是原始接口、ECC 要求,以及针对你的写入模式的耐久性指标。对于长寿命工业和汽车产品,可追溯性和日期码与标称容量同样重要。
结论 #
如果负载是必须随机读取并就地执行的代码和配置——引导程序、固件和校准数据——就选 NOR Flash。如果需要高密度、低成本地顺序存储操作系统镜像和日志数据,就选 NAND Flash。两者与其说是竞争,不如说是互补,许多量产设计会同时使用。根据应用实际的读写模式来确定接口、容量、耐久性和认证,而不是笼统地按“Flash”一项来选,存储子系统的其余部分往往也就顺理成章了。
