4、NOR Flash 基础:XIP执行特性、扇区擦除、页编程、读操作时序、与NAND的对比
好,咱们今天聊聊NOR Flash。说实话,在嵌入式存储这个圈子里,NOR Flash就像个老派的工匠——它不追求大容量,但讲究的是可靠和直接。我最早接触NOR Flash是在做一款工业控制器的时候,当时选型时纠结了很久,后来发现,搞懂NOR,很多存储问题就迎刃而解了。
4.1 XIP执行特性:代码原地跑
XIP,全称是eXecute In Place,中文叫“原地执行”。什么意思呢?就是CPU可以直接从NOR Flash里读取指令并执行,不需要先把代码拷贝到RAM里。你想想看,这省了多少事?
为什么NOR能这么干?因为它的读接口和SRAM很像,有完整的地址线和数据线。CPU发一个地址,NOR就能直接返回数据。我在一个bootloader项目里就靠这个特性,让系统上电后直接从NOR启动,省掉了加载阶段,启动时间缩短了将近一半。
核心要点:XIP特性让NOR Flash可以作为程序存储器直接运行代码,特别适合启动代码和实时性要求高的场景。
但要注意,XIP虽然方便,写操作时就不能读了。所以代码段通常放在NOR里,变量和堆栈还得用RAM。嗯,这里要记住:NOR适合存“不变”的东西。
4.2 扇区擦除:擦干净才能写
NOR Flash有个脾气——它不能像SRAM那样直接覆盖写。你想写一个字节,必须先擦除整个扇区。扇区大小各家不同,常见的有64KB、128KB。我习惯把扇区比喻成一块黑板,擦除就是把整块黑板擦干净,然后才能在上面写新内容。
擦除操作本身很慢,一个扇区擦除可能要几百毫秒到几秒。我在项目中遇到过一个问题:系统突然掉电,擦除操作只做了一半。结果再上电时,那个扇区里的数据全乱了。后来我加了个“擦除完成标志”,每次上电先检查,才彻底解决。
避坑指南:我曾经因为没做掉电保护,导致一批设备出厂后数据丢失。后来在擦除流程里加入了“双缓冲”机制——先擦除备份扇区,再交换指针。这个教训,值好几万块钱。
4.3 页编程:按页写入,但别超限
擦除完扇区,接下来就是编程(也就是写数据)。NOR Flash的编程是按“页”来的,一页通常是256字节或512字节。你可以一次写一个字节,但效率最高的是一次写一页。
为什么强调“别超限”?因为每页的编程次数是有限的,一般在10万次左右。如果你频繁写同一页,那页很快就“累死”了。我建议做磨损均衡,把写操作分散到不同页上。说白了,就是别逮着一只羊薅毛。
// 伪代码:页编程示例
void nor_write_page(uint32_t addr, uint8_t *data, uint32_t len) {
// 1. 发送页编程命令
nor_send_command(0x02);
// 2. 发送目标地址(3字节)
nor_send_address(addr);
// 3. 发送数据(最多256字节)
for (int i = 0; i < len; i++) {
nor_send_data(data[i]);
}
// 4. 等待编程完成
while (nor_is_busy());
}
这段代码看着简单,但实际项目中要加超时处理。我曾经遇到过一块Flash芯片老化,编程时间从正常的1ms变成了50ms,没加超时的话,系统就卡死了。
4.4 读操作时序:快,但别乱来
NOR Flash的读操作很快,通常几十纳秒就能出一个数据。但时序上有些讲究。标准读模式是:先发命令(0x03),再发地址,然后每个时钟周期读一个字节。如果想更快,可以用“快速读”模式(0x0B),加一个等待周期后,数据可以跑得更快。
我画过不少时序图,说实话,最怕的就是建立时间和保持时间不满足。有一次板子布线太长,信号反射导致读数据出错。后来我在Flash的片选信号上加了个RC滤波,问题就解决了。嗯,硬件工程师的直觉告诉我:时序问题,多半是信号完整性问题。
| 读模式 | 命令码 | 等待周期 | 最大频率 |
|---|---|---|---|
| 标准读 | 0x03 | 0 | 50MHz |
| 快速读 | 0x0B | 1-8 | 104MHz |
小技巧:如果你不确定时序是否稳定,可以降低SPI时钟频率试试。我经常用这个办法定位问题——频率降下来就好了,说明是时序裕量不够。
4.5 与NAND的对比:各有各的活法
很多人问我:NOR和NAND到底怎么选?我一般这么回答:看你要什么。
NOR Flash的优点:XIP、读快、接口简单、可靠性高。缺点:容量小(最大也就2Gb)、写慢、擦除慢、价格贵。
NAND Flash的优点:容量大(轻松上Tb)、写快、擦除快、价格便宜。缺点:不能XIP、读慢、有坏块、需要ECC纠错。
说白了,NOR适合存代码,NAND适合存数据。我做过一个产品,用NOR存bootloader和关键配置,用NAND存日志和用户数据。两者配合,各取所长。
| 特性 | NOR Flash | NAND Flash |
|---|---|---|
| XIP支持 | 是 | 否 |
| 读速度 | 快(ns级) | 慢(μs级) |
| 写速度 | 慢(ms级) | 快(μs级) |
| 擦除速度 | 慢(s级) | 快(ms级) |
| 容量 | 小(Mb级) | 大(Gb级) |
| 坏块管理 | 不需要 | 需要 |
| 典型应用 | 代码存储 | 数据存储 |
总结一下:NOR Flash就像个可靠的守门员,虽然跑得慢,但从不掉链子。NAND Flash像个快马,能装能跑,但偶尔会摔跤。选哪个,看你需要什么。
好了,这一章就聊到这儿。下一章咱们会深入讲SPI NOR Flash的驱动实现,到时候我会分享一些实际调试中的“血泪史”。