☰
NOR Flash与NAND Flash怎么选?从底层原理到选型实战全解析
2026/10/20 10:10:52 网站建设 项目流程

聊存储选型的时候,总绕不开一个问题:NOR Flash和NAND Flash到底怎么选?说实话,我在刚入行那年也被这两个名字搞得头大,光看规格书觉得都挺像,都是掉电不丢数据的存储芯片,结果一上手画板子、调驱动,才发现两者从底子上就是两条完全不同的技术路线。这篇文章不打算复读芯片手册,就用做项目时的实际视角,把这两种Flash的底层原理、性能差异、选型逻辑和踩坑经历一次讲透。

1. 先说清楚根本差异:存储单元的“串并联”之分

很多人上来就背参数表,什么NOR读快、NAND写快、NOR容量小、NAND容量大,但搞不清为什么会有这些差异。其实根源就一句话:存储单元的连接方式完全不同。

1.1 NOR的“并联”结构:每个单元独立引出

NOR Flash的每个存储单元都有一根独立的位线(Bit Line)连接到地线,相当于每个单元都“并联”在电路里。这样的直接好处是:CPU可以通过地址总线直接寻址到任意一个字节,按字节读取,所以NOR Flash支持XIP(片上执行),代码可以直接在Flash里面跑,不用先把程序拷到RAM里再执行。

打个比方,NOR Flash就像一排独立的小邮箱,每个邮箱都有自己单独的门牌号,邮递员(CPU)想取哪封信,直接走到对应编号的邮箱前就行,不用把整排邮箱都翻一遍。

1.2 NAND的“串联”结构:单元排成一队

NAND Flash则相反,存储单元是“串联”连接成一个串(String),通常32个或64个单元串成一组,共享位线。要读取其中某个单元的数据,必须先给串上其他单元的控制栅加上高电压,让它们全部导通,剩下目标单元的导通状态才能被检测出来。

这就是为什么NAND不能按字节随机读取,只能按页(Page)读取——因为串的结构决定了你没法单独“点名”某一个单元。同样打个比方,NAND Flash像一栋只有一个楼梯的老式公寓楼,你要去某一家,必须顺着楼梯一层一层经过其他住户门口,没法直接跳过去。

结构上的差异直接决定了两者的命运:NOR走的是“随机读取快、直接寻址”的路线,NAND走的是“密度高、成本低、顺序读写强”的路线。

1.3 浮栅晶体管的共通底层

虽然连接方式不同,但两种Flash的单个存储单元都是基于浮栅晶体管(Floating Gate Transistor)或者电荷俘获结构(Charge Trap)做的。写数据就是让电子穿过隧氧化层注入浮栅,擦除就是让电子被拉出浮栅。这个过程涉及“FN隧穿”效应,一个字概括就是:慢。因为要控制电荷一点点穿过氧化层,所以Flash的擦写速度天然就比读慢得多。

这个底层机制解释了为什么两种Flash的寿命都是以“擦写次数(P/E Cycle)”来衡量的——每次隧穿都会对氧化层造成细微损伤,损伤积累多了,单元就存不住电荷了。

2. 读、写、擦三条路:性能差异的实测感知

2.1 读取速度:NOR赢在延迟,NAND赢在带宽

NOR Flash的读取延迟极低,通常能做到几十纳秒级别,可以直接挂在CPU的并行总线上,就像扩展ROM一样用。MCU上电后,直接从NOR Flash取指令执行,整个过程完全不需要额外的初始化步骤。这种特性在工业控制、汽车电子、通信设备里至关重要,因为系统一上电就需要立刻执行代码,等不起。

NAND Flash的读取延迟一般在几十微秒级别,比NOR慢了差不多两个数量级,但它有个杀手锏:按页突发读取。一页通常是2KB或4KB,顺序读满整页数据的带宽可以做到几百MB/s甚至更高(配合双倍速率接口)。换句话说,如果只需要读一个小地方,NAND完败;如果是连续搬一大堆数据,NAND可以碾压NOR。

实测中对比非常直观。几年前我在一个图像采集项目里,一边用NOR存启动代码,一边用NAND存图像原始数据。启动的时候,NOR把系统拉起来只用了几百毫秒;海量图像数据的写入,靠的是NAND的页编程吞吐能力,一块普通的SLC NAND就能跑到几十MB/s的写入速度。两块芯片各干各的,相安无事。

2.2 写入速度:擦除粒度决定效率

NOR Flash的写入(编程)是逐字节或逐字进行的,速度相对较慢。更麻烦的是:NOR擦除的最小单位是扇区(Sector),通常是4KB或64KB。你想修改某个扇区里的一个字节,必须先把这个扇区整个擦掉(擦除操作需要几百毫秒),再重新把有效数据写回去。这在做数据日志、配置参数频繁更新时,效率简直惨不忍睹。

