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。
SPI Flash 存储单元结构(浮栅晶体管) SLC 单元(1位/单元) 控制栅 (Control Gate) 氧化绝缘层 浮栅 (Floating Gate) 存储电荷(电子) 源极 (S) 漏极 (D) 状态:0(编程)或 1(擦除) MLC 单元(2位/单元) 控制栅 (Control Gate) 浮栅 (多电平) 4种电荷量 → 2位数据 源极 (S) 漏极 (D) 电平分布:00 / 01 / 10 / 11

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 层级关系示意图

SPI Flash 存储层级结构(以 16 MB 芯片为例) 芯片 (Chip) — 16 MB 块 (Block) — 64 KB × 256 个 扇区 (Sector) — 4 KB 每个块包含 16 个扇区 最小擦除单位 扇区 (Sector) — 4 KB 每个块包含 16 个扇区 最小擦除单位 扇区内部 — 页 (Page) — 256 B 页 0 (256 B) 页 1 (256 B) 页 2 (256 B) 页 15 (256 B) 每个扇区包含 16 个页(4 KB ÷ 256 B = 16) 最小编程(写入)单位

3.4 操作约束与固件烧录的关联

基于上述层级结构,固件烧录和备份操作必须遵循以下约束:

  1. 擦除对齐:擦除操作必须以扇区(或块)为单位,不能单独擦除一个页。因此,固件分区的大小和起始地址必须与扇区边界对齐。
  2. 写入对齐:编程(写入)操作必须以页为单位,且页内地址必须连续。写入前,目标页所在的扇区必须处于擦除状态(全“1”)。
  3. 读取无限制:读取操作可以按字节随机访问,没有对齐要求。这是NOR架构支持XIP的基础。
  4. 磨损均衡:对于频繁擦写的区域(如日志、配置参数),建议将数据分散到不同扇区,避免某个扇区因过度擦写而提前失效。

实战提示:在编写固件烧录脚本时,务必先读取芯片的 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参数先读取。”