打卡第二十五集-FLASH模拟EEPROM
关于 IAP 技术,做过 bootloader 的想必很熟悉 (IAP全称 In Application Programming,即应用编程),和 ISP (全称 In System Programming,即系统编程)不同,ISP 一般都是通过专业的调试器或者下载器对单片机内部的 Flash 存储器进程编程(如JTAG等),而 IAP 技术是从结构上将 Flash 储存器映射分为两个或者多个分区,在一个分区中对其他分区进行编程,这个分区通常称为 bootloader


一、FLASH 和 EEPROM
1. 狭义 EEPROM
- 特点:按字节擦写。可以单独修改某一个字节,无需擦除整个区域。
- 寿命:约 100 万次擦写,数据保留 100 年。
- 容量:通常很小(几十 KB 到几百 KB),很少超过 512 KB。
- 成本:较高,电路复杂。
- 典型用途:存储需要频繁修改的用户配置、校准参数、运行日志等。
2. FLASH(属于广义 EEPROM)
- 特点:按块/扇区擦除(不能直接改写单个字节)。写入前必须先擦除(将块内所有位变为 1,即 0xFF),然后再编程。
- 寿命:擦写次数较少,通常 1 万~10 万次(Nor Flash 约 10 万次,Nand Flash 更少)。
- 容量:大,从几十 KB 到数 GB。
- 成本:低,集成度高。
- 典型用途:存储程序代码(固件)、大容量文件系统。
3. 关键区别表
| 特性 |
狭义 EEPROM |
FLASH(Nor Flash) |
| 擦写单位 |
字节(Byte) |
块/扇区(512 B~ 128 KB) |
| 改写方式 |
直接写新数据即可 |
必须先擦除块,再写入 |
| 擦写次数 |
100 万次 |
1 万~10 万次 |
| 速度 |
写入较慢(ms 级) |
擦除慢(ms~s),写入快 |
| 成本/容量 |
贵、小 |
便宜、大 |
二、没有独立 EEPROM 时,如何保存掉电数据?
现在的单片机(如 STM32、ESP32、GD32 等)通常只内置 FLASH,不再单独集成 EEPROM。但我们可以用 Flash 模拟 EEPROM 的方法,或者外接存储芯片。
✅ 方法一:使用片内 FLASH 模拟 EEPROM(最常用)
原理:
利用 FLASH 的一个扇区(或几个扇区),通过软件算法实现类似 EEPROM 的“按字节修改”效果。核心思路是:
- 写入:不直接覆盖原数据,而是将新数据追加写入到扇区中未使用的区域,旧数据标记为无效。
- 读取:扫描扇区,找到最新版本的有效数据。
- 垃圾回收:当扇区快写满时,将有效数据拷贝到另一个空闲扇区,然后擦除原扇区。
这就是著名的 “磨损均衡” + “增量存储” 技术,很多厂商提供了现成的库:
- STM32:EEPROM Emulation 库(基于 FLASH)。
- 其他 MCU:可以自行实现简易版本,或使用开源库(如 EasyFlash、FlashDB)。
优缺点:
- ✅ 不增加硬件成本。
- ✅ 可达到 10 万次以上的有效擦写寿命(通过磨损均衡)。
- ❌ 需要额外的代码和 RAM 开销。
- ❌ 写入速度比真正 EEPROM 慢(因为涉及扫描、拷贝)。
示例(伪代码思路):
c
// 写入一个字节(或参数)
void eeprom_write(uint16_t addr, uint8_t data) {
// 在 FLASH 中找一个空闲位置,写入 {addr, data, 校验}
// 如果扇区满了,就触发垃圾回收
}
// 读取一个字节
uint8_t eeprom_read(uint16_t addr) {
// 扫描整个模拟区,找到 addr 对应的最新数据
}
✅ 方法二:使用外部 EEPROM 芯片
如果对擦写寿命要求极高(如每天修改数千次),或者不想写复杂代码,可以外挂一颗 I²C/SPI 接口的 EEPROM(如 AT24Cxx 系列,容量 2Kb~512Kb)。
- 优点:简单可靠,按字节读写,寿命 100 万次。
- 缺点:增加 PCB 面积和成本。
✅ 方法三:使用 FRAM(铁电存储器)
FRAM 像 EEPROM 一样非易失,但速度更快(类似 SRAM),擦写次数近乎无限(10¹² 次以上)。常见型号:FM24C04、MB85RCxx。
- 优点:完美替代 EEPROM,无需模拟。
- 缺点:价格较贵,货源不如 EEPROM 普遍。
✅ 方法四:优化应用层设计,减少擦写次数
即使没有 EEPROM,你也可以通过软件技巧延长 FLASH 寿命:
- 数据聚合:将多次修改暂存在 RAM 中,只在掉电前或累计一定次数后写入 FLASH。
- 利用备份寄存器:部分 MCU(如 STM32)有几十字节的 后备寄存器(由 VBAT 供电),掉电后数据不丢失,可当超小 EEPROM 用。
- 使用外部 FRAM/EEPROM 如前所述。
三、总结建议
| 场景 |
推荐方案 |
| 修改次数少(每天 < 10 次),成本敏感 |
FLASH 模拟 EEPROM(厂商库) |
| 修改频繁(每小时 > 100 次),寿命要求高 |
外接 EEPROM 或 FRAM |
| 需要极低功耗、简单接口 |
外接 I²C EEPROM |
| 只有几个字节的参数,且 MCU 有后备寄存器 |
使用后备寄存器(如 STM32 的 RTC BKP) |
最后提醒:如果用 FLASH 模拟 EEPROM,一定要注意掉电保护——在擦除/写入 FLASH 时若突然断电,可能导致数据损坏。常用对策:使用双扇区备份 + 写入完成标志。