根據官方說明,各版本的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