Flash 写入与擦除原理
Flash 写入操作并非一定需要预先擦除;擦除的目的,一般是保障写入数据的正确性。核心原理:Flash 仅支持把比特位从 1 改写为 0,无法直接将 0 改写回 1。
Flash 读写擦除底层原理
Flash 的固有特性:写操作只能将比特由 1 置 0,不能直接把 0 置 1。
因此,若目标存储区域初始状态为 `0xFF`(全部比特为 1),可直接写入数据;但如果该区域已存在比特 0,而新数据对应位置需要写成 1,则必须先执行擦除,把整块区域所有比特恢复为 1。
擦除操作是以扇区 / 页为单位执行,会将对应区块全部字节重置为 `0xFF`。STM32 片内 Flash 以及绝大多数外挂 Flash 芯片,均以页(区块)作为最小擦除单元。擦除耗时远高于单次写入,且擦除过程中可能无法响应中断。
无需预先擦除的场景
我们可以利用 Flash “只能 1→0” 的特性,在部分应用中省去冗余擦除动作。
举例:原始数据为 `0xFF`,依次写入 `0xFE`、`0xFA`、`0x42`、`0x00`,全程不需要擦除即可多次覆写。该方案适用于高速连续采样、故障日志记录等场景,既能规避擦除带来的时延、降低对业务程序的影响,也能减少擦除损耗,延长 Flash 使用寿命。
必须执行擦除的场景
当业务需要把原有比特 0 改回 1,或是新写入数据和原有数据存在冲突(需要 0→1)时,必须先擦除对应的扇区或页面。
另外像 SPI Flash 这类外置存储芯片,通常要求目标区域先擦除再写入,否则会出现写入异常、读出数据错乱的问题。
小结
可直接写入、不用擦除:新数据仅做 1 → 0 的修改
必须先擦除再写入:需要把原有 0 改写成 1,或是直接覆盖冲突数据
优化思路:针对高速、持续写入场景,合理规划数据排布与写入顺序,减少擦除频次,提升运行效率,同时延长 Flash 寿命。