NAND Flash的编程以页为单位,一页2KB/4KB,一次编程操作大约几百微秒,配合多平面并行(Multi-Plane)和交错写入(Interleave),持续写入速度能做得很高。NAND的最小擦除单位是块(Block),一块通常包含64页或128页,容量是128KB到几MB之间。

指向非常明确:NOR适合代码存储和少量参数,NAND适合大量数据的顺序写入和存储。如果你的应用有频繁的配置更新且不想动不动就整扇区擦写,选NOR就得认真做好磨损均衡和备份策略,否则写不了多久就挂了。

这里顺带提一个很多人忽略的细节:写之前必须先擦,这是所有Flash共有的铁律。擦除操作比编程操作慢得多,NAND擦一块可能就需要几毫秒,NOR擦一个扇区更慢,常常到几百毫秒甚至秒级。所以设计时一定要算好“擦除密集型操作”的时间预算,别在关键路径上做整扇区擦除。

2.3 擦写寿命:SLC/MLC/TLC的差距放大器

同样叫Flash,SLC(单层单元)、MLC(双层单元)、TLC(三层单元)的寿命天差地别。NOR Flash基本上以SLC为主,标称擦写次数通常在10万次到100万次之间;NAND Flash则覆盖SLC、MLC、TLC、QLC全谱系,寿命从SLC的10万次到TLC的3000-5000次不等。

Q:既然MLC/TLC寿命这么低,为什么还用?

A:因为容量和成本的诱惑力太大了。一个MLC单元能存2bit数据,TLC能存3bit,同样一片晶圆,切出来的容量直接翻倍或三倍。对消费级存储来说,寿命够用就行;对工业级而言,选SLC NAND或者做好强大的坏块管理和ECC,才是正解。

实际项目中如果对寿命有明确要求(比如每天写满一次,要求用10年),就得老老实实做计算:

  • 假设选择一块256MB的SLC NAND,标称擦写10万次
  • 如果你每天写入128MB数据,用双缓冲区方案,每天对同一区域擦写的次数按2次算
  • 连续工作10年需要擦写约7300次,远低于10万次,理论上很安全

但反过来,如果用了TLC NAND,额定寿命只有3000次,7300次就已经超了两倍多,很快就会撞上坏块墙。寿命就是设计之初必须敲定的事,别等项目做完了再换Flash型号,那意味着整块板子都可能要重新布局。

3. 接口和封装:两种芯片在电路设计上的不同玩法

3.1 NOR常用并行接口和SPI接口

经典的NOR Flash有完整的并行地址线和数据线,可以直接映射到CPU的地址空间,上电即用。这种接口在DSP、MCU、FPGA设计里非常常见,连线多但速度快、延迟低。

近些年,为了节省引脚和PCB面积,SPI NOR Flash(串行NOR Flash)大行其道。SPI NOR容量从512KB到256MB不等,接口简单,MCU上留几个GPIO就能接,频率做到几十MHz到上百MHz,配合Quad/Dual SPI模式,读取速度也能跑到几十MB/s。比如我之前做一个音频播放器项目,程序固件放在一颗16MB的SPI NOR里,用Quad SPI的XIP模式直接运行,响应速度完全满足要求,而且整个存储方案的成本和面积都非常低。

3.2 NAND主流接口是并行和Toggle/ONFI

NAND Flash传统上使用8位或16位并行接口,但没有地址线,地址信息是分时复用在数据线上的——先发命令,再发地址,然后才读写数据。它不能像NOR那样线性寻址,CPU不能直接执行里面的代码。所以在NAND上跑程序,典型流程是:Boot阶段先把NAND里的代码搬到RAM,然后跳转到RAM执行。

现代的NAND Flash一般遵循ONFI或Toggle接口标准,采用DDR双沿采样技术,把接口频率拉高到200MT/s、400MT/s甚至更高。封装方面,NAND常见的是TSOP48、BGA、甚至是贴片式的eMMC(eMMC内部其实是NAND加了一个eMMC控制器,对外提供MMC协议接口)。

Q:为什么感觉很多开发板都是eMMC而不是裸NAND?

A:因为纯NAND需要设计者自己处理坏块管理、ECC校验、磨损均衡,复杂度很高。eMMC把控制器和NAND打包,对外屏蔽了这些底层细节,使用体验接近普通块设备,非常适合Linux系统的存储。

3.3 引脚连线与布板注意点

NOR的并行接口,引脚数量多,如果你用的MCU引脚紧张,就非常痛苦。SPI NOR的连线极少,非常适合小而美的设计。

