4、NOR Flash详解:NOR Flash架构与工作原理、XIP(片内执行)特性、读写寿命与擦除次数、典型应用场景
4.1 从架构说起:NOR Flash 到底长什么样?
NOR Flash,说白了就是一块「可以随机读的存储器」。
它的存储单元是并联在位线上的。每个存储单元都像一个小开关,直接连到数据总线上。你给它一个地址,它就能直接吐出那个地址的数据。这一点跟内存很像,所以它天生就适合做代码存储。
我刚开始接触 NOR Flash 时,总觉得它跟 NAND 差不多。后来踩了坑才明白——NOR 是随机读,NAND 是页读。这两个方向完全不同。
NOR 的内部结构,我习惯把它理解成「一张大表格」:
- 行:字线(Word Line),选中哪一行
- 列:位线(Bit Line),读出该行的数据
- 交叉点:一个浮栅晶体管,存 1 个 bit
每个交叉点就是一个存储单元。读的时候,字线选中一行,位线把这一行的数据并行读出来。嗯,这里要注意:NOR 的读速度非常快,但写和擦除就慢很多。
核心区别一句话:NOR 是「随机读、块擦除、字节写」;NAND 是「页读写、块擦除」。
4.2 XIP(片内执行):为什么 NOR 能直接跑代码?
XIP,全称 eXecute In Place,翻译过来就是「原地执行」。什么意思?
你想想看,CPU 要执行一段代码,通常得先把代码从 Flash 搬到 RAM 里,再从 RAM 里取指令执行。但 NOR Flash 不一样——CPU 可以直接从 NOR Flash 里取指令,不需要搬来搬去。
为什么会这样?
因为 NOR Flash 的读时序跟 SRAM 非常接近。你给它一个地址,它很快就能把数据吐出来。CPU 的指令总线可以直接连到 NOR Flash 的地址总线上,数据总线直接连到 NOR Flash 的数据总线上。就这么简单。
我在一个物联网项目里用过 XIP。当时 MCU 的 RAM 只有 64KB,但固件有 200KB。如果不用 XIP,根本跑不起来。后来直接把代码放在 NOR Flash 里,CPU 直接从 Flash 取指令执行,RAM 只放变量和堆栈。嗯,效果很好。
个人经验:XIP 模式下,代码执行速度会比 RAM 里慢一些,但大多数场景下够用。如果对实时性要求极高,可以把关键中断函数放到 RAM 里。
XIP 的硬件连接也很简单:
// 伪代码示意:XIP 模式下 CPU 直接访问 NOR Flash
#define CODE_BASE_ADDR 0x08000000 // NOR Flash 映射地址
void (*func_ptr)(void) = (void (*)(void))(CODE_BASE_ADDR + 0x1000);
func_ptr(); // 直接执行 NOR Flash 里的代码
4.3 读写寿命与擦除次数:NOR 能撑多久?
这个问题,我几乎每次选型都会被问到。
NOR Flash 的擦写寿命,一般在 10 万次到 100 万次 之间。具体看工艺和厂商。比如常见的 SPI NOR Flash,多数是 10 万次;一些高端的并行 NOR,能做到 100 万次。
但这里有个坑——擦除次数是分块的。你擦除整个芯片 10 万次,跟只擦除某一个扇区 10 万次,结果完全不一样。
我曾经在一个数据记录仪项目里,把日志数据频繁写到一个固定扇区。结果三个月后,那个扇区就坏了。后来我改用「磨损均衡」算法,把数据分散写到不同扇区,才解决了问题。
| 参数 | 典型值 | 说明 |
|---|---|---|
| 擦写寿命 | 10万 ~ 100万次 | 按扇区计算,不是全芯片 |
| 数据保持时间 | 20年 @ 85°C | 温度越高,保持时间越短 |
| 读次数 | 无限 | 读不影响寿命 |
| 擦除时间 | 几百毫秒 ~ 几秒 | 跟扇区大小有关 |
避坑指南:我曾经遇到过一款 NOR Flash,标称 10 万次擦写,但在高温(85°C)下只撑了 3 万次。所以选型时一定要看「温度加速因子」,别只看常温数据。
4.4 典型应用场景:NOR Flash 到底用在哪儿?
NOR Flash 的应用场景,我总结下来就三个方向:
4.4.1 代码存储 + XIP 执行
这是 NOR Flash 最经典的应用。比如:
- MCU 内置 Flash:很多 ARM Cortex-M 系列 MCU 内部集成了 NOR Flash,直接 XIP 执行
- 外部 SPI NOR Flash:当 MCU 内部 Flash 不够用时,外挂一片 SPI NOR,通过 XIP 模式扩展代码空间
- BIOS/UEFI 固件:PC 主板上的 BIOS 芯片,基本都是 NOR Flash
我记得有个客户做工业控制器,MCU 内部 Flash 只有 512KB,但固件有 1.2MB。他们一开始想换大容量 MCU,成本太高。后来我建议外挂一片 16MB 的 SPI NOR Flash,用 XIP 模式跑代码。嗯,成本降了一半。
4.4.2 参数存储 + 频繁读
有些场景需要频繁读数据,但很少写。比如:
- 设备校准参数:生产时写入,运行时只读
- 字库/图片数据:显示设备用的字库、图标等
- FPGA 配置数据:上电时加载到 FPGA 里
这些场景用 NOR Flash 很合适,因为读速度快,而且读不消耗寿命。
4.4.3 小容量数据记录
虽然 NOR 的擦写寿命有限,但如果你数据量小、写入频率低,它也能胜任。比如:
- 系统日志:每小时写一条,一年才 8760 次,10 万次寿命够用 11 年
- 配置参数:用户修改配置时才写一次,几乎不消耗寿命
我的建议:如果写入频率超过每小时一次,或者数据量超过 1MB,建议考虑 NAND Flash 或 EEPROM。NOR 更适合「少写多读」的场景。
4.5 选型时我必看的几个参数
最后,分享几个我选 NOR Flash 时必看的参数:
- 读速度:看是标准 SPI(50MHz)还是 Quad SPI(80MHz+),XIP 模式下越快越好
- 擦除时间:扇区擦除时间越短越好,有些芯片能到 30ms,有些要 500ms
- 擦写寿命:至少 10 万次,工业级最好 100 万次
- 工作温度:工业级 -40°C ~ 85°C,车规级 -40°C ~ 125°C
- 封装:SOIC-8 最常见,WSON 更小但焊接难度大
嗯,NOR Flash 就讲到这里。下一章我们聊 NAND Flash,那个更复杂,但容量更大、成本更低。到时候我会重点讲坏块管理和 ECC 校验——这两个坑,我当年可没少踩。