
本文概述
片内Flash是STM32做数据掉电保存的常用方案,也是嵌入式面试的实用题。面试官想听的不是“用库函数写Flash”,而是你懂不懂Flash的特性(只能1→0、写入前必须擦除、按扇区擦除)、STM32 Flash的操作限制(擦写次数、擦写时间、电源电压)、以及数据存储的可靠性设计(备份、校验、磨损均衡)。本文从“Flash写数据前要擦除”讲起,讲Flash写入原理(按位可写0、擦除才恢复1)、STM32的扇区/页擦除与编程操作、地址规划(避开程序区)、以及掉电保存的可靠性策略(备份区、校验、双缓冲、均衡擦写),强调擦写次数和策略依赖器件和数据量,不套固定值。
核心要点
Flash特性:只能把1写为0,写1必须先擦除(擦除恢复全1);按扇区/页擦除
STM32片内Flash:程序和数据共用Flash,数据存储要避开程序占用区域
写入操作:编程(写数据)和擦除(清整扇区)都耗时间,期间注意看门狗和中断
擦写寿命:Flash有擦写次数限制(如万次量级,按器件),频繁写要磨损均衡
掉电保存可靠性:备份区、校验(CRC/和校验)、双缓冲/磨损均衡,防掉电半写
操作注意:擦写时电源要稳、不能同时读该区、注意与程序区的保护(读保护/写保护)
面试官考察点
考察点拆解
面试官问STM32 Flash,重点考察:第一,你懂不懂Flash写入原理(1→0、先擦后写、按扇区擦);第二,你会不会规划数据存储区(避开程序、地址管理);第三,你懂不懂擦写寿命和掉电保存的可靠性设计;第四,有没有实际做过,知道擦写时的注意事项。
追问方向:Flash为什么先擦后写、数据存哪、擦写寿命多少、掉电写一半怎么办、擦写时要注意什么。
回答思路
答题主线
建议按“Flash原理 → 存储规划 → 操作流程 → 可靠性设计”来答,先讲清特性再落到实现。
先讲原理:1→0、先擦后写。
讲规划:数据区避开程序区。
讲操作:擦除、编程、时间。
讲可靠:备份、校验、磨损均衡。
参考回答
我先讲Flash的基本特性,再讲怎么用STM32片内Flash存数据。
第一,Flash原理。Flash存储器的特性:写入只能把1变成0,不能把0写成1;要把0恢复成1必须擦除,而擦除是按扇区/页整块进行的(擦除后该区全变1)。所以写数据前如果该地址原来是0,必须先擦除所在的扇区。这决定了Flash写入流程:擦除扇区 → 编程写入。
第二,存储规划。STM32的程序和数据共用片内Flash。存数据要避开程序占用的区域:查链接脚本(.map文件)或留出专门的地址段,把数据放在程序结束后的空白扇区,避免擦除数据时把程序也擦掉。
第三,操作流程。用芯片的Flash库/寄存器:解锁Flash → 擦除目标扇区 → 编程写入数据 → 锁定。注意:擦除和编程都是耗时的操作(ms级,按器件),期间要处理好看门狗(喂狗/暂停)和中断(擦除期间不能中断读Flash)。
第四,可靠性设计。掉电保存数据要考虑:
擦写寿命:Flash有擦写次数限制(如几万次量级,按器件),频繁改写要用磨损均衡(轮换使用多个扇区)和减少擦写次数(只在值变化时写);
掉电半写:写入中途掉电可能留下脏数据,用双缓冲/备份扇区 + 校验(CRC或和校验),上电先校验,坏了回退到备份;
写保护:防止程序区被误擦写,可以用读保护/写保护;
电源稳定:擦写期间电源波动会导致失败,关键系统要在掉电检测后停止擦写或保证供电。
数据量、擦写频率和可靠性要求决定具体策略,不套固定值。

扫码关注






























