3、Flash存储原理:NOR Flash与NAND Flash的区别、SPI Flash的存储单元结构、页(Page)、扇区(Sector)、块(Block)概念
Flash存储器是嵌入式系统中固件的主要载体。理解其内部存储原理,是正确进行烧录、备份与分区操作的基础。本章聚焦于两种主流Flash架构——NOR与NAND的差异,并深入解析SPI Flash的层级存储结构。
3.1 NOR Flash 与 NAND Flash 的核心区别
NOR和NAND是两种截然不同的浮栅晶体管存储阵列架构,它们在读取、写入、擦除方式以及硬件接口上存在根本差异。
| 对比维度 | NOR Flash | NAND Flash |
|---|---|---|
| 存储单元连接方式 | 每个存储单元一端接位线(Bit Line),另一端接地;呈“或非”逻辑阵列 | 多个存储单元串联成串(String),共享位线和源线;呈“与非”逻辑阵列 |
| 读取方式 | 随机读取快,支持XIP(片上执行),可直接映射到CPU地址空间 | 随机读取慢,需先读入页缓存(Page Buffer),不支持XIP |
| 写入(编程)速度 | 慢(字节/字编程),典型速度约 0.5~1 MB/s | 快(页编程),典型速度约 5~20 MB/s |
| 擦除速度 | 慢(扇区擦除),典型擦除时间 0.5~1 s | 较快(块擦除),典型擦除时间 1~3 ms |
| 擦除/写入寿命 | 较高,典型 10万~100万次 | 较低,典型 1千~10万次(取决于制程) |
| 坏块管理 | 出厂无坏块,无需坏块管理 | 出厂存在坏块,需要ECC和坏块表(BBT)管理 |
| 位翻转率 | 极低,几乎不发生 | 较高,需要ECC纠错(通常每512字节需4~8位纠错) |
| 典型容量 | 1 MB ~ 256 MB | 128 MB ~ 1 TB |
| 典型应用 | 固件存储、BIOS/UEFI、FPGA配置、代码直接运行 | 大容量数据存储、文件系统、多媒体、操作系统 |
关键结论:SPI Flash 绝大多数属于 NOR 架构。虽然SPI接口限制了带宽,但NOR的随机读取能力和XIP特性使其成为嵌入式固件烧录的首选。NAND Flash 通常通过SDIO、USB或专用NAND控制器接口连接。
3.2 SPI Flash 的存储单元结构
SPI Flash(NOR型)的核心存储单元是 浮栅晶体管(Floating Gate Transistor)。每个单元通过控制栅(Control Gate)和浮栅(Floating Gate)之间的电荷存储来记录数据。
存储原理速记:浮栅中注入电子 → 阈值电压升高 → 单元读为“0”(编程状态);浮栅中无电子 → 阈值电压低 → 单元读为“1”(擦除状态)。
现代SPI Flash通常采用 单层单元(SLC) 或 多层单元(MLC) 技术:
- SLC(Single-Level Cell):每个单元存储1位数据(0或1),速度快、寿命长、可靠性高,是工业级固件存储的首选。
- MLC(Multi-Level Cell):每个单元存储2位数据(00/01/10/11),容量密度高,但速度、寿命和可靠性均低于SLC。
3.3 页(Page)、扇区(Sector)、块(Block)概念
SPI Flash的存储空间并非字节级随机访问,而是按照 页 → 扇区 → 块 → 芯片 的层级结构组织。理解这些层级是进行固件分区、擦除和写入操作的前提。
3.3.1 层级定义与典型尺寸
| 层级 | 英文 | 典型尺寸 | 操作特性 |
|---|---|---|---|
| 页 (Page) | Page | 256 B / 512 B / 1 KB / 2 KB / 4 KB | 最小的 编程(写入) 单位。写入前必须确保页所在扇区已被擦除。 |
| 扇区 (Sector) | Sector | 4 KB / 8 KB / 32 KB / 64 KB | 最小的 擦除 单位。擦除操作将整个扇区所有位恢复为“1”。 |
| 块 (Block) | Block | 32 KB / 64 KB / 128 KB / 256 KB | 由多个扇区组成,部分芯片支持块擦除(擦除粒度更大,速度更快)。 |
| 芯片 (Chip) | Chip | 1 MB ~ 256 MB | 整个Flash芯片的容量,由多个块组成。 |
重要约束:SPI Flash 不支持“覆盖写入”。写入(编程)只能将位从“1”改为“0”。要将“0”改回“1”,必须执行擦除操作(将整个扇区/块恢复为全“1”)。因此,固件更新时通常需要先擦除目标扇区,再写入新数据。
3.3.2 层级关系示意图
3.4 操作约束与固件烧录的关联
基于上述层级结构,固件烧录和备份操作必须遵循以下约束:
- 擦除对齐:擦除操作必须以扇区(或块)为单位,不能单独擦除一个页。因此,固件分区的大小和起始地址必须与扇区边界对齐。
- 写入对齐:编程(写入)操作必须以页为单位,且页内地址必须连续。写入前,目标页所在的扇区必须处于擦除状态(全“1”)。
- 读取无限制:读取操作可以按字节随机访问,没有对齐要求。这是NOR架构支持XIP的基础。
- 磨损均衡:对于频繁擦写的区域(如日志、配置参数),建议将数据分散到不同扇区,避免某个扇区因过度擦写而提前失效。
实战提示:在编写固件烧录脚本时,务必先读取芯片的 SFDP(Serial Flash Discoverable Parameters) 信息,获取实际的页大小、扇区大小和块大小。不同厂商(Winbond、Macronix、GigaDevice、ISSI)的SPI Flash参数可能不同,切勿硬编码。
3.5 常见SPI Flash型号参数速查
| 型号 | 容量 | 页大小 | 扇区大小 | 块大小 | 擦除寿命 |
|---|---|---|---|---|---|
| W25Q16JV | 16 MB | 256 B | 4 KB | 64 KB | 10万次 |
| W25Q64JV | 64 MB | 256 B | 4 KB | 64 KB | 10万次 |
| W25Q128JV | 128 MB | 256 B | 4 KB | 64 KB | 10万次 |
| MX25L25635F | 256 MB | 256 B | 4 KB | 64 KB | 10万次 |
| GD25Q32C | 32 MB | 256 B | 4 KB | 64 KB | 10万次 |
记忆口诀:“页写扇擦块管理,擦前必写写前擦;对齐边界防越界,SFDP参数先读取。”