从零开始的ESP8266探索(08)-EEPROM使用测试


EEPROM可以在不使用文件和文件系统的情况下用来固化一些数据,常见的比如用来保存SSID或是Password,保存用户名及密码,保存用户设置等数据,这样就可以不用每次都通过烧写程序来改变系统运行时的初值了。可以实现更复杂的应用。

使用说明

其实EEPROM使用非常简单的,也没必要专门开个帖子写,看看官方说明和例程分分钟就会了。

EEPROM

This is a bit different from standard EEPROM class. You need to call EEPROM.begin(size) before you start reading or writing, size being the number of bytes you want to use. Size can be anywhere between 4 and 4096 bytes.

EEPROM.write does not write to flash immediately, instead you must call EEPROM.commit() whenever you wish to save changes to flash. EEPROM.end() will also commit, and will release the RAM copy of EEPROM contents.

EEPROM library uses one sector of flash located just after the SPIFFS.

Three examples included.

Note that the sector needs to be re-flashed every time the changed EEPROM data needs to be saved, thus will wear out the flash memory very quickly even if small amounts of data are written. Consider using one of the EEPROM libraries mentioned down below.

EEPROM 

这是一个有点不同于标准的EEPROM类。您需要在开始读写之前调用EEPROM.begin(size), size是您想要使用的字节数。大小可以在4到4096个字节之间。eepm。

EEPROM.write不会立即写入Flash,而是EEPROM.commit()在您希望将更改保存到Flash时必须调用EEPROM.end()也将提交,并将释放EEPROM内容的RAM副本。

EEPROM库仅在SPIFFS之后使用一个闪存扇区。

包括三个例子。

请注意,每次需要保存更改的EEPROM数据时,都需要重新刷新该扇区,因此即使写入少量数据,也会非常快地耗尽闪存。考虑使用下面提到的EEPROM库之一。

 

 

EEPROM主要几点如下:

Arduino for esp8266 中用的EEPROM其实是从外部flash中存储器最末尾开辟的4096字节空间,结合官方说明,我们每次操作写入的数据在4~4096字节之间;
根据上一条,EEPROM可操作的地址为0~4095;
调用#include <EEPROM.h>来使用EEPROM;
使用EEPROM时,首先调用EEPROM.begin(size),size为需要读写的数据字节最大地址+1,取值4~4096;
使用EEPROM.write(addr,data)来写数据,参数分别为地址&数据,写数据后需要通过EEPROM.commit()或EEPROM.end()将数据保存到EEPROM;
使用EEPROM.read(addr)来读数据;
更多内容可以参考官方例程:https://github.com/esp8266/Arduino/tree/master/libraries/EEPROM

程序测试
写数据
/*
该代码向EEPROM写入4096字节数据
*/
#include <EEPROM.h>

int addr = 0; //EEPROM数据地址

void setup()
{
Serial.begin(9600);
Serial.println("");
Serial.println("Start write");

EEPROM.begin(4096); //申请操作到地址4095(比如你只需要读写地址为100上的一个字节,该处也需输入参数101)
for(addr = 0; addr<4096; addr++)
{
int data = addr%256; //在该代码中等同于int data = addr;因为下面write方法是以字节为存储单位的
EEPROM.write(addr, data); //写数据
}
EEPROM.commit(); //保存更改的数据

Serial.println("End write");
}

void loop()
{
}

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

int addr = 0;

void setup()
{
Serial.begin(9600);
Serial.println("");
Serial.println("Start read");

EEPROM.begin(4096); //申请操作到地址4095(比如你只需要读写地址为100上的一个字节,该处也需输入参数101)
for(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("End read");
}

void loop()
{
}


读取测试结果

 

 


注意事项
当你需要分多次写EEPROM时,切记之后每次EEPROM.begin(size);中输入的size必须大于等于之前每次输入的值。简单点的话可以每次写入时这里都输入你可能会用到的最大值,比如如果对时间和内存要求不高的话这里可以写死4096。

你每次操作EEPROM,根据你输入的size,会建立一个size大小的缓存并从EEPROM地址0开始读取size长度数据到该缓存,你之后的读写操作是对这个缓存的操作。当你提交写入的时候,程序才会把缓存中的数据写入EEPROM,但是EEPROM的写入是以扇区为单位的(4096字节),那么在写入的时候从地址0开始的size个数数据时ok的,但后面4096-size个数据就可能会被改变(我目前遇到的就是后面的数据都变255了)。这应该是这个库的一个逻辑bug。因为ESP8266的EEPROM并非真正的EEPROM,只是从flash上划了一个扇区用,所以读写都只能按扇区来。

总结
EEPROM的使用非常简单,没有什么太多可以说的。
————————————————
版权声明:本文为CSDN博主「Naisu_kun」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Naisu_kun/article/details/82915959


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM