
NOR Flash和NAND Flash这两个词在嵌入式、物联网、手机和存储行业几乎天天能看到很多人把它们统称为“Flash闪存”但真到选型、画板、调驱动、做量产的时候还是会发现它们完全是两套脾气。如果你只把它们当“一个能存数据的黑盒子”来用那可能暂时没踩坑但迟早会踩。这篇就像一次项目复盘把这两种芯片从单元结构到产品选型再到实际调试中常见的坑完整梳理一遍适合正在画板子选存储的工程师也适合刚入行想搞懂原理的同学。我最早接触存储芯片是从一颗SPI NOR开始的路由器里的Bootloader和固件就放在里面后来做带本地录像的IPC才真正认真用起NAND Flash。两种都用过之后再回头看它们的原理、接口、寿命、升级策略很多疑惑才串起来。这篇文章不写厂商PPT里的官话尽量用实际踩过的经验来讲。1. 它们都是“不掉电的存储器”但内部思路完全不同1.1 存储单元的物理底子电荷被“关”在浮栅里NOR Flash和NAND Flash在物理根基上是一致的核心存储单元都是浮栅晶体管Floating Gate或者电荷捕获结构Charge Trap。这种晶体管跟普通MOS管最大的不同是在控制栅和沟道之间多了一层“浮栅”这层浮栅被绝缘层包裹电子一旦注入进去即使把电源断掉电荷也能一直待在里面。所以Flash断电后数据不丢靠的就是这层能“关住电子”的浮栅。写入的时候通过加上较高的电压让沟道里的电子获得足够能量穿过绝缘层进入浮栅擦除的时候反过来加反向电场把电子拉出来。整个Flash的编程和擦除本质就是在控制电荷的进出。这个概念搞明白之后后面所有关于写入慢、擦除慢、寿命有限、怕高温的问题都能串起来。因为电荷进出绝缘层这个过程本身就很暴力每次操作都会给绝缘层带来一点不可逆的损耗。这也解释了为什么Flash有擦写次数上限而不是像SRAM那样可以无限刷。1.2 从“书架摆放”看NOR和NAND的连接差异它俩虽然底层元件相同但电路组织方式完全不同。NOR Flash的存储单元是并联在字线和位线之间的每个单元都能被单独寻址有点像图书馆里每本书都摆在同一个开放书架上你想抽哪一本直接伸手就行所以它能按字节随机读取。NAND Flash则把一串单元串联起来像一摞书捆成一捆你要读其中某一本得先把整捆书都挪出来这就是“以页为最小读取单位”的由来。正因为电路连接方式不同两者的特点被彻底拉开。NOR单元并联位线占用面积大同样的晶圆上做不出太大容量通常几十兆字节就到头了但读路径短、可以随机访问读取速度快甚至可以直接映射到CPU地址空间里执行。NAND单元串联面积小密度可以做很高单颗芯片轻松做到1Gbit、4Gbit甚至更大但代价是读写都要按页进行操作而且单元之间串联导致读路径长不能做字节级随机访问。这个结构差异决定了它们一个去跑代码一个去存大块数据。2. 核心区别落在“能不能直接跑代码”上2.1 NOR Flash的XIP能力让CPU直接取指令NOR Flash之所以能成为MCU外扩存储、BIOS固件、Bootloader的首选核心原因是它支持XIPExecute in Place也就是就地执行。CPU可以直接通过地址总线或SPI接口把NOR Flash里的指令读出来执行不需要先搬运到RAM。对系统来说上电之后复位向量指向NOR里的某个地址CPU从那一刻起就可以跑在NOR上省去了“先初始化RAM再把代码搬过去”的启动步骤。你能想象这有多省事吗很多MCU内部自带的Flash也是NOR架构所以单片机上电就能从0x08000000这种地址取指外部扩展的SPI NOR也能在部分MCU上直接映射地址空间甚至可以在内存映射模式下访问。对产品来说这就意味着Bootloader和关键固件可以固化在外置NOR里即使主控芯片换了型号只要接口一致Boot逻辑都能保留。实际项目里路由器、交换机、光猫、工业控制器基本都是这么干的一颗4MB或者8MB的NOR放uboot和最小系统系统起来之后再去加载NAND或者eMMC里的完整系统。2.2 NAND Flash的页访问和坏块现实NAND Flash完全不具备XIP条件。它的最小读取单位是页Page常见页面大小从2KB、4KB到16KB不等而且顺序读和随机读速度差距悬殊。CPU如果直接从NAND取指令光是每次都等一个页面读出再挑数据这一点就足以让系统慢到没法用。所以NAND后面一定得挂控制器Controller或者跑软件FTLFlash Translation Layer把逻辑地址翻译成物理地址管理坏块、做磨损均衡、处理垃圾回收。手机里用的eMMC和UFS本质上就是NAND Flash加上了一个主控和标准接口把NAND的复杂性封装在芯片内部。还有一个绕不开的现实就是坏块。NAND在生产过程中就可能存在出厂坏块使用过程中还会不断出现新增坏块。读页的时候如果数据错误率偏高控制器需要靠ECC纠错如果某一块坏到无法纠错就要把它标记为坏块并从地址映射表中剔除。这些工作都不是裸NAND自己能做到的。所以你会发现NAND Flash从来不是“插上就能用”的存储它必须依赖上层的控制器、驱动和算法。做产品时如果主控只提供裸NAND接口自己又没有跑FTL的经验那项目风险会非常大。3. 读、写、擦除两种Flash的脾气完全不同3.1 写入时的“磨洋工”和擦除时的“大扫除”说到底“写”这个动作在Flash世界里其实是“先擦后写”。Flash单元只能从1写成0如果想从0恢复成1就必须执行擦除操作。NOR Flash的写入通常比较慢按字节或者按字编程时一个字节的编程时间往往以微秒到十几微秒计写一整个扇区可能就要几百毫秒。NAND Flash反而在编程上要快一些它一次擦写一个页常见页编程时间在几百微秒到两毫秒左右但问题在于擦除的单位是块一个块可能包含64个甚至128个页擦除一个块需要几毫秒甚至十几毫秒。在实际使用中NOR和NAND的“擦除块大小”差距也很大。NOR的扇区通常从4KB到64KB不等好处是粒度细改一个小配置不用把整片存储都翻一遍。NAND的一个Block通常有1MB左右如果你的应用只需要改一个4KB页的内容控制器却可能要先读出一个块、在RAM里修改、再把整个块擦掉重写这就是“写放大”。经常在论坛里看到有人吐槽NAND越用越慢很多情况下就是写放大和垃圾回收没做好。相比之下NOR虽然慢但写放大情况好控制得多至少逻辑上简单。3.2 寿命和保持力一次写入能用多久这是个要命的问题Flash的寿命指标叫擦写次数P/E Cycles不同类型的Flash差别很大。SLC每单元存1bit寿命最长通常在5万到10万次MLC每单元存2bit在数千次到上万次TLC3bit一般在1000到3000次QLC4bit就更惨有的只有几百次。NOR Flash因为容量小、工艺相对落后但稳定大多按SLC设计寿命普遍能达到10万次而且数据保持力好很多规格书标称25℃环境下保持20年。NAND Flash为了堆容量制程不断缩小、层数不断增加虽然3D NAND缓解了一部分寿命问题但TLC、QLC的数据保持力在高温下衰减很快。这里要专门提醒一下“数据保持力”和“擦写寿命”是两回事。数据保持力指写进去之后能放多久温度越高电荷流失越快保持时间指数级缩短。我在做户外设备时深有体会夏天设备外壳温度能到70度左右TLC NAND在高温下如果长期不刷新读出来就开始冒ECC错误。所以工业设备、车载产品宁可贵一点也要用NOR或者用工业级SLC NAND关键就看系统对数据可靠性的要求有多高。3.3 一张表看懂两者典型参数差异对比项NOR Flash以SPI NOR为例NAND Flash以SLC/MLC裸片为例常见容量范围256KB - 256MB1Gbit - 整颗数十GB最小读取单位字节可随机访问页2KB/4KB/16KB最小写入单位字节/页视接口而定页最小擦除单位扇区/块4KB-64KB等块几十KB到几MB简称读取速度高适合XIP顺序读快随机读弱编程速度慢页写入约0.1ms-1ms量级页编程约0.2ms-2ms擦除速度慢扇区擦除数百ms量级块擦除几ms到十几ms擦写寿命P/E通常10万次SLC 5-10万次MLC 1万左右TLC 1000-3000QLC更低ECC纠错要求通常无强纠错或轻量纠错必须SLC要4bit起步TLC/QLC常需LDPC坏块管理出厂罕见基本不需要复杂处理必须有出厂坏块新增坏块典型接口SPI / ParallelParallel / SPI NAND / eMMC / UFS典型应用固件、Bootloader、代码存储、参数存储文件系统、录像、照片、系统盘、U盘/SSD这张表是判断项目选型时最常用的参考。注意“编程速度”和“写入速度”要结合接口带宽一起看比如SPI NOR接口频率只有几十兆赫兹就算页编程时间短整片写入也受接口限制NAND的8位并行口或者高速SPI会明显快一截但前提是控制器有足够的DMA带宽和算法支持。4. 产品选型到底该上NOR还是该上NAND4.1 先从主控启动流程出发我知道很多人选存储时第一反应就是问容量其实更关键的判断得从主控的启动流程来倒推。很多MCU、SoC的BootROM会固定从某种接口读取第一级引导程序。比如大量MCU支持从内部Flash启动、从SPI NOR启动少数芯片支持从SPI NAND甚至SD卡启动。如果你的主控支持从SPI NOR启动而你要放的产品固件只有几百KB到几MB那直接上NOR哪怕它每MB单价贵一些但启动逻辑最简单、可靠性最高。如果主控只支持从SDIO、eMMC或USB启动那大概率你绕不开NAND类存储。最典型的就是手机SoC内部BootROM会先跑一小段固化代码再去初始化eMMC或UFS控制器把引导分区里的内容读出执行。这时候BootROM和NOR基本没有任何关系。另一个场景是很多主控芯片同时支持NOR和NAND启动但NAND启动要求BootROM具备纠错和坏块跳过能力软件工作量会大不少。我建议新手第一次做板子如果主控支持SPI NOR启动就先老老实实用NOR跑通最小系统等量产需要更大存储了再考虑NAND。4.2 容量、BOM成本和量产效率三条线接下来就是算账。NOR Flash虽然单片容量不大但在小容量区间依然有优势。比如8MB的SPI NOR国产主流品牌价格已经压得很低整机BOM里几乎不算钱而如果你需要64MB以上NOR的价格就开始指数级飙升此时转向SPI NAND或者eMMC往往更划算。SPI NAND的优势是容量大、封装小、引脚少很多新出的MCU也开始支持SPI NAND启动劣势是需要自己处理坏块和ECC如果主控内置硬件ECC还好没有的话就麻烦。量产环节也要重点评估。NOR Flash烧录速度和NAND不是一个量级小容量NOR可以用SPI烧录器一个板子一个板子离线烧甚至有些MCU支持串口ISP直接下载到NOR但大容量NAND的烧录就很考验设备离线烧录器得支持NAND坏块管理功能否则量产进来一片就废一片。另外NAND的裸片接口每个厂家的坏块标志位置可能不完全一致用不同厂牌的芯片烧录器配置都要重新验证。有经验的硬件工程师通常会在BOM里锁死几个兼容型号并且在新物料导入EOL阶段做充分的烧录兼容测试我就是在这个环节被坑过两次。4.3 一张决策表帮你快速定位判断维度建议需求容量 ≤ 16MB优先NOR需求容量 32MB-512MB优先SPI NAND并确认主控ECC/FTL能力需要直接执行固件必须NOR只是存文件/日志/媒体数据可以考虑NAND/eMMC运行温度高、要求10年使用寿命优先NOR或工业级SLC NAND掉电频繁、不允许数据丢失NOR更稳但也要做掉电保护设计启动流程由主控BootROM固定按BootROM支持的接口选量产烧录成本敏感小容量NOR最省心大容量建议eMMC这些条件往往互相交叉比如既要启动又要存录像不少产品就是“小容量NOR 大容量NAND/eMMC”双存储方案。固件和关键参数放NOR音视频、日志、升级包放NAND分工明确这是目前很成熟的架构可以优先考虑。5. 跟Flash芯片打交道常用的命令和调试流程5.1 用SPI NOR读取芯片ID来判断型号在板级调试时第一步通常是确认主控有没有读到正确的Flash型号。SPI NOR有统一的标准读ID命令往芯片发送0x9F之后连续读3个字节得到制造商ID、类型ID和容量ID。比如最常见的Winbond W25Q128JV三个字节是EF 40 18EF表示Winbond40表示SPI NOR系列18表示128Mbit容量。很多主控的Flash驱动都是靠这套ID去匹配对应的擦写算法。实际调试中经常遇到主控报“Unknown Flash”或者ID为0x00、0xFF。ID全0或全FF大概率是CS线、时钟线或芯片供电没弄好ID读出来是反的可能是驱动把命令顺序搞错了ID能读出来但容量不对可能是主控驱动表太旧不认识新制程改名后的型号。这时候建议先用逻辑分析仪抓一下SPI时序看命令是否真的发出去了比直接改代码猜要快得多。另外很多SPI NOR还支持SFDP参数表通过读取0x5A命令后的标准结构可以直接拿到容量、扇区大小、擦除时间等参数让驱动自动适配。5.2 NAND的ID识别和坏块标记NAND Flash也有ID读取命令传统做法是发0x90后跟一个0x00地址再连续读若干字节很多SD NAND和SPI NAND还支持0x9F命令读取标准ID。裸NAND的ID信息比NOR复杂通常包含制造商代码、器件代码、页大小、块大小、接口时序等信息。更有用的是ONFI或JEDEC标准参数页里面结构化的数据可以直接告诉控制器芯片支持的模式和时序。坏块管理是NAND最需要重视的部分。裸NAND出厂时厂商会在块的第一页或最后一页特定位置写上坏块标记不同厂家的标记位置可能不同。更麻烦的是使用过程中新增坏块不会主动通知你只能靠ECC和读写状态来判断。所以如果你在一个使用裸NAND的项目里千万别省坏块表否则运行几个月后开始频繁掉数据你会非常痛苦。我在一个项目里就把坏块表存在NAND最后一个块结果这个块先坏了整台设备系统直接起不来后来改成把坏块表冗余保存在多个块并加CRC校验才解决问题。5.3 在线升级代码时最容易忽略的掉电保护不管NOR还是NAND做OTA在线升级时不能直接把新固件往原来的区域里覆盖写。正确做法是准备两个以上固件分区先往备份区写完整数据并校验再把启动标志切换过去。这里有一点很多新手想不到擦除操作一旦掉电可能出现半擦除、半写入状态老固件和新固件都不完整设备就成砖了。NOR擦除一个大扇区需要几百毫秒这期间完全不能断电NAND虽然擦除快但坏块和写中断问题更复杂。我做过一个比较稳的升级流程先用一个独立的小分区保存“升级状态标记”每次升级开始前把状态置为“升级中”然后写新固件到备份区写完做全量校验校验通过后再把状态置为“升级完成”最后才切换主备份指针。上电检测如果发现“升级中”状态就说明上次升级没完成系统自动回退到旧固件并发出升级失败告警。这样哪怕在擦写过程中掉电旧固件也还是完整的。这套方案不复杂但很实用。5.4 量产烧录环节必须提前验证的几件事很多人开发阶段一切正常到了量产却发现烧录效率低、良率差。NOR和NAND的烧录差异非常大。NOR擦除编程都简单离线烧录器基本都能识别主控支持的常用型号烧录时间也短。NAND则不同离线烧录器必须知道坏块策略比如是否跳过坏块、是否建立坏块表烧录后控制器读取时一定要按同样的策略去访问。很多新导入的NAND型号离线烧录器固件还没适配测试工装里必须留出更新烧录器固件的流程。另外要注意Flash芯片的温漂和电压波动。量产时如果在车间里温度偏高或者电源纹波偏大批量烧录很容易出现偶发校验失败。这时候不要急着把板子报废先检查芯片供电电容有没有贴反、有没有虚焊以及烧录夹具的接触电阻。夹具用久了氧化信号质量下降Flash写入时序就会不稳定。这种问题和Flash本身没关系但排查起来比芯片故障还费时间。6. 我实际踩过的几个坑希望你们别再踩6.1 NOR擦除中断固件直接变砖之前调试一块工控板SPI NOR里放了Bootloader和App我在测试在线升级时频繁断电结果有一次断电正好碰到擦除阶段重新上电后板子完全没反应串口也不输出。后来一查Bootloader区域已经被擦得一干二净。这个教训让我彻底记住了NOR的擦除窗口期绝对不能断电而且Bootloader区域最好有写保护。很多SPI NOR都支持状态寄存器里的块保护位把Bootloader区域设成只读升级时先临时解除保护再写至少能降低误操作概率。6.2 NAND新增坏块没处理日志系统崩溃那台设备的日志系统直接把裸NAND当FIFO来写没有维护坏块表只靠硬件ECC去纠正。刚开始一切正常几个月后设备突然反复重启串口日志显示在某个固定地址读写出错。拆下来用读卡器把整盘镜像读出来才发现那个地址所在的块已经变成了新增坏块而我们的驱动依然在往里面写。从那以后我强烈建议产品里如果用裸NAND无论主控有没有FTL你自己至少要维护一个坏块表并且定期扫描新增坏块遇到连续读写失败就重映射。6.3 ECC强度留得太小读回数据直接报废有一批用了TLC NAND的模组主控自带的硬件ECC原本是24bit看起来够用了但在高低温老化测试中数据读回错误率明显上升经常出现ECC纠正失败导致文件损坏。后来查规格书发现TLC NAND在高温下原始误码率RBER会随着擦写次数增加而急剧上升24bit ECC只是最低要求并不代表长期稳定。设计余量一定要留够如果原厂建议LDPC你却只做BCH那等于在赌寿命。从那以后我的原则是TLC至少上LDPCSLC用BCH可以但ECC强度宁大勿小。6.4 供电不足导致写入失败现象却像Flash坏了有一次调试SPI NAND发现写一个页偶尔失败而且随着温度升高失败概率变大。换芯片、换主控板都没解决最后用示波器抓NAND供电脚发现写入瞬间有个很大的压降。NAND在编程时内部电荷泵会抽电流电源响应不够快就把电压拉低了主控认为是Flash没响应。解决办法很简单在VCC脚旁边多放一颗10微法电容并且把电源走线加粗。这个坑提醒我遇到Flash问题先别急着怀疑Flash芯片本身先把电源纹波和信号完整性查一遍很多时候问题出在板级电路。7. 关于NOR和NAND我想多说两句个人经验7.1 一次选型翻车教会我的事我之前做一款数据采集设备开发阶段按容量算觉得用一颗32MB NOR就够放固件和配置数据实际量产时发现需要存储一段时间的高频采样记录容量直接不够。临时切换方案时主控不支持从NAND启动只好改成NOR放固件、NAND放数据硬生生多了两颗芯片还拖了一周软件联调时间。如果一开始就能把容量需求想到后面两年直接用“小NOR 大NAND”方案会从容很多。选Flash芯片留容量余量比留带宽余量更重要因为Flash换型号往往牵涉主控驱动、烧录流程、PCB封装一路改到底。7.2 给新人的选型建议清单如果你刚接手一个用到Flash的项目先别急着下单芯片按这个顺序确认主控支持哪些启动接口固件代码量大概多大是否需要在掉电时保存关键参数运行环境最高温度能达到多少量产时有没有离线烧录设备主控有没有硬件ECC和FTL。把这几个问题回答完NOR还是NAND基本就清楚了。还有一个经验是如果项目时间紧张优先选你开发环境里已经适配过、社区资料最多的型号比如常见的SPI NOR选W25Q系列NAND选镁光、三星、海力士等口碑稳定的料国产替代也尽量选驱动兼容性好的尽量不要在新项目里同时上新型号Flash和新主控两个变量容易让人崩溃。