单片机数据掉电保存实战:EEPROM与Flash读写、校验和与磨损均衡
很多单片机项目跑着跑着,参数一断电就全丢了,重新上电又要手动设置,体验很差。要解决这个问题,就得用非易失存储把关键数据保存下来。本文讲讲EEPROM和Flash的读写要点、怎么防数据损坏,以及容易被忽略的寿命问题。
先说硬件选型。EEPROM按字节读写、寿命约100万次,适合保存修改频繁的参数,比如音量、亮度、PID系数。Flash按扇区擦写、寿命约1万到10万次,适合存固件版本、校准数据这类不常变的信息。51单片机用I2C接口的AT24C系列很常见,STM32则可以直接用片内Flash。
存储的数据要加校验。直接写原始数据,一旦中途断电或写入被打断,读回来可能就是乱值。工程上通用的做法是“数据+校验”:在真实数据后面附上校验和(CRC或累加和),读取时先算一遍,不匹配就说明数据损坏,回退到默认值。这样系统即使异常断电,也不会用错误参数运行。
写入时机要讲究。频繁保存会让存储介质快速老化,还会拖慢主循环。正确做法是:数据变化后先标记“脏”,在合适的时机(比如按键释放、定时周期到、或者掉电检测触发)统一落盘。有掉电检测引脚的项目,可以在检测到电压跌落时,用剩余时间把关键数据紧急写入。
磨损均衡必须考虑。Flash的擦写次数有限,如果每次都写同一个扇区,这块扇区很快会坏。做法是把数据在多个扇区之间轮转:写之前找下一个可用扇区,旧的先标记为废弃。这样擦写次数被均匀摊到所有扇区,寿命能成倍提升。很多成品设备“突然变砖”,就是因为忽略了这一点。
数据格式上要预留版本号。存一个“数据结构版本”字段,以后升级固件、参数表结构变化时,旧数据能正确迁移,不至于全盘清空。这和软件工程里的“向后兼容”一个道理,硬件产品迭代几次之后,你会感谢当初这个设计。
最后强调测试方法。掉电保存的bug很难在正常调试时发现,要专门做“随机断电测试”:程序运行时随机拉掉电源再上电,反复几十次,检查数据是否一致、系统能否恢复。这种测试能暴露绝大部分存储逻辑问题。把存储层做扎实,产品才敢真正交付给用户。 |
|
|
|
|
|
|
|