ESP32-WROOM-32使用EEPROM库无法实现数据掉电持久存储问题求助
问题核心原因
ESP32本身没有物理EEPROM,官方EEPROM库是通过Flash空间模拟实现的,操作逻辑和传统AVR架构的Arduino完全不同,你漏了两个必须的操作步骤:
- 使用EEPROM前必须调用
EEPROM.begin(存储大小)初始化模拟存储空间 - 调用
EEPROM.put()仅将数据写入RAM缓存,必须额外调用EEPROM.commit()才会将缓存数据刷入Flash完成持久化存储
所需修改的代码
1. 调整setup函数,新增EEPROM初始化
void setup() { Serial.begin(115200); // 新增:初始化模拟EEPROM空间,根据存储数据大小设置,这里512字节完全满足需求 EEPROM.begin(512); EEPROM.get(0, mydata); // 原有读取逻辑不变 for (byte i = 0; i < maxAnz; i++) { Varindex = i; // 修复原有bug:checkminmax依赖全局Varindex,循环时需赋值 checkminmax(); } changed = true; // 后续原有代码保持不变 }
2. 调整saveEEprom函数,新增写入提交
void saveEEprom() { if (datachanged) { datachanged = false; #ifdef debug Serial.println("Save in EEprom"); #endif EEPROM.put(0, mydata); // 新增:将RAM缓存数据刷入Flash,完成持久化保存 EEPROM.commit(); } }
可选优化建议
- 新增首次启动校验,避免第一次读取Flash时得到垃圾数据:可以在存储结构体中加入一个固定的魔术字(比如
0xAA55),读取时如果魔术字不匹配就初始化所有变量为默认值,再写入EEPROM。 - 若后续存储需求更复杂,建议使用ESP32官方推荐的
Preferences库,采用键值对方式存储,比模拟EEPROM更稳定、擦写寿命损耗更低。
注意事项
ESP32的Flash模拟EEPROM擦写寿命约为10万次,不要高频调用EEPROM.commit(),你当前只有双击按钮才触发保存的逻辑符合使用要求,不会过度损耗Flash寿命。
内容的提问来源于stack exchange,提问作者Carlos Costa
相关产品推荐
相关产品推荐

