目录
前言
使用环境
使用方法
原创不易,点个赞或者点个关注激励笔者分享更多优质原创内容吧!
开源万岁!
从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");//用于存储数据,判断是否为初次上电
示例这里定义了三种要存储的数据,分别是姓名、身高和年龄,我们可以按照自己的需要修改。
很多细节在注释里已经详细说明,请仔细阅读下面代码的注释
主要添加的有初次上电的判断以及初次上电的数据初始化
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”表示要读取的是字符串
括号内为要读取的数据地址
当然,除了字符串的存储和读取,还可以存储其他类型的数据,整形,浮点数,字符通通可以,此处不再赘述,有需要请自行搜索相关函数。