【ESP32教程】使用EEPROM Class实现ESP32的EEPROM功能

目录

前言

使用环境

使用方法

原创不易,点个赞或者点个关注激励笔者分享更多优质原创内容吧!

开源万岁!


前言

        从ESP32板子的官方库中可以找到EEPROM库,但是阅读README.md文件可知,ESP32并没有EEPROM,而是使用内部FLASH模拟出来EEPROM的,这是为了和以前的Arduino程序兼容。

以下是README.md文件的原文:

## EEPROM

EEPROM is deprecated.  For new applications on ESP32, use Preferences.  EEPROM is provided for backwards compatibility with existing Arduino applications.
EEPROM is implemented using a single blob within NVS, so it is a container within a container. As such, it is not going to be a high performance storage method.  Preferences will directly use nvs, and store each entry as a single object therein.

        注意,NVS为非易失性存储,是在FLASH中开辟出来的一块区域,用于模拟EEPROM以存储数据。
 

使用环境

Arduino IDE V2.0.0-rc9.2

ESP32-Wroom-DA Module

ESP32-Wroom-DA Module的示例中的EEPROM->eeprom_class

EEPROM使用的示例

使用方法

  • 首先包含头文件
  • #include "EEPROM.h"
    
  • 然后定义你要存储的变量
  • EEPROMClass  NAMES("eeprom0");
    EEPROMClass  HEIGHT("eeprom1");
    EEPROMClass  AGE("eeprom2");
    EEPROMClass  FIRST_POWER_ON__JUDGE("eeprom3");//用于存储数据,判断是否为初次上电

    示例这里定义了三种要存储的数据,分别是姓名、身高和年龄,我们可以按照自己的需要修改。

  • 接着对EEPROM的初始化文件进行封装(以下程序部分为示例提供,有一定修改)
  • 很多细节在注释里已经详细说明,请仔细阅读下面代码的注释

    主要添加的有初次上电的判断以及初次上电的数据初始化

    void EEPROM_Init()
    {
      Serial.begin(115200);    //串口初始化
    
      Serial.println("__________EEPROM Initializing...__________");
      delay(1000);
      Serial.println("Testing EEPROMClass\n");
    
    //以下是EEPROM的初始化
      if (!NAMES.begin(0x500)) {    
    //这里填入的0x500为你所需要的空间的大小的字节数,此处为0x500个字节
        Serial.println("Failed to initialise NAMES");
        Serial.println("Restarting...");
        delay(1000);
        ESP.restart();    //初始化失败就重启ESP32
      }
      if (!HEIGHT.begin(0x200)) {
        Serial.println("Failed to initialise HEIGHT");
        Serial.println("Restarting...");
        delay(1000);
        ESP.restart();
      }
      if (!AGE.begin(0x100)) {
        Serial.println("Failed to initialise AGE");
        Serial.println("Restarting...");
        delay(1000);
        ESP.restart();
      }
      if (!FIRST_POWER_ON__JUDGE.begin(2)) {
        Serial.println("Failed to initialise FIRST_POWER_ON__JUDGE");
        Serial.println("Restarting...");
        delay(1000);
        ESP.restart();
      }
      
    
    
    /*如果是初次上电,就进行初始化*/
    //这一步主要是为了在EEPROM里写入自己需要的初始化数据
    //只在ESP32第一次上电时初始化一次,后面不会再初始化
      if(FIRST_POWER_ON__JUDGE.readUChar(0) != 0xA5 || \     
        FIRST_POWER_ON__JUDGE.readUChar(1) != 0x5A){
    //EEPROM出厂时的内容一般都初始化为         
    //0xFF,所以我们判断是否为0xA5和0x5A
    //来判断该EEPROM是否为第一次上电,如
    //果不是0xA5和0x5A,则为第一次上电,执行第一次上电的初始化
    //并写入0xA5和0x5A,下次上电就不会再次执行初始化
          
          Serial.println("EEPROM first use initialization.");//串口提示该EEPROM为第一次上电使用
    //写入已经上电标志位
          FIRST_POWER_ON__JUDGE.writeUChar(0, 0xA5);
          FIRST_POWER_ON__JUDGE.writeUChar(1, 0x5A);
          FIRST_POWER_ON__JUDGE.commit();
          //以下写入你自己的数据初始化代码,格式与写上电标志位的代码一样
          //写入数据后记得要写commit();
          //如NAMES.commit();
          //写入后commit的数据才会真正保存到EEPROM中,掉电不易失
    
          
      }
      
      Serial.println("__________EEPROM has initialized__________");//提示初始化完成
      // Serial.println("__________First Power On Judge__________");
      // Serial.printf("0x%08x\n", (uint32_t)FIRST_POWER_ON__JUDGE.readChar(0));
      // Serial.printf("0x%08x\n", (uint32_t)FIRST_POWER_ON__JUDGE.readChar(1));
    }
    

  • 写入数据时,如下面代码
  • USERNAME.writeString(counter * SIZE__USERNAME, OrderInfo.userName);

    “USERNAME”为自己定义的数据种类

    “writeString”表示要写入的是字符串

    括号内:

    第一个参数为要写入的数据的地址,假设为USERNAME分配了20个名字的空间,每个名字为8个字节大小,那么

            第0个名字写在地址0,

            第1个名字写在地址8,

            …

            以此类推

            所以此处使用了一个counter标识存储的是第几个名字,SIZE__USERNAME为名字的大小(8个字节)

    第二个参数为要存储的数据,也就是要存储的username

    存储的数据写入后,必须调用.commit()方法才能真正将数据存储进EEPROM,代码如下

    USERNAME.commit();

  • 读取数据时,如下
  • USERNAME.readString(counter * SIZE__USERNAME);

    “USERNAME”为自己定义的数据种类

    “writeString”表示要读取的是字符串

    括号内为要读取的数据地址

            当然,除了字符串的存储和读取,还可以存储其他类型的数据,整形,浮点数,字符通通可以,此处不再赘述,有需要请自行搜索相关函数。

    原创不易,点个赞或者点个关注激励笔者分享更多优质原创内容吧!

    开源万岁!

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【ESP32教程】使用EEPROM Class实现ESP32的EEPROM功能

    发表评论