You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:45:28