如何使用Flash模擬EEPROM
在講解這篇博文前,首先要明白為什么使用Flash存儲來(lái)模擬EEPROM?
主要有以下幾個(gè)原因:
成本效益:許多微控制器(MCU)和系統芯片(SoC)內置有Flash存儲,但沒(méi)有專(zhuān)門(mén)的EEPROM。使用已有的Flash存儲模擬EEPROM可以減少額外硬件成本。
更大的存儲容量:通常,Flash存儲提供比EEPROM更大的存儲容量。這使得在沒(méi)有犧牲太多物理空間的情況下可以存儲更多數據。
靈活性和可擴展性:通過(guò)軟件,可以靈活地設計和調整EEPROM模擬的大小和結構,以適應不同的應用需求。這種方法比使用固定大小的物理EEPROM更具可擴展性。
數據持久性:盡管Flash存儲的寫(xiě)入次數有限,但它仍然能夠提供足夠的耐用性來(lái)滿(mǎn)足大多數應用的需要。通過(guò)適當的數據管理,可以最大限度地延長(cháng)Flash存儲的壽命。
數據保護和安全性:許多現代微控制器提供了Flash存儲的安全功能,如寫(xiě)入保護、加密等,這有助于保護存儲在Flash中的數據不被未經(jīng)授權訪(fǎng)問(wèn)。
易于編程和集成:使用Flash存儲來(lái)模擬EEPROM可以充分利用現有的Flash編程工具和技術(shù),同時(shí)也簡(jiǎn)化了硬件設計。
在使用Arduino開(kāi)發(fā)時(shí),有個(gè)內置庫可以使用Flash模擬EEPROM,極大方便了嵌入式數據存儲的開(kāi)發(fā)。
如果使用庫函數,只是知道調用API,很難理解Flash模擬EEPROM的原理和方法,本篇博文將以AT32F413(flash:256KB)這款MCU為例,詳細介紹如何使用Flash模擬EEPROM。
實(shí)現代碼:https://download.csdn.net/download/m0_38106923/88717668
1
FLASH與EEPROM簡(jiǎn)介
FLASH和EEPROM都為非易失性存儲器,在斷電后數據仍然可以長(cháng)期保存,這為FLASH模擬 EEPROM提供了條件,FLASH與EEPROM特點(diǎn)對比如下表所示:
FLASH模擬EEPROM優(yōu)點(diǎn):
低成本:可節約一顆EEPROM芯片;
存儲、讀取速度快:通訊速度快于使用I2C或者SPI通訊的EEPROM元件;
抗干擾能力強:由于FLASH在單片機內部,不會(huì )存在通訊總線(xiàn)被外部干擾的問(wèn)題;
容量可調:可根據實(shí)際使用,靈活調整存儲空間大小。
2
FLASH模擬EEPROM原理
2.1、EERPOM數據結構
由于FLASH在寫(xiě)入數據前,需要將FLASH數據先擦除為0xFF,而FLASH擦除時(shí)通常為扇區擦除,例如AT32F403A的扇區大小為2K字節,這個(gè)特性決定了不能簡(jiǎn)單將舊數據擦除然后寫(xiě)新數 據,因為這樣會(huì )導致存儲在這個(gè)扇區內的其他數據也被擦除,并且也會(huì )導致FLASH頻繁擦除而降低 其使用壽命。
所以FLASH模擬EEPROM的思路是:
新數據存儲不影響舊數據;
盡量減少FLASH擦除次數,延長(cháng)FLASH使用壽命。
基于以上的考慮,我們設計了以下存儲結構:
EERPOM結構
EEPROM由兩個(gè)頁(yè)組成:頁(yè)0和頁(yè)1,在使用的時(shí)候,1個(gè)頁(yè)處于有效狀態(tài),另外一個(gè)頁(yè)處于擦除 狀態(tài),讀取或者寫(xiě)入數據都在有效狀態(tài)的頁(yè)進(jìn)行。
數據格式
存儲的數據格式為數據 + 數據地址,地址和數據都是16位方式存儲,每一次存儲占用32位也就是 4個(gè)字節。圖中data列為數據,data address列為數據地址,flash address列為數據存儲的實(shí)際 flash地址偏移量。例如上圖中頁(yè)0的flash address=12處,數據為0x3003,數據地址為0x0002。
頁(yè)狀態(tài)標志
在第一個(gè)數據存儲區,存儲頁(yè)狀態(tài)標志status,頁(yè)狀態(tài)標志有3種:
有效狀態(tài):EE_PAGE_VALID,status = 0x0000,讀取和寫(xiě)數據在此頁(yè)進(jìn)行;
數據轉移狀態(tài):EE_PAGE_TRANSFER,status = 0xCCCC,另外一頁(yè)滿(mǎn)了,正在傳輸有效數 據到本頁(yè);
擦除狀態(tài):EE_PAGE_ERASED,status = 0xFFFF。 數據寫(xiě)入 每一次寫(xiě)入數據前,都會(huì )從頁(yè)起始地址開(kāi)始尋找第一個(gè)未存儲數據的區域(值為0xFFFFFFFF),然后將待寫(xiě)入的數據和數據地址寫(xiě)到未存儲數據的區域。例如上圖中頁(yè)0的flash address = 20處,值 為0xFFFFFFFF,就是第一個(gè)未存儲數據的區域。
當知道了頁(yè)的大小后,就可以算出最大的變量存儲個(gè)數:頁(yè)容量/4-1。例如當頁(yè)大小為1K時(shí),最大 可存儲的變量數量為1024/4-1=255。需要注意的是,在實(shí)際使用中,應該盡量留出較多的空閑容 量,這樣可以減小FLASH擦除次數,提高FLASH壽命。
另外數據地址不可以超過(guò)最大能存儲的變量數量,例如當頁(yè)大小為1K時(shí),最大可存儲的變量數量為 1024/4-1=255,那么數據地址data address不可以大于255。
數據讀取
每一次讀取數據都會(huì )從頁(yè)結束地址開(kāi)始向前尋找最后一個(gè)存儲的有效數據,例如現在要讀取地址為 0x0000的數據。從上圖中看到flash address = 4和flash address = 16都是地址為0x0000的數 據,因為最后一次存儲的數據為flash address = 16處的數據,所以此時(shí)讀取地址0x0000的數據為 0x1234。
數據轉移
當一頁(yè)數據存滿(mǎn)了之后,會(huì )將數據傳輸到空閑頁(yè),將會(huì )執行以下操作(以頁(yè)0滿(mǎn),頁(yè)1空為例):
將頁(yè)1狀態(tài)標記為數據傳輸狀態(tài)(EE_PAGE_TRANSFER);
將所有有效數據復制到頁(yè)1;
擦除頁(yè)0;
將頁(yè)1狀態(tài)標記為有效狀態(tài)(EE_PAGE_VALID)。
EEPROM寫(xiě)入流程如下所示:
2.2、EERPOM物理結構
實(shí)現的EEPROM結構如下圖所示,一個(gè)頁(yè)可以由1個(gè)或者多個(gè)扇區組成,可以根據實(shí)際應 用靈活的選擇扇區數量,扇區數量越多,可以存儲的數據量就越多。通常EEPROM存儲區定義在整 個(gè)FLASH末尾,這樣程序的燒錄、執行和EEPROM區域互不影響。
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。