根據官方說明,各版本的Arduino都自帶一個小容量的EEPROM,在各型號的arduino控制器上的AVR芯片均帶有EEPROM,也有外接的EEPROM芯片,常見arduino控制器的EEPROM大小:
Arduino UNO、Arduino duemilanove-m328、Zduino m328均使用ATmega328芯片,EEPROM都為1K
目的
EEPROM可以在不使用文件和文件系統的情況下用來固化一些數據,常見的比如用來保存SSID或是Password,保存用戶名及密碼,保存用戶設置等數據,這樣就可以不用每次都通過燒寫程序來改變系統運行時的初值了。可以實現更復雜的應用。
使用說明
其實EEPROM使用非常簡單的,也沒必要專門開個帖子寫,看看官方說明和例程分分鍾就會了。

addr是地址,data是數據,size為需要讀寫的數據字節最大地址+1
EEPROM.begin(size)
EEPROM.write(addr,data)
EEPROM.commit()
EEPROM.end()
EEPROM.read(addr)
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