NAND的TSOP48封装在PCB布局上要注意信号完整性——数据线、控制线尽量等长,匹配好走线阻抗,避免在高速读写时出现数据出错。我第一次画NAND的板子就吃过亏,数据线绕了远路,结果在高速模式下读出来的数据隔三差五就有坏块误报,排查了老半天。

4. 实际项目里怎么选型:一张决策表帮你拍板

在项目选型时,我习惯先把应用的需求量化成几个维度,再对照下面这张表拍板。

对比维度NOR FlashNAND Flash
典型容量1Mb ~ 2Gb1Gb ~ 8Tb
读取方式按字节/按字随机读取,支持XIP按页读取,不支持直接执行
读取延迟低,约几十纳秒高,约几十微秒
顺序读取带宽中等,几十MB/s封顶高,可达数百MB/s
写入单位字节/字(但需要按扇区擦除)页(2KB/4KB等)
擦除单位扇区(4KB/64KB等)块(128KB/数MB)
写入速度较慢(通过并行接口有所改善)较快(页编程为毫秒级)
擦写寿命通常10万次以上SLC 10万次 / MLC 1万次 / TLC 3千次
接口并行总线 / SPI并行8/16bit / ONFI / Toggle
坏块管理出厂无坏块,无需管理出厂可能有坏块,必须管理
ECC要求要求低要求高(BCH/LDPC)
成本每MB成本较高每MB成本显著更低
典型场景固件存储、配置参数、启动代码文件系统、音视频存储、大数据量日志

4.1 哪些场景继续选NOR

  • 系统固件、Bootloader存储,需要上电立即执行
  • 配置参数、校准数据存储,数据量小,更新不频繁
  • 对随机读取延迟极其敏感的实时系统(工业控制、汽车ECU)
  • 对可靠性要求极高,希望简化ECC和坏块处理逻辑的项目
  • 容量需求不大(通常在64MB以内)的成本敏感型小系统

4.2 哪些场景直接上NAND

  • Linux/RTOS嵌入式系统的根文件系统、应用程序存储
  • 音视频录制、图像序列存储,要的是顺序写吞吐
  • 大量日志、工业数据采集,动辄几百MB到几TB
  • 消费级设备、可移动存储,追求单位比特成本最低
  • 存储需求超过512MB,且架构上能接受RAM启动方案

4.3 我自己的选型心法

把应用场景分成三类来思考:

第一类是“必须上电就能跑”:Bootloader、RTOS内核、关键配置文件。这种场景闭眼选NOR,容量小点没事,稳定性最重要。

第二类是“数据可以等,但不能错”:比如设备固件升级包、版本备份、用户配置文件。这种场景NOR或NAND都能用,优先看容量和价格,容量小时选NOR省心,容量大时上NAND划算。

第三类是“大块数据流”:图像、音视频、日志文件、数据库。这种场景无脑NAND(或者用eMMC、SD NAND封装),顺序读写性能、存储密度和成本全都要靠NAND满足。

还有一条经验:除非你有充分的坏块管理和ECC设计能力,否则在MCU项目里尽量别直接挂裸NAND。可以考虑用带有控制器的eMMC、SD NAND这类“集成方案”,把底层复杂操作交给芯片内部控制器处理,软件集成速度能快很多。

5. 常见误区与踩坑实录

5.1 “NAND那么快,为什么我的板子跑不起来系统?”

不少新手选NAND是冲着大容量、低成本去的,结果一开电,代码执行不了——因为CPU没法从NAND直接取指。必须先在片内ROM(内部BootROM)里运行一小段引导程序,通过UART、USB、SD或SPI等方式,把NAND里的固件搬到RAM里,再跳转执行。

我在一个项目里因为没仔细看MCU的Boot ROM支持列表,默认选了一颗NAND做启动介质,结果MCU内置的Boot ROM只支持NOR和SD卡启动,最后被迫改方案,白白多花了一周时间。

实操建议:选型之前,第一件事是查你所用主控的启动模式列表,那个表极大决定该用NOR还是NAND。

5.2 “NAND的坏块是不是跟机械硬盘的坏道一样无所谓?”

完全不一样。机械硬盘的坏道可以重映射,内部还能继续用;NAND的坏块只能靠控制器层的坏块表动态跳过。问题是裸NAND出厂时允许存在一定的坏块,使用过程中还会产生新坏块。如果不做管理,读写到坏块上时,数据就直接丢了,而且无任何报错。

正确的做法是:

  • 出厂时扫描所有块,建立初始坏块表
  • 每次擦除/编程后检查状态寄存器,识别新坏块
  • 在软件层面做坏块替换和磨损均衡
  • 搭配强力的ECC算法(如BCH或LDPC),纠正NAND天然存在的比特翻转

