代码
/*
EEPROM(带电可擦可编程只读存储器) 写入
将随机数存储进EEPROM.
这些数据会保存在EEPROM中,esp32掉电重启后依然存在,并可被其他例程调用
*/
#include "EEPROM.h"
// we're going to write to next)
int addr = 0; //EEPROM当前地址
#define EEPROM_SIZE 64 //64字节 申请空间的大小必须为4的倍数,如:23则会更改成24
void setup()
{
Serial.begin(115200);
Serial.println("初始化...");
if (!EEPROM.begin(EEPROM_SIZE)) //申请EEPROM 64字节的空间
{
Serial.println("初始化EEPROM失败"); delay(1000000);
}
Serial.println(" 从Flash中读取到数据,值为:");
for (int i = 0; i < EEPROM_SIZE; i++)
{
Serial.print(byte(EEPROM.read(i))); Serial.print(" ");
}
Serial.println();
Serial.println("正将随机数写入到内存中");
}
void loop()
{
// need to divide by 4 because analog inputs range from
// 0 to 1023 and each byte of the EEPROM can only hold a
// value from 0 to 255.
// int val = analogRead(10) / 4;
int val = byte(random(10020));
// write the value to the appropriate byte of the EEPROM.
// these values will remain there when the board is
// turned off.
EEPROM.write(addr, val);
Serial.print(val); Serial.print(" ");
addr = addr + 1; //前进到下一地址
if (addr == EEPROM_SIZE)
{
Serial.println();
addr = 0;
EEPROM.commit(); //保存更改
Serial.print(EEPROM_SIZE);
Serial.println("字节 Flash存储的数据:");
for (int i = 0; i < EEPROM_SIZE; i++)
{
Serial.print(byte(EEPROM.read(i))); Serial.print(" ");
}
Serial.println(); Serial.println("----------------------------------");
}
delay(100);
}
运行结果
注:
例程所示,申请了64字节的空间,地址范围0~63,若addr=64,等价于addr=0。
补充:
说一些需要注意的地方
1.我们使用开辟的空间是从ESP32的FLASH中分配出来的
2.包含的那个头文件的库里面已经有一个EEPROM对象可以直接使用
3.默认的EEPROM对象大小为4096字节,用户操作地址为0~4095;
4.读取和写入有函数支持,但切忌写入的东西都写完后要用保存函数保存更改才会正式生效,保存函数为EEPROM.commit()或EEPROM.end()
5.空间的申请都是4字节的倍数,即使你申请23,系统内部也会给你改成24字节
6.ESP32的EEPROM只是从flash上申请一个扇区用,所以读写都只能按扇区(4096字节)来
7.这个东西存在的目的本就不是存什么大东西的哈,只是存一些关键的需要掉电存储的参数,所以建议大家不要改申请地址,一直用这个大小就好,如果大改小会导致一些原来的数据丢失哈
8.那么存一些字符串和很大的数怎么办呢?你可以封装一个专门用于存储读取字符串的函数,但是这个东西存字符串这种东西的应用不常见,那么存一些大的数怎么办呢,这个非常常见,因为我们是8位的,也就是0-255,如果太大或者是小数呢,我们可以分高低位存储,除以255和取余255分别为高低位,甚至分高中低三位都行,而小数呢,也很简单,比如我们可以放大1000倍取整然后高低位存进去,之后取出来还原,再除以1000,就可以得到0.001精度的小数保留,精度还可以再放大。
参考,感谢: