做硬件这些年,被问到最多的一个问题,不是单片机性能,也不是电源怎么布,而是“NOR Flash和NAND Flash到底有什么区别”。老实说,这题很有含金量。能真正把这两个Flash家族差异讲清楚的人,硬件成本意识、固件设计思路、存储选型功底通常都差不到哪里去。我见过不少工程师用了好多年Flash,却搞不清为什么板子上的启动代码必须放NOR,而U盘里几乎全是NAND。这篇文章我就从自己的工程经验出发,把两者的底层原理、参数差异、选型套路和翻车教训一次说透。
先给一句结论备用:NOR擅长“随机读”,能直接跑代码;NAND擅长“大容量顺序存储”,适合当数据仓库。但这个结论背后牵扯到的物理结构、接口设计、寿命管理,远不是一句话能覆盖。下面我会从结构原理讲起,一步一步拆,最后附上实操选型建议。新手可以直接拿去用,老手也能在排障部分捡点干货。
1. 先搞清楚家族起源:同一个“闪存”祖上,兄弟俩各走各路
1.1 Flash芯片的本质:一个断电不丢数据的晶体管仓库
不管是NOR还是NAND,芯片内部最核心的存储单位都是一种叫“浮栅晶体管”的结构。很多人一听晶体管就头大,其实用大白话很好理解。
你可以把浮栅晶体管想象成一个带锁的小储物柜。通过施加高电压,可以把电子“塞”进一个特殊的绝缘层里,这个层就是浮栅。电子被塞进去之后,即使整块板子断电,它也能老老实实待上几个月甚至更久,数据就这么记下来了。读的时候,芯片只需要去检查这个柜子里到底有没有电子,对应到存储逻辑里就是“0”和“1”。
所以Flash的本质,其实就是一个巨大的晶体管仓库,仓库里面是一排排浮栅单元。NOR和NAND虽然都叫Flash,但它们在仓库内部的“货架摆法”完全不同,这也是它们性格差异的最大来源。
1.2 存储单元的物理结构:一个并联、一个串联,决定了性格
仓库里的摆法到底哪里不同?
NOR Flash的存储单元是并联结构的。可以这么理解:每个晶体管都单独“挂”在一条位线上,有自己的访问路径。CPU说我想读地址A的数据,芯片就能直接把那个单元的值拎出来,旁边的单元完全不受影响。就像一排放着几十本书,每本书都有独立标签,你想拿第二本就直接伸手拿,不用把其他书挪开。
NAND Flash则正好反过来。它的存储单元是几十个甚至上百个串在一根“豆腐串”上,这个串就叫NAND串。因为所有单元共享同一个输出节点,你没法单独“点名”某个单元,必须先把一整串的数据整体搬出来再说。再打个比方:每个箱子里面装了厚厚一沓资料,你想读其中某一页,得先把整个箱子搬出来,再翻到那一页。虽然最终也能看到内容,但整个过程没法做到“点读”。
就是这一“并联”一“串联”,导致NOR能按字节随机读,而NAND只能按页整块读。不夸张地说,后面所有区别——速度、寿命、接口、容量、成本——几乎都能从这一个物理结构推导出来。
1.3 物理差异引发的连锁反应
并联结构给NOR带来了随机读取快的红利,控制逻辑也简单。但代价是每个单元都需要独立的接触孔和走线,占芯片面积,容量做不大,成本也压不下来。串联结构正好反过来:引脚和接触孔少,单元密度可以做得很高,同样一片晶圆能切出更大容量的NAND。
这个差异直接影响了市场定位。NOR这些年能继续活着,靠的不是大容量,而是“代码执行”和“高可靠性”这两个刚需。而NAND靠着存储密度把每bit价格打到极低,顺利吃下了U盘、存储卡、SSD这些海量数据市场。
所以你可以这么记:NOR拿存储密度换了“可随机访问”,NAND拿“不能随机访问”换了存储密度和成本。理解到这一层,后面再看参数表就不会被一堆数字带偏了。
2. 核心差异逐条拆解:读取、写入、擦除、容量与寿命
2.1 读取方式与速度:NOR的“随机访问”到底有多大优势
先看读取。NOR支持按字节随机读,这在并行NOR时代体现得最明显。芯片引脚里有完整地址线,CPU给一个地址,NOR就像SRAM一样把对应字节放到数据总线上。这意味着CPU可以直接从NOR里取指令执行,不需要先把代码搬运到RAM,也不需要额外的“读页”过程。
而NAND的读取是按页进行的。一个页通常是2KB、4KB甚至更大,主控先发一串命令和地址,NAND芯片把这个页搬进内部页缓冲寄存器,再从缓冲区往外送数据。如果你只想读其中某一个字节,不好意思,也得整页过一遍。需要顺序读取大块数据时,比如视频流,NAND吞吐率并不低;但要是大量随机小读,NAND和NOR的差距一下就拉开了。
具体数字上,常见的4线SPI NOR在100MHz左右的接口频率下,实测顺序读速度能做到40到60MB/s;而NAND那边,页读延迟通常几十微秒,连续读吞吐动辄200MB/s以上。但要注意,前者是“随机点读也快”,后者是“连续读快、随机读会打折扣”。所以衡量NOR的读性能,不能只看峰值速率,要看随机访问能力和访问延迟。
2.2 写入与擦除:NOR的“慢”藏在操作原理里
再说写入和擦除,这里最容易踩坑。
Flash的写入本质上只能把“1”变成“0”,想再变回“1”,必须先把整块区域擦除。擦除是把一块区域统一恢复到全“1”状态,这是所有Flash的基础约束。关键区别在于:NOR擦除的最小单位通常是64KB或128KB的block,编程通常按字节或字进行;而NAND擦除的最小单位一般是128KB到2MB的block,编程则按整页进行。
为什么NOR写起来慢?拿一颗中等容量的SPI NOR举例,按字节编程,一个字节可能要几十到几百微秒,虽然单字节看着不快但也不算离谱,可一旦数据量上到几百KB,写周期次数会非常多;再加上擦除一个block可能要几十毫秒到几百毫秒,整个耗时肉眼可见地涨上来。NAND呢?一个4KB页的编程时间普遍在200到400微秒左右,擦一个2MB的block普遍在1到2毫秒。换算下来,同样写1MB数据,NAND要比NOR快一个量级甚至更多。
项目里常见的一个坑,是有人拿NOR当大容量EEPRO来存业务数据,写入频繁、数据量还大,结果经常发现“写一次要卡住很久”。这不是芯片有问题,是操作方式完全选错了介质。反过来,NAND虽然写快,但必须按页整写,小数据频繁修改同样会变成灾难。
2.3 容量、密度与成本:U盘里为什么从来没有NOR
容量和成本,可能是普通用户感受最直观的一条。
民用市场上,NOR Flash的主流容量大致在1Mb到256Mb之间,再往上也有512Mb、1Gb的产品,但始终不是主流。原因前面说过:NOR单元占面积大,每bit成本高。你要是想拿NOR做一个32GB的U盘,先不说体积和引脚数量,光是价格可能就是NAND的好几倍,根本卖不动。
NAND这边,单片容量从几百Mb到数Tb都覆盖了,叠几片就是SSD、U盘、存储卡。尤其是3D堆叠技术普及之后,把存储层一层一层往上垒,NAND的容量密度不断刷新,颗粒单位价格被压得非常低。这两年主流的消费级存储,已经普遍进入单颗1Tb级别甚至更高,这种密度是NOR完全无法比拟的。
所以市面上有个隐形共识:引导程序、启动参数、安全数据这类“小而贵”的关键数据,交给NOR;图片、视频、日志、数据库文件这类“大而便宜”的海量数据,交给NAND。这种分工不是谁瞧不起谁,而是两种芯片在物理层面就拿定了主意。
2.4 寿命与可靠性:NAND的坏块管理绕不开,NOR也并非无限
关于寿命,几乎所有新手都被忽悠过。
先说结论:NOR和NAND都有擦写次数限制,但NAND更敏感,因为单元串在一起,一个单元出问题会影响一整串。大家常说的P/E循环次数,也就是擦写循环次数,差距非常明显——NAND做成SLC大约有十万次,MLC大约一万次,TLC普遍只有三千到五千次,到了QLC甚至会降到一千次以内。这意味着如果拿NAND做高频日志存储,几年内写坏一块颗粒是完全可能发生的事。
NOR虽然也不是铁打的,但单元结构相对“皮实”,常见SLC类型的NOR能到十万次级别并不稀奇。更关键的是,NOR出厂基本不含坏块,掉电稳定性也相对好,所以嵌入式工程师习惯拿它存引导程序和校准参数这类“关键时刻不能出错”的数据。
而NAND从出厂开始就允许有一定比例的坏块,使用过程中坏块还会持续增加。主控必须做三件事:出厂坏块标记、运行时坏块映射、以及ECC纠错,否则数据说丢就丢。这也是为什么NAND不能裸着直接挂到总线上让CPU乱读——管理太复杂,必须靠主控方案。
| 对比维度 | NOR Flash | NAND Flash |
|---|---|---|
| 单元结构 | 并联,单元独立访问 | 串联成串,按页访问 |
| 读取粒度 | 字节/字随机读 | 页读取,不能随机点读 |
| 编程单位 | 字节/字 | 页(2KB~16KB) |
| 擦除单位 | 64KB/128KB block | 128KB~2MB block |
| 典型容量 | 1Mb~256Mb | 百Mb~数Tb |
| 主流P/E寿命 | 十万次级别 | SLC约10万次,MLC约1万次,TLC约3000~5000次 |
| 坏块管理 | 出厂坏块少见 | 出厂即有坏块,需主控管理 |
| 每bit成本 | 高 | 低 |
| 典型场景 | 固件、参数、启动代码 | 文件、视频、日志、SSD |
3. 实操向选型:照着几个真实场景走,基本不踩坑
3.1 固件代码跑在NOR上:嵌入式世界的“老传统”为什么砍不掉
做过嵌入式的人都知道,绝大多数MCU和SoC的启动流程都离不开一颗NOR Flash,尤其是SPI NOR。
原因很现实:上电之后CPU要立刻从复位向量取第一条指令,这个阶段DDR还没初始化,NAND控制器也没跑起来,主控只能从一颗简单的NOR里“摸出”启动代码。同时,很多低功耗MCU方案希望代码直接在Flash里就地执行,省掉“把代码搬到RAM”的流程,既省RAM又免启动搬运时间。所以我们看到,即便板上已经放了NAND,绝大多数方案还是会保留一颗小容量的SPI NOR,2Mb、4Mb、8Mb都很常见,专门放bootloader和关键配置。
选型提示:如果是MCU代码存储,优先考虑SPI NOR。注意两个参数,一是接口频率,二是容量余量。接口频率决定读速度,容量决定能装多少代码。别为了省几毛钱选最小容量,代码装不下再改板子,成本翻十倍都不止。
3.2 数据量上来了就上NAND:文件系统和主控是绕不开的搭档
当产品需要存储几百MB甚至几GB的用户数据时,NOR基本出局,老老实实选NAND。但选NAND不是买颗芯片焊上去就完事。
NAND必须搭配“主控”管理,包括ECC校验、坏块管理和磨损均衡。嵌入式里常见的方案有两种:一是选择内置主控的eMMC或者SD卡,省心但成本略高;二是直接接裸NAND,把FTL和纠错算法写进自家固件或依赖原厂库。现在很多MCU和SoC自带NAND控制器,ECC和坏块映射已经由硬件处理大半,裸NAND方案越来越常见。
另一条重要经验:NAND按页读写,小文件碎片多了性能会烂,寿命也会快速下降。方案设计时尽量让业务写入以页对齐、大块连续写为主。日志和配置这种小数据,宁可单独放NOR或者单独分区,也不要混着频繁覆盖NAND。
3.3 NOR+NAND混合:最“抠门”但最稳的组合
我见过太多量产产品,最后都是“NOR加NAND”双存储方案。这不是堆料,而是分工协作。
以一款某网关设备为例:8Mb的SPI NOR放bootloader和固件A/B分区,256MB的NAND放数据库和系统日志。NOR里的数据一辈子可能只写几次,但必须无条件可靠;NAND里的数据量大、更新频繁,可以接受一定程度的损耗和重刷。即便NAND里的日志区写坏一个块,恢复出厂重扫坏块就能救回来;NOR里的启动代码只要不是物理损坏,意外掉电一般都不会出问题。
混合方案的板级成本其实不高,小容量NOR价格压得很低,同时固件升级链路也更安全:先升级NOR里的安全引导,再由新引导升级NAND里的业务镜像,OTA的成功率会明显上升。如果你要做中高端产品,这条路值得优先考虑。
3.4 参数挑选速查:买芯片时先看这四个指标
最后给一个速查清单:
- 接口类型:NOR还是NAND,SPI还是并行。小系统优先SPI NOR,大容量数据优先eMMC或裸NAND。
- 容量余量:NOR建议留20%以上空间给升级包,NAND要预留足够冗余块给坏块替换。
- 电压与功耗:3.3V还是1.8V,睡眠电流多少。低功耗设备这里尤其重要。
- 温度范围:工业现场选-40到85℃的工业级芯片,别拿商业级元件硬顶严苛环境。
下单前翻一下规格书里的“AC Characteristics”和“Endurance”两章,基本能避开80%的选型坑。
4. 为什么NOR能“跑代码”,NAND却只能“存数据”?把XIP说透
4.1 XIP就地执行:CPU在执行时到底需要什么
这个问题值得单独开一节,因为很多人只记住结论,但说不出底层原因。
CPU在取指令时,是不讲“页”的。它随时可能从指令地址A跳转到指令地址B,完全随机。这要求存储设备必须具备“字节寻址”的能力:给一个地址,立刻返回数据,延迟越短越好。NOR天然满足这个条件,地址线铺在那边,选中某个地址就等于选中某个字节,读延迟可以低到几十纳秒,在慢速MCU上甚至能做到接近于零等待。
NAND不行。它内部的数据读取方式是“整页搬进缓冲再串行输出”,CPU根本没有办法在一条指令周期内拿到某个随机字节。就算硬把NAND挂到系统总线上模拟NOR时序,也会因为页缓冲和串行移位导致延迟巨大,根本不适合直接执行代码。
所以“XIP”,也就是就地执行,本质上是一个硬件能力,不是软件技巧。它要求存储介质天然支持随机字节读。在Flash世界里,NOR就是为这件事而生的。
4.2 NAND的IO复用与页缓冲:天生就是“块设备”
再看NAND的接口。哪怕是传统并行NAND,引脚数也远少于同等容量的并行NOR:命令、地址、数据全部复用在同一组IO上,读写必须按一套复杂的命令序列来调度。读一个页,要先发命令、发地址、等芯片把整个页读进内部缓冲,再连续读很多个总线周期把数据取出来。这一整套流程,活脱脱就是个“块设备”的操作方式。
这也解释了为什么NAND在嵌入式系统里几乎不直接挂在CPU总线上,而要通过NAND控制器。控制器负责把“块的读写请求”翻译成“NAND芯片的引脚时序”,顺便完成ECC、坏块管理、磨损均衡。NOR,尤其是并行NOR,在早期单片机系统里可以直接挂在系统总线上,像RAM一样访问,中间省掉一层翻译。
理解了这点,就不会再试图让NAND“裸跑代码”了。不是说绝对不行,而是复杂度和成本完全划不来。个别系统确有“从NAND启动”的方案,实际做法还是把NAND里的代码搬到内部SRAM或DDR里再执行,本质仍然是“存数据,不直接执行”。
4.3 并行NOR、SPI NOR和NAND,别混为一谈
这里提醒一个常见误区:很多人把“串行Flash”直接等同于SPI NOR,其实SPI NOR只是NOR的一种封装形式,介质类型和工作原理还是NOR。
- 并行NOR:引脚多、读快、支持字节寻址,适合大CPU总线直挂,但体积大、价格高。
- SPI NOR:引脚少,通常四线甚至六线,通过命令访问,虽然也是NOR但读延迟比并行NOR稍高,胜在省引脚、成本低,MCU板上几乎都用它。
- 并行NAND:传统NAND,页访问为主,必须配主控。
- 还有一类高性能接口NAND,本质上仍是“页加缓冲加串行出数据”的逻辑,别被高速接口的参数迷惑。
选型时,不要只看名字。“串行”和“并行”是封装与接口的区别,“NOR”和“NAND”才是存储介质和工作原理的区别,两个维度要分开评估。
5. 实操排障:我在几个项目里踩过的存储坑
5.1 启动时程序莫名跑飞,先查NOR的时序
有一种很经典的故障:用SPI NOR存固件,低频率下一切正常,把接口频率调到100MHz以上之后,程序偶尔死机、跑飞、校验失败。这种问题十有八九不是代码bug,而是NOR的读时序配置跟不上。
排查思路很简单:先把SPI频率降到最低,确认能稳定运行;再用逻辑分析仪或者示波器抓CS片选、时钟、数据输入输出这几条线,比对读命令的dummy cycle和规格书要求。大多数SPI NOR在高速读模式下,地址之后需要插入若干个dummy时钟周期,这个参数配错一位,读回来的数据就是错的。
实际解决起来,要么把频率降到芯片规格书推荐值,要么把dummy cycle算准确。另外,PCB上时钟线过长、走线过细,也会让高速读时序的余量变小。别一上来就怀疑芯片坏了,先查时序,这是最容易翻车也最容易修的地方。
5.2 NAND文件系统反复损坏:别把锅全部甩给“掉电”
另一个高频坑:用裸NAND存文件系统,运行一段时间后文件损坏、系统反复重启。很多资料把锅甩给“突然掉电”,实际上NAND损坏的真正原因往往是“坏块增长”和“ECC不足”双杀。
NAND出厂时虽然有坏块,但出厂坏块会被标记。真正麻烦的是运行时新产生的坏块。如果主控的ECC纠错能力偏弱,位翻转就会从一次性软错误变成永久性错误,最终整块报废。再加上海量小文件乱写,某些物理块被反复擦写,寿命提前耗尽也是常事。
排查手段:在系统里加一个坏块扫描工具,定期统计坏块数量变化;读回数据时主动算ECC,观察纠错率。如果坏块数量突然跳增,通常就是磨损均衡没做好,或者供电电压异常导致颗粒劣化。
| 故障现象 | 优先怀疑点 | 排查动作 |
|---|---|---|
| 程序偶尔跑飞 | NOR高速读时序 | 降频验证,抓SPI波形 |
| 文件系统损坏 | NAND坏块/ECC不足 | 扫描坏块,统计ECC错误率 |
| 写数据后读不出来 | 没有页对齐/频繁改写 | 检查写入长度,调整分区策略 |
| 容量上报不准 | 识别ID错误 | 读ID核对型号和容量 |
5.3 从NOR升级到NAND,最容易被忽视的三件事
很多项目最初用NOR,后期数据量上来要换NAND,最容易忽视三件事。
第一,启动方式变化。原bootloader可能在依赖NOR的XIP特性,换NAND之后CPU不能直接执行,必须把引导代码复制到RAM再跑,启动流程要重新设计。
第二,坏块和ECC策略。NOR可以“裸用”,NAND不能。如果原平台没有NAND控制器,要从软件层补上管理逻辑,工作量并不小。
第三,功耗与寿命预算。NAND的编程和擦除电流比NOR大,持续写入时整机功耗会上升,低功耗设备要提前评估;同时NAND的P/E寿命要按实际每日写入量来算,不能拍脑袋。
这三件事每一项都能单独写一篇长文,但不提前规划,轻则产品返工,重则量产翻车。
5.4 排查工具与手段:工程师的“三板斧”
如果怀疑Flash有问题,我常用的手段就是“三板斧”。
第一,读ID。发读ID命令核对厂商和设备ID,确认芯片型号、容量、工艺代没有搞错。第二,全片回读对比。把已知正确的镜像写进去,整片读出来算哈希,逐位对比差异,能快速定位是不是某块区域总读错。第三,坏块扫描加擦写循环测试。对NAND,写满全片再回读,统计坏块地址和ECC错误率,可以评估颗粒健康状况。
这三个动作建议都做成命令行工具,量产测试和售后返修都能复用。别看简单,能省下大量排查时间。
6. 一些不是废话的个人体会
最后说点参数之外的东西。
我在实际项目里最大的感受是:做存储选型,别把自己钉死在“性能参数”这一个维度上。NOR和NAND看似是两种Flash,实际上是两条完全不同的工程路线。NOR更接近“内存”,适合当代码和参数的贴身管家;NAND更接近“磁盘”,适合当数据和文件的大仓库。你需要的往往不是二选一,而是找到两者在产品里的分工。
另外一个建议:量产之前,务必做一次读写寿命压力测试,用比实际业务更恶劣的写入频率跑上一段时间,观察坏块增长和数据完整性。很多存储问题都拖到量产之后才爆发,到那时改芯片、改硬件、改固件,成本都是指数级上升。这些坑我踩过不少,希望读到这里的你,能少踩一次。