ESP32 EEPROM commit()写入错误求助:测试大内存后小内存失效
ESP32 EEPROM与Preferences库写入错误排查与解决
问题背景
之前使用ESP32的EEPROM库存储数据正常,随后测试超大尺寸的EEPROM空间时,执行了以下代码:
EEPROM.begin(12345678); EEPROM.write(12345644,0xff); EEPROM.commit();
切换回原有的小内存参数(如10字节)后,出现错误提示:[538][E][EEPROM.cpp:196] commit(): error in write,同时Preferences库也出现保存失败的问题。
测试代码
当前用于复现问题的测试代码如下:
#include <Arduino.h> #include <EEPROM.h> #define EEPROM_SIZE 10 void setup() { Serial.begin(9600); Serial.println(); //read first 10 bytes Serial.println(); Serial.println("read first 10 bytes"); Serial.println(); EEPROM.begin(EEPROM_SIZE); for(int i =0 ;i<EEPROM_SIZE;i++) { int state = EEPROM.read(i); Serial.print("addres: "); Serial.print(i); Serial.print(" value: "); Serial.println(state); } EEPROM.end(); //write first 10 bytes Serial.println(); Serial.println("write first 10 bytes"); EEPROM.begin(EEPROM_SIZE); for(int i =0 ;i<EEPROM_SIZE;i++) { Serial.print(i); Serial.print(" "); EEPROM.write(i,0xff); EEPROM.commit(); } EEPROM.end(); //read addres 2 Serial.println(); Serial.println("read addres 2"); EEPROM.begin(EEPROM_SIZE); int state = EEPROM.read(2); Serial.print("value: "); Serial.println(state); EEPROM.end(); // Wait 10 seconds Serial.println(); Serial.println("Restarting in 10 seconds..."); delay(10000); // Restart ESP ESP.restart(); } void loop() { }
问题原因
ESP32的Arduino EEPROM库并非真正的EEPROM,而是通过Flash分区模拟实现的。默认情况下,ESP32分配给EEPROM模拟的Flash分区大小仅为4KB(4096字节)。你之前设置的12345678字节远超过该分区容量,直接破坏了Flash的分区表或模拟EEPROM的存储区域,导致后续正常的EEPROM操作和依赖Flash分区的Preferences库都无法正常工作。
解决方法
方法1:彻底擦除整个Flash
使用esptool.py工具擦除ESP32的全部Flash,之后重新烧录程序:
esptool.py --port 你的串口端口号 erase_flash
(例如Windows系统下串口为COM3,命令为esptool.py --port COM3 erase_flash)
方法2:擦除模拟EEPROM区域
上传一段专门擦除模拟EEPROM分区的代码,修复损坏的区域:
#include <EEPROM.h> void setup() { Serial.begin(9600); // 以默认最大模拟EEPROM大小初始化 EEPROM.begin(4096); // 逐个字节擦除 for (int i = 0; i < 4096; i++) { EEPROM.write(i, 0); } EEPROM.commit(); EEPROM.end(); Serial.println("模拟EEPROM区域已擦除"); delay(2000); ESP.restart(); } void loop() {}
上传完成后,等待程序执行完毕,再重新上传你的原有测试代码即可。
注意事项
- ESP32模拟EEPROM的最大可用大小由Flash分区表中的
eeprom分区定义,默认是4KB,若需要更大空间,需修改分区表后重新编译烧录。 - 不要随意设置超过分区容量的
EEPROM.begin()参数,避免破坏Flash存储结构。
内容的提问来源于stack exchange,提问作者adamos321
相关产品推荐
相关产品推荐

