使用Arduino开发ESP32(八):ESP32的EPROM的写入读取

写入EPROM

/*
该代码向EEPROM写入4096字节数据
*/
#include 

void setup() 
{
     
  Serial.begin(115200);
  Serial.println("");
  Serial.println("开始写入");

  EEPROM.begin(4096); //申请操作到地址4095,size=目标地址+1
  for(int addr = 0; addr<4096; addr++)
  {
     
    int data = addr%256; //在该代码中等同于int data = addr;因为下面write方法是以字节为存储单位的
    EEPROM.write(addr, data); //写数据
  }
  EEPROM.commit(); //保存更改的数据
  // EEPROM.end(); //同EEPROM.commit();

  Serial.println("写入完成");
}

void loop() 
{
     
}

使用Arduino开发ESP32(八):ESP32的EPROM的写入读取_第1张图片

读取EPROM

/*
该代码从EEPROM读取4096字节数据
*/
#include 

void setup() 
{
     
  Serial.begin(115200);
  Serial.println("");
  Serial.println("开始读取");

  EEPROM.begin(4096); //申请操作到地址4095(比如你只需要读写地址为100上的一个字节,该处也需输入参数101)
  for(int addr = 0; addr<4096; addr++)
  {
     
    int data = EEPROM.read(addr); //读数据
    Serial.print(data);
    Serial.print(" ");
    delay(2);
    if((addr+1)%256 == 0) //每读取256字节数据换行
    {
     
      Serial.println("");
    }
  }

  Serial.println("读取结束");
}

void loop() 
{
     
}

使用Arduino开发ESP32(八):ESP32的EPROM的写入读取_第2张图片
基础、注意事项:

Arduino core for the ESP32中的EEPROM是在flash中开辟的存储区域;
调用#include 来使用EEPROM;
EEPROM库中默认已经定义了一个名为EEPROM的对象,一般情况下直接使用该对象即可,如果有需要用户也可以在flash中自定义新的EEPROM对象,使用方法参考文后链接;
默认的EEPROM对象大小为4096字节,用户操作地址为0~4095;
使用EEPROM时,首先调用EEPROM.begin(size),size为需要读写的数据字节最大地址+1,取值1~4096;
使用EEPROM.write(addr,data)来写数据,参数分别为地址&数据,写数据后需要通过EEPROM.commit()或EEPROM.end()将数据保存到EEPROM;
使用EEPROM.read(addr)来读数据;

对EEPROM的操作以4字节为单位,比如上面中第一次size写10时,程序自动将size转成了12处理,第二次size写5时,程序自动将size转成了8处理;
每次EEPROM.begin(size)时程序会建立一个size长度的缓存,然后从EEPROM地址0开始依次读取size个数据到缓存,你之后的read和write操作的都是这个缓存;
当你使用commit或end时,程序会将上面的缓存依次从地址0开始写入EEPROM;
问题就出在上面那步,因为ESP32的EEPROM并非真正的EEPROM,只是从flash上划了一个扇区用,所以读写都只能按扇区(4096字节)来,那么在写入的时候从地址0开始的size个数数据时ok的,但后面4096-size个数据就可能会被改变;
可以看到第二次写操

待解决疑问:
测试结果输出了4096个int型,EPROM应当是4096*4字节?

猜想:
虽然代码定义的是int型变量接收,但实际上读取的只有一个字节的数字,但如此

    int data = addr%256; 
    EEPROM.write(addr, data); 

这里写入的也是int型,又该如何解释呢?

参考、引述文章:
使用Arduino开发ESP32(05):EEPROM使用演示

你可能感兴趣的:(ESP32学习之路)