【前言】
很多小容量 MCU 不带独立 EEPROM,掉电需要保存参数时就只能拿 Flash 顶上。中颖 SH32F 系列同样适用这个思路,但 Flash 的擦写特性和 EEPROM 相差很大,直接当 EEPROM 用会很快把扇区写坏。这里把可靠的实现方式讲一下。
一、Flash 与 EEPROM 的本质差异
1. 擦写次数:Flash 一般只有 1 万到 10 万次,EEPROM 通常在百万次量级。
2. 擦写粒度:Flash 必须按扇区整块擦除,擦完后全为 1,只能把 1 写成 0,不能反过来。
3. 写入时间:Flash 擦除耗时长,期间 CPU 通常需要等待,不能一边擦一边取指执行。
二、可靠实现的三条基本规则
1. 不要原地反复写同一个地址。参数更新采用追加写,该位置写满后再整块擦除,把最新值搬回。
2. 关键数据做双备份加标志位。例如 A、B 两区交替写入,读取时选标志有效且版本号更大的那一个。
3. 写之前先确认电压和时钟稳定。低压下写 Flash 极易出现位翻转,务必在掉电检测里提前保存,不要等到电源塌陷。
三、具体的数据结构设计
1. 每个记录带上序号和校验。序号递增,校验用简单的异或或者 CRC16 即可。
2. 读取时按序号从大到小找第一条校验通过的记录,就是最新值。
3. 记录长度按字对齐,避免非对齐写入带来的额外处理。
四、几条实战经验
1. 第一版建议先用一个扇区做实验,反复擦写几千次观察是否出现坏块,确认参数没问题再上产品。
2. 掉电保存要留足时间余量。实际测一下从检测到掉电到电压跌到 Flash 不能写大概有多少毫秒,再决定一次能写多少数据。
3. 不要在中断里做 Flash 擦除,擦除期间取指会被拉长,中断响应时间会失控。
4. 若芯片支持,可以打开写保护,防止程序跑飞误擦参数区。
五、小结
Flash 模拟 EEPROM 的核心是追加写加定期整理,只要不原地死写、做好校验和备份,稳定性完全可以满足量产要求。
以上是 SH32F 系列上做参数存储的实践经验,欢迎交流。 |
|