
EEPROM(Electrically Erasable Programmable Read-Only Memory),電可擦可編程只讀存儲器——一種掉電后數據不丟失的存儲芯片。
EEPROM可以在不使用文件和文件系統的情況下用來固化一些數據,常見的比如用來保存SSID或者Password,保存用戶設置等數據,這樣就可以不用每次都通過燒寫程序來改變系統運行時的初始值。
Arduino提供了完善的eeprom庫,不過需要注意的是ESP8266沒有硬件EEPROM,使用的是flash模擬的EEPROM
EEPROM庫在Arduino中經常用於存儲設定數據。當然基於Arduino的ESP8266也不例外。但是,和真正的Arduino板子不一樣的是,ESP8266采用的方式是將flash中某一塊4K的存儲模擬成EEPROM。至於為什么是4K呢?主要原因是flash是以sector為一個單位,1 sector等於4096Bytes(4KB),操作flash時是以sector為一個整體來操作
讀取操作是通過ESP8266 SDK提供的API將flash中的內容讀取到Buffer中是沒有限制一次就要將4K全讀完,Buffer的大小由EEPROM.begin(size)決定,但是由於Buffer大小會占用內存RAM,所以務必按照實際需要來定義大小
寫入操作是通過commit將flash eeprom地址的4K 存儲內容刪除后才將Buffer寫入flash中(也就是說就算你buffer只有4個字節,但是最終還是會刷新整個sector)
和標准的EEPROM庫不一樣的是,你需要在讀或者寫操作之前先通過 EEPROM.begin(size) 來聲明你需要操作的存儲大小,size取值范圍為4~4096字節
EEPROM.write() 不會立刻把內容寫進flash,如果你希望保持到flash去,那么你必須調用 EEPROM.commit()。當然,EEPROM.end() 不僅也能完成commit,同時會釋放申請的eeprom ram資源
EEPROM庫非常簡單:

函數: begin(size)
該功能用於申請具體大小的ram內存空間並從flash中讀取相應數據到內存
size:要申請的內存大小(size取值范圍為4~4096字節)
返回值: 無
注意點:size必須大於0
雖然我們可以輸入自定義size,但是最終會經過計算得到真正的size(4的倍數),並申請對應的內存空間
函數: write(address,value) 該功能用於往內存空間寫入數據
address:要寫入的地址位置,取值范圍為內存空間的地址0~size
val:寫入的數據。
返回值: 無
注意點:寫入的數據只是寫入到申請的內存空間,並不是立刻寫入到flash中
EEPROM其實是從外部flash中存儲器最末尾開辟的4096字節空間
【
write只寫一個字節的數據,所以數據的值應該在0~255之間,超過255的數據寫入就不正確了】
函數: read(address) 該功能用於讀取數據操作
address:要讀取的地址位置,取值范圍為內存空間的地址0~size
返回值: 返回存儲數據
注意點:讀取的數據也是從begin中生成的內存空間中去獲取,並不會直接操作flash
【read只讀一個字節的數據】
函數: commit() 該功能用於把內存空間的數據覆蓋到flash eeprom塊去
參數: 無;
返回值: 返回bool值,表示是否覆蓋成功;
注意點:這個方法才是真正的把數據從內存控件寫回到flash空間;
而且,寫回flash之前會把整一塊sector全部擦除掉,也就意味着就算我們begin(1)最終也是會擦除4096字節空間。但是size的大小決定了內存空間的剩余量以及回寫的快慢,所以根據具體情況來設置size
函數: end() 該功能用於寫入flash,並且釋放內存空間
參數: 無
返回值: 無
注意點:end包含了寫入flash,並且回收內存空間
建議讀者操作完EEPROM之后,必須調用這個方法,回收內存空間很重要
例子-----寫入數據
//功能描述:該代碼向EEPROM寫入100字節數據 #include <EEPROM.h> int addr = 0; //EEPROM數據地址 void setup() { Serial.begin(115200); Serial.println(""); Serial.println("開始寫write"); EEPROM.begin(100);//申請內存並讀取flash中相應的數據到內存 for(addr = 0; addr<100; addr++){ int data = addr; EEPROM.write(addr, data); //寫數據 } EEPROM.end(); //把數據寫入flash,並釋放內存 Serial.println("結束write"); } void loop() { }
例子二:讀數據
#include <EEPROM.h> int addr = 0; //EEPROM數據地址 void setup() { Serial.begin(115200); Serial.println(""); Serial.println("開始讀數據"); EEPROM.begin(100);//申請100內存空間 for(addr = 0; addr<100; addr++){ int data = EEPROM.read(addr); //從內存中讀取一個字節數據 Serial.println(data); delay(2); } EEPROM.end(); } void loop() { }
天子驕龍