EEPROM類庫的使用---斷電不丟失的存儲芯片


 

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() { 

 }

 

 

 

 

 

 

 

 

天子驕龍


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM