
在 STM32 的 Flash(闪存)中,扇区(Sector)、页(Page)、块(Block) 是基于存储管理需求划分的层级概念,核心目的是平衡 "擦除效率" 和 "存储灵活性"------Flash 的物理特性决定了只能按固定最小单元擦除(擦除后数据全为 1),但可按字节 / 半字 / 字编程(写 1→0),因此需要分层设计来适配不同场景的读写需求。
一、核心前提:Flash 的物理特性(理解分层的关键)
STM32 的 Flash 属于NOR Flash(部分大容量型号含 NAND Flash,但系统 Flash 多为 NOR),其核心约束:
- 编程(写):只能将已擦除的 "1" 改写为 "0",不能直接改写 "0" 为 "1";
- 擦除(Erase):必须按固定 "最小擦除单元" 执行,擦除后该单元内所有位恢复为 "1";
- 分层设计:物理上的 "最小擦除单元" 可能较大(如 16KB),若直接按此操作会浪费空间,因此引入更细粒度的 "页" 用于编程,"扇区 / 块" 用于擦除,形成 "物理擦除单元" 与 "逻辑编程单元" 的分离。
二、三个概念的精准定义与区别
| 概念 | 物理 / 逻辑属性 | 核心作用 | 操作限制 | 大小范围(STM32 典型值) |
|---|---|---|---|---|
| 页(Page) | 逻辑 / 物理单元 | 最小编程单元(写操作) | 只能编程(写 1→0),不能单独擦除 | 128B、256B、512B(如 STM32F1/F4) |
| 扇区(Sector) | 物理单元 | 最小擦除单元(基础级) | 必须整扇区擦除,擦除后可分页编程 | 4KB、8KB、16KB、64KB、128KB |
| 块(Block) | 物理 / 逻辑单元 | 多个扇区的集合(高级擦除) | 整块擦除(效率高于单扇区多次擦除) | 64KB、128KB、256KB(如 STM32H7) |
简单总结:
- 页 ="写字的格子":最小的写入单位,每次写数据至少占 1 页(即使只写 1 字节,也会占用 1 页的空间,剩余部分不可再写,除非擦除);
- 扇区 ="一整页纸":最小的 "可擦除纸张",要修改纸上任何一个 "格子"(页)的内容,必须先把整页纸(扇区)擦干净(全 1),再重新写需要的 "格子";
- 块 ="一叠纸":多个 "扇区" 打包成的大单元,适合批量擦除(比如擦除整个应用程序分区),效率更高。
三、STM32 不同系列的实际划分(重点!避免混淆)
不同 STM32 系列(F1/F4/F7/H7/L4 等)的 Flash 扇区 / 页 / 块大小差异较大,必须以对应型号的参考手册(RM)为准,以下是最常用系列的典型划分:
1. STM32F1 系列(中低端,如 F103)
- 无 "块" 概念,仅分扇区,且扇区大小不均(前小后大,兼顾小容量存储和效率);
- 无单独 "页" 定义:编程时按 "半字(2B)" 为最小单位,但擦除必须按扇区;
- 典型扇区划分(以 512KB Flash 为例):
- 扇区 0~3:各 4KB(共 16KB,适合存 Bootloader、配置参数);
- 扇区 4:16KB;
- 扇区 5~11:各 64KB(共 448KB,适合存应用程序)。
2. STM32F4 系列(中高端,如 F407)
- 引入页(Page):最小编程单元为 2KB(部分型号 1KB);
- 扇区 = 多个页的集合:擦除按 "扇区" 或 "整个 Flash";
- 典型划分(以 1MB Flash 为例):
- 扇区 0~3:各 16KB(每扇区含 8 个 2KB 页);
- 扇区 4:64KB(含 32 个 2KB 页);
- 扇区 5~11:各 128KB(含 64 个 2KB 页)。
3. STM32H7 系列(高端,如 H743)
- 明确区分块(Block)、扇区(Sector)、页(Page),层级更清晰;
- 典型划分(以 2MB Flash 为例):
- 1 个 Block = 256KB;
- 1 个 Block = 4 个 Sector(每个 Sector=64KB);
- 1 个 Sector = 16 个 Page(每个 Page=4KB);
- 支持:按 Page 编程、按 Sector/Block/ 全片擦除。
4. STM32L4 系列(低功耗,如 L476)
- 页大小更小(128B/256B),适合小批量数据存储(如参数、日志);
- 扇区划分灵活:如 256KB Flash 分为 128 个 2KB 扇区,或 64 个 4KB 扇区(可通过配置寄存器选择)。
四、实际操作中的核心规则(避坑关键)
-
编程前必须擦除:若要修改某页的数据,需先擦除其所属的 "扇区 / 块"(因为页不能单独擦除),再重新编程该页及扇区内其他需要保留的数据(需先备份扇区数据,擦除后恢复 + 修改)。例:修改 F407 的某 2KB 页数据 → 备份该页所属 16KB 扇区的所有 8 个页数据 → 擦除 16KB 扇区 → 恢复 7 个无需修改的页 + 编程修改后的页。
-
擦除单位不能小于最小擦除单元:比如 F103 的最小擦除单元是 4KB(扇区 0),不能只擦除 2KB;H7 的最小擦除单元是 64KB(扇区),不能只擦除 4KB(页)。
-
编程地址必须对齐:页编程时,地址需对齐到页大小(如 2KB 页需对齐到 0x800、0x1000 等);半字 / 字编程需对齐到 2B/4B(STM32 Flash 总线宽度多为 32 位)。
-
块的作用是批量操作:擦除整个应用程序分区时,若该分区占用多个扇区,直接擦除对应的 "块" 比逐扇区擦除更快(减少擦除指令次数)。
五、应用场景举例
| 场景 | 选择单元 | 原因 |
|---|---|---|
| 存储 Bootloader(小容量、需频繁更新) | 小扇区(4KB/8KB) | 擦除速度快,不浪费空间 |
| 存储应用程序(大容量、少更新) | 大扇区 / 块(64KB/128KB) | 单次擦除容量大,效率高 |
| 存储配置参数(100 字节,需频繁修改) | 小页(128B/256B) | 编程粒度细,备份 / 恢复的数据量小 |
| 批量擦除整个 Flash(如固件升级) | 全片 / 大块擦除 | 比逐扇区擦除快,简化操作 |
六、总结
STM32 Flash 的 "扇区 - 页 - 块" 是基于物理特性的逻辑分层设计,核心逻辑:
- 页:最小编程单元 → 提升写入灵活性;
- 扇区:最小擦除单元 → 平衡擦除效率和空间浪费;
- 块:扇区集合 → 提升批量擦除效率。
实际开发中,第一步必须查阅对应型号的参考手册(RM)中 "Flash 存储器" 章节,确认具体的页 / 扇区 / 块大小、地址范围,再设计存储分区(如 Bootloader 区、应用区、参数区),避免因单元大小混淆导致数据丢失或操作失败。