单片机 Flash:不掉电的隐形笔记本
一、单片机的“不掉电笔记本”嵌入式Flash就是焊在单片机MCU里的一小块非易失存储器。你写好的程序固件、设备的序列号、校准参数、运行日志全放在里面。一旦断电它不会忘事重新上电程序从Flash的第一条指令开始跑就像翻开笔记本接着干活。它本质上是NOR Flash能像内存一样直接提供指令给CPU执行这叫XIP所以它既是“硬盘”又是“可执行程序仓库”。但千万别把它当普通RAM用。它脾气不小写起来又慢又讲究。二、一群被关在绝缘牢笼里的电子1. 记忆单元浮栅晶体管每个记忆细胞是一个特殊的MOS管里面埋着一块被绝缘层氧化物完全包裹的“浮栅”就像悬空孤岛。数据就靠浮栅里有没有囚禁住电子来表示写入编程通过高电压10V把电子强行“注入”浮栅或者用量子隧穿推进去。这会使晶体管更难导通我们定义为0。擦除用更高的电压把电子从浮栅里“吸”出来量子隧穿晶体管变容易导通定义为1。物理本质决定了编程只能把1改成0擦除只能把0变回1且擦除得一大片一起干绝不可能单比特翻转。2. 读飞快还能就地执行XIP读的时候只要给个地址就能直接获取0/1状态速度极快几十纳秒。因为NOR Flash支持随机寻址CPU能直接取指令执行不必先复制到RAM这让廉价MCU用很少的RAM就能跑大程序。3. 写入/擦除的粒度严重不对等擦除的最小单位是扇区/块常见512字节、2KB、4KB甚至128KB。一擦就是一整块全变1。编程写的单位可能是字节、半字或128位一页只能把1写成0。所以——“改单个字节”是个大工程你得把那字节所在整个扇区先读到RAM修改某个值然后擦除整个扇区再把改好的数据写回去。只改1个字节整个扇区都要被折磨一次。三、工程上必须面对的“原罪”1. 擦写次数有限是消耗品每次擦写都用高压破坏氧化层造成物理磨损终有一天关不住电子。一般嵌入式NOR Flash标称1万10万次擦写。温度一高这个次数断崖下跌——85°C下只能保证1万次甚至更低因为氧化物老化加速。2. 写前必须擦除不能覆盖Flash没有办法原地把0翻成1必须先用擦除清空整个扇区。你哪怕只是想更新一个字节也得拉着整个扇区“陪葬”导致写放大写入实际物理量远超逻辑修改量。3. 写入和擦除慢得令人发指读几十纳秒写一页比如128位几十微秒比读慢上千倍擦一个扇区几十毫秒典型值20-50ms比读慢百万倍在擦除或写入期间如果CPU还想从同一Bank取指令就会暂停中断也不响应。工程上要么把关键代码转到RAM执行要么用双Bank Flash。4. 数据不是永远有效的浮栅里的电子会慢慢泄漏尤其是高温时间长了可能丢数据。规格书常保证常温20年保持但在85°C环境下可能只有几年。寿命与保持时间是耦合的擦写次数越多、温度越高数据越容易丢失。5. 位翻转与ECC纠错偶尔有个别比特因为辐射、漏电等自己翻转所以现代Flash内部或要求用户软件加ECC。ECC保护有一个非常重要的约束必须一次写满整个ECC字如64位数据8位ECC不能分多次修改否则下次读出时ECC校验不通过直接报不可纠正错误系统可能宕机。6. 当不了普通变量你不能声明一个指针指向Flash地址然后直接赋值。一切写入必须走解锁序列、擦除、编程、校验固件操作完全不是RAM那回事。四、跨过去就等着出事1. 电压边界读操作一般1.8V~3.6V都行。擦除/编程电荷泵需要稳定高压供电低于下限比如1.7V时编程可能不完全数据变成垃圾甚至变砖。掉电是最大的杀手。升级固件时如果断电如果没做掉电保护大电容、备份区、掉电检测设备直接成砖头。2. 温度边界擦写操作必须在规格书允许的温度范围内如-40°C~105°C。低温下电荷泵效率差可能擦写失败。高温下数据保持时间锐减擦写寿命按阿伦尼乌斯指数式缩短温度每升高10~15°C寿命可能减半。3. 时序与等待状态CPU主频高了Flash响应跟不上必须插入等待周期。现代MCU有Flash加速器预取/缓存可以把等待周期隐藏起来让执行近似零等待否则读出的指令数据会错。操作写/擦时一定要查询状态寄存器确认操作完成并达到最大超时时间否则访问Flash返回非法数据。4. 扇区对齐与编程页边界擦除地址必须是扇区大小的整数倍编程必须按页对齐比如128位地址对齐且不能跨页。违反则硬件错误或数据全毁。5. ECC原子写入边界必须一次写满一个ECC保护单元否则那个单元读出来就是ECC错误。这在软件设计上要严格约束。6. 安全保护机制量产必须重视芯片提供多种保护必须用起来读保护RDP封锁调试口防止固件被读出抄板。写保护WRP保护关键区域Bootloader、校准数据不被意外擦写。PCROP阻止CPU从该区域取指保护核心算法但允许当数据读。OTP区域只能写一次用于存储唯一序列号或密钥。忘加保护固件、算法随便被带走量产事故。7. 双Bank与分区结构很多MCU内部Flash分大小不等的扇区小16KB大128KB方便把Bootloader放小扇区里。双Bank设计还能让你一个Bank写新固件另一个Bank同时跑程序完全不停机。五、它到底都用在哪儿1. 固件存储与就地执行这是最根本的上电从Flash取第一个指令接着跑整个程序。XIP让系统RAM需求很低成本控制到极致。2. Bootloader 固件升级OTAFlash被划分为Bootloader区和App区甚至A/B双区。升级时新固件写入App区启用前必须校验完整性并且要结合掉电安全设计双备份标志、电容储能确保无论如何断电都不变砖。3. 模拟EEPROM存非易失参数你要存配置、校准值、累积里程但Flash不能字节覆写于是用软件在Flash里划一个区域模拟EEPROM每次修改写一条新记录标记老记录失效扇区满了再整理回收。这背后必须有磨损平衡算法避免频繁修改的地址提前报废。注意掉电瞬间可能丢失最后一条记录或状态上电恢复需扫描最新有效记录这会增加启动时间。4. 运行日志/黑匣子安全关键系统汽车、医疗把故障码和传感器数据周期性存入Flash形成环形日志。得考虑扇区擦除耗时与寿命以及掉电时数据的完整性。5. 存储静态资源字库、图片、声音带屏或语音的MCU把不小的资源放在内部Flash或外挂QSPI Flash通过XIP直接映射或DMA读出。外挂Flash本质也是NOR规律一致。6. 多固件冗余安全OTA物联网设备常保存两份App镜像一个运行一个升级切换前校验失败还能回退杜绝变砖风险。这全靠Flash被合理分区和双Bank能力。六、总结请把嵌入式Flash当成一个需要小心伺候、有寿命的慢速块设备写它的时候关中断、把操作代码搬到RAM执行、确认电源充裕。产品十年寿命规划里必须把擦写次数、高温保持时间、磨损均衡算得明明白白。安全保护不是可选项是出厂前的必选项。掉电保护不做等于把整个设备押上命运的轮盘。以上是个人的一些浅见如有不当之处欢迎批评指正。