1. 闪存技术基础:NOR与NAND的起源与共性
在嵌入式系统和存储设备中,NOR Flash和NAND Flash就像一对性格迥异的双胞胎。它们都诞生于上世纪80年代,由东芝公司的舛冈富士雄博士发明,但设计理念和应用方向却大相径庭。这两种技术都属于非易失性存储器(NVM),即断电后数据不会丢失,这使它们成为现代电子设备中不可或缺的存储解决方案。
从物理结构来看,NOR和NAND都采用浮栅晶体管作为基本存储单元。数据存储的原理是通过在浮栅中注入或释放电子来改变晶体管的阈值电压,从而表示"0"或"1"。这种设计使得它们既具备了EEPROM的可擦写特性,又通过块擦除机制大幅提高了存储密度。
技术细节:浮栅晶体管中的电子可以保持10年以上不丢失,但反复擦写会导致氧化层磨损,这也是闪存有写入寿命限制的根本原因。
2. 核心差异解析:从物理结构到性能表现
2.1 内部架构与接口设计
NOR Flash采用并行架构,每个存储单元都直接连接到位线,就像城市中每家每户都有独立的门牌号和直达道路。这种设计使得CPU可以通过地址总线直接访问任意存储单元,实现真正的随机访问。典型的NOR芯片拥有独立的地址和数据引脚,例如16位数据总线加20位地址总线,这与SRAM的接口非常相似。
NAND Flash则采用了串联结构,存储单元像链条一样连接在一起。这种设计大幅减少了连线数量,通常只需要8个I/O引脚就能完成所有操作(命令、地址和数据都通过这组引脚分时传输)。带来的代价是必须按"页"(通常2KB或4KB)为单位进行读写,按"块"(通常128KB或256KB)为单位进行擦除。
2.2 存取方式对比
NOR的随机读取延迟通常在100ns以内,与DRAM相当,这使得它非常适合存储需要直接执行的代码。在实际应用中,我们经常看到这样的场景:嵌入式系统的Bootloader直接存放在NOR Flash中,上电后CPU直接从NOR中取指令执行,无需任何中间拷贝过程。
NAND的读取则需要经过复杂的寻址过程:
- 发送读命令(0x00)
- 分多次发送目标地址(通常需要5个周期)
- 等待数据准备就绪(tR时间,约25μs)
- 以50ns/byte的速度串行输出整个页的数据
这种差异就像查字典:NOR可以像纸质字典一样直接翻到目标页,而NAND必须像电子词典那样先输入关键词再等待系统返回结果。
2.3 写入与擦除机制
所有Flash存储器都遵循"先擦后写"的原则,这是因为浮栅晶体管只能将bit从"1"变成"0",擦除操作则是将整个块恢复为全"1"状态。NOR的擦除操作需要施加高电压(约10V)长达5秒,而NAND只需要3-4ms就能完成,这主要得益于:
- 更小的擦除单位(NAND块通常128KB,NOR块可能达1MB)
- 更简单的单元结构(NAND的串联设计减少了选择晶体管数量)
- 更高效的擦除算法(NAND采用FN隧穿效应,NOR需要热电子注入)
写入速度方面,NOR的典型字节编程时间约10μs,而NAND的页编程时间约200μs(但一次可以写入2KB)。换算下来,NAND的写入吞吐量可达NOR的20倍以上。
3. 性能参数实测对比
通过实际测试数据可以更直观地理解两者的差异:
| 参数 | NOR Flash | NAND Flash |
|---|---|---|
| 随机读取延迟 | 70-100ns | 25μs(需整页读取) |
| 顺序读取速度 | 100MB/s | 400MB/s |
| 写入速度 | 0.1MB/s | 20MB/s |
| 擦除时间 | 5s/块 | 3ms/块 |
| 擦写寿命 | 10万次 | 3000次(SLC)/1000次(MLC) |
| 位翻转率 | <1e-15 | 1e-7(需ECC校验) |
值得注意的是,NAND Flash的位翻转问题(某些bit可能自发改变状态)比NOR严重得多,因此必须配合ECC(错误校验与纠正)算法使用。现代NAND控制器通常会采用BCH或LDPC等纠错编码,能够检测并纠正每512字节中的数十个错误位。
4. 应用场景选择指南
4.1 NOR Flash的典型应用
-
启动代码存储:在嵌入式Linux系统中,U-Boot通常存放在NOR中,因为它需要在上电初期就被CPU直接执行。例如,某工业控制器的启动流程:
- 上电后CPU从NOR的0x00000000地址取指
- 执行Bootloader初始化硬件
- 将内核从NOR拷贝到RAM
- 跳转到RAM中执行内核
-
实时系统代码:汽车ECU、医疗设备等对可靠性要求极高的场景,NOR的确定性访问延迟(无垃圾回收引起的抖动)是关键优势。
-
小容量配置存储:许多路由器使用NOR来存储固件和配置参数,容量通常在4-16MB范围。
4.2 NAND Flash的主战场
-
大容量数据存储:
- 智能手机的eMMC/UFS存储(64-512GB)
- SSD固态硬盘(500GB-4TB)
- SD/microSD存储卡(32GB-1TB)
-
流式数据记录:
- 行车记录仪的连续视频写入
- 工业传感器的长时间数据采集
- 无人机的飞行日志记录
-
低成本大容量需求:
- 数码相框的图片存储
- 电子书的内容存储
- 智能电视的系统升级包
5. 选型决策树与工程实践
5.1 选型决策流程
当面临存储方案选择时,可以按照以下流程进行决策:
code复制是否需要XIP(芯片内执行)?
是 → 选择NOR Flash
否 → 是否需要>16MB容量?
是 → 选择NAND Flash
否 → 是否需要高可靠性?
是 → 选择NOR Flash
否 → 根据成本/性能权衡选择
5.2 混合使用案例
在实际工程中,经常看到NOR+NAND的组合方案:
- 某智能电表设计:
- 4MB NOR存储计量程序和关键参数
- 128MB NAND存储历史用电数据和事件日志
- 利用NOR启动后,将NAND驱动程序加载到RAM
- 通过文件系统管理NAND上的数据
5.3 使用注意事项
NOR Flash的编程技巧:
- 尽量合并写操作(缓冲多个字节后一次性写入)
- 避免频繁擦写同一块(考虑磨损均衡算法)
- 关键数据应存储多个副本(防止位翻转)
NAND Flash的工程经验:
- 必须实现ECC校验(至少1bit/512Byte的汉明码)
- 建议使用FTL(Flash Translation Layer)管理坏块
- 预留足够的OP(Over-Provisioning)空间(建议7-28%)
- 定期进行数据刷新(防止电荷泄漏导致数据丢失)
6. 新兴技术与发展趋势
随着3D NAND技术的成熟,NAND的容量优势进一步扩大。目前主流厂商已量产232层3D NAND,单颗芯片容量可达1Tb。而NOR领域也出现了创新:
- NOR的串行接口:SPI NOR通过四线接口(CLK,CS,DI,DO)提供低成本解决方案
- Xccela总线:将NOR的吞吐量提升至400MB/s(如华邦的OctaFlash)
- MRAM/RRAM替代:新型存储器试图取代NOR在代码存储领域的地位
在嵌入式Linux系统中,NOR通常用于存储U-Boot和内核镜像,而根文件系统则可能存放在NAND或eMMC中。一个典型的存储布局可能是:
code复制NOR Flash布局:
0x00000000 - 0x0003FFFF: Bootloader (256KB)
0x00040000 - 0x001BFFFF: Linux内核 (1.5MB)
0x001C0000 - 0x01FFFFFF: 备用区/配置区 (28.5MB)
NAND Flash布局:
Block 0-1: 保留
Block 2-15: U-Boot备份/环境变量
Block 16-127: Linux内核镜像
Block 128-1023: YAFFS2/JFFS2根文件系统
在开发过程中,我经常遇到工程师纠结于存储选型的问题。我的建议是:先明确应用场景的核心需求——是需要快速执行代码,还是大容量存储数据?预算限制如何?可靠性要求多高?回答这些问题后,选择往往就变得清晰了。