EEPROM類庫的使用 斷電不丟失的儲存晶元

2022-04-13 02:58:07 字數 2552 閱讀 9097

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)該功能用於往記憶體空間寫入資料

val:寫入的資料。

返回值: 無

注意點:寫入的資料只是寫入到申請的記憶體空間,並不是立刻寫入到flash中

eeprom其實是從外部flash中儲存器最末尾開闢的4096位元組空間

write只寫乙個位元組的資料,所以資料的值應該在0~255之間,超過255的資料寫入就不正確了

函式: read(address)該功能用於讀取資料操作

返回值: 返回儲存資料

注意點:讀取的資料也是從begin中生成的記憶體空間中去獲取,並不會直接操作flash  

【read唯讀乙個位元組的資料】

函式: commit()該功能用於把記憶體空間的資料覆蓋到flash eeprom塊去  

引數: 無;

返回值: 返回bool值,表示是否覆蓋成功;

注意點:這個方法才是真正的把資料從記憶體控制項寫回到flash空間;

而且,寫回flash之前會把整一塊sector全部擦除掉,也就意味著就算我們begin(1)最終也是會擦除4096位元組空間。但是size的大小決定了記憶體空間的剩餘量以及回寫的快慢,所以根據具體情況來設定size

函式: end()該功能用於寫入flash,並且釋放記憶體空間

引數: 無

返回值: 無

注意點:end包含了寫入flash,並且**記憶體空間

建議讀者操作完eeprom之後,必須呼叫這個方法,**記憶體空間很重要 

例子-----寫入資料

//

功能描述:該**向eeprom寫入100位元組資料

#include int addr = 0; //

eeprom資料位址

void

setup()

eeprom.end();

//把資料寫入flash,並釋放記憶體

serial.println("

結束write");

}void

loop()

例子二:讀資料

#include int addr = 0; //

eeprom資料位址

void

setup()

eeprom.end();

}void

loop()

天子驕龍

ASIHttpRequest類庫的使用

asihttprequest有很多功能,所有功能說明都可以在其官方 的相關文件中查到,限於篇幅,本章僅簡單介紹一下如何使用asihttprequest來進行同步http請求和非同步http請求。在後面的章節中,我們還會用到它的一些其他功能。在使用asihttprequest之前,請確認已經正確安裝,...

類庫介面檔案的使用(匯出類)

將工程匯出的dll h lib作為動態庫給其他工程使用時,dll需要提供def檔案來指引找到lib檔案。使用dllexport和dllimport宣告可以省略給出def檔案,使用方法如下 globaldef.h ifdef dll exports define globalinte ce api d...

lxml類庫的xpath的使用

為什麼要學習lxml類庫和xpath呢?lxml類庫是一款高效能的python html xml解析器,我們可以利用xpath,來快速地定位特定元素以及獲取節點資訊。xpath是一門在html xml文件中查詢資訊的語言,可用來在html xml文件中對元素和屬性進行遍歷。xml和html的區別?x...