我在一个数据记录仪项目里吃过一次大亏:图省事,绕过了坏块管理,结果设备连续运行半个月后,日志文件翻车了——数据读到一半全是乱码。从那以后,但凡上裸NAND,我必然先把坏块表、磨损均衡、掉电保护这三件事设计得明明白白。

5.3 “NOR Flash的‘1->0’和‘0->1’是不是一回事?”

不少设计者默认写数据就是把bit写成0,擦数据就是把bit恢复成1。但实际操作中有一个坑:NOR编程只能把1变成0(逻辑上),不能反过来把0变成1。要想把某个bit从0恢复成1,只能整扇区擦除。

这就导致了一个问题:如果你在NOR里维护一个循环缓冲区,用来记录运行日志,每次写一条新的日志,如果恰好写在一个已经写过数据的扇区里,但空间不够或者指针需要回卷,你就必须把整个扇区读出来、擦掉、改好再写回去。如果日志大小小于扇区大小,这个操作会非常频繁。

解决办法是在软件上做日志分块管理,每块日志写到独立扇区,满了再擦一个扇区,避免最笨的“每次都整扇擦”的操作。很多NOR Flash厂商的驱动库里都提供了类似的循环写入接口,用之前务必搞懂它内部是怎么处理擦写边界的。

5.4 “ECC只要纠错就行,不用管校验强度吧?”

这是MLC/TLC NAND领域的一大坑。早期SLC NAND对ECC要求不高,每512字节纠正几十个bit就够;到了MLC/TLC时代,每1024字节需要纠正数百个bit,如果用的是软件ECC或者弱校验算法,根本无法保证数据完整性。

选型时要注意匹配主控的硬件ECC能力。我遇到过一颗TLC NAND在非常规温度环境下比特翻转率骤增,主控ECC勉强能纠,但性能掉到只有标称的六成。后来换了一颗更稳的SLC NAND,问题才彻底解决。工业级应用还是要留足ECC余量,别在边缘上试探。

5.5 “Flash掉电是不是不会丢数据?”

这个说法只对了一半。虽然掉电后数据能保持,但在写入过程中意外掉电,可能出现“半个页/半个扇区被编程成功、另一半是旧数据”这种不一致状态。更麻烦的是,NAND在编程中掉电还可能把块标记成坏块,或者留下一部分“伪坏块”状态。

要做到掉电安全,有几个常用招:

  • 使用日志化写入方式,先写临时区再提交标志位
  • 关键数据存双份或多份副本,用序号判断最新版本
  • 写入关键结构(如坏块表、文件系统元数据)时,先写备份再更新主表
  • 使用带有掉电保护的核心板或者加一个超级电容,保证完成最后的刷盘动作

我从一个工控项目中吸取的教训是:上电瞬间和掉电瞬间,Flash控制器状态最不稳定,所有关键操作必须加临界区保护,并且配合硬件电压检测(BOD)来主动降级到安全模式。

6. 从数据手册到产品落地:我整理的三板斧

最后分享一点方法论。别看NOR和NAND的手册有几百页,有价值的核心信息其实就那么几栏。我总结成一个三张表检查法:

第一张表是时序表。读NOR的手册重点看随机读取时间和连续读取频率,读NAND的手册重点看页读取时间、页编程时间、块擦除时间。把这三个时间填到你的系统时间轴里,能立刻看出瓶颈在哪。

第二张表是电气参数表。重点看工作电压范围、待机功耗、读写峰值电流。NAND的写峰值电流一般比NOR大不少,在设计电源时一定要保证足够的电流裕量,否则高压写的时候电压跌落,轻则写入失败,重则把Flash干出坏块。

第三张表是可靠性参数表。重点看数据保持时间(Data Retention)、擦写寿命、工作温度范围。数据保持时间和擦写寿命是相互牵制的,擦写次数越多,保持时间越短。如果产品要服役十年,就得认真核查“10万次擦写 + 105℃高温 + 10年保持”是否能同时满足,很多低端Flash在高温下的保持时间会急剧缩短。

我个人现在的习惯是:不管项目多小,先画一张“上电时序图”,把CPU从Flash取代码、初始化RAM、加载数据、运行主流程这四件事按时间排列起来,然后再决定用NOR还是NAND。说穿了就是一句话——别先定芯片,先定数据流,让数据流替你选Flash。

如果你正卡在选型上,可以拿这个思路推一遍自己的项目:代码能不能等?数据量大不大?更新频不频繁?需不需要断电保存?这四个问题过滤完,答案基本就已经浮出水面了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询