博客專欄

EEPW首頁(yè) > 博客 > 如何使用Flash模擬EEPROM

如何使用Flash模擬EEPROM

發(fā)布人:美男子玩編程 時(shí)間:2024-01-17 來(lái)源:工程師 發(fā)布文章

在講解這篇博文前,首先要明白為什么使用Flash存儲(chǔ)來(lái)模擬EEPROM?

主要有以下幾個(gè)原因:

  • 成本效益:許多微控制器(MCU)和系統(tǒng)芯片(SoC)內(nèi)置有Flash存儲(chǔ),但沒(méi)有專門(mén)的EEPROM。使用已有的Flash存儲(chǔ)模擬EEPROM可以減少額外硬件成本。

  • 更大的存儲(chǔ)容量:通常,F(xiàn)lash存儲(chǔ)提供比EEPROM更大的存儲(chǔ)容量。這使得在沒(méi)有犧牲太多物理空間的情況下可以存儲(chǔ)更多數(shù)據(jù)。

  • 靈活性和可擴(kuò)展性:通過(guò)軟件,可以靈活地設(shè)計(jì)和調(diào)整EEPROM模擬的大小和結(jié)構(gòu),以適應(yīng)不同的應(yīng)用需求。這種方法比使用固定大小的物理EEPROM更具可擴(kuò)展性。

  • 數(shù)據(jù)持久性:盡管Flash存儲(chǔ)的寫(xiě)入次數(shù)有限,但它仍然能夠提供足夠的耐用性來(lái)滿足大多數(shù)應(yīng)用的需要。通過(guò)適當(dāng)?shù)臄?shù)據(jù)管理,可以最大限度地延長(zhǎng)Flash存儲(chǔ)的壽命。

  • 數(shù)據(jù)保護(hù)和安全性:許多現(xiàn)代微控制器提供了Flash存儲(chǔ)的安全功能,如寫(xiě)入保護(hù)、加密等,這有助于保護(hù)存儲(chǔ)在Flash中的數(shù)據(jù)不被未經(jīng)授權(quán)訪問(wèn)。

  • 易于編程和集成:使用Flash存儲(chǔ)來(lái)模擬EEPROM可以充分利用現(xiàn)有的Flash編程工具和技術(shù),同時(shí)也簡(jiǎn)化了硬件設(shè)計(jì)。

在使用Arduino開(kāi)發(fā)時(shí),有個(gè)內(nèi)置庫(kù)可以使用Flash模擬EEPROM,極大方便了嵌入式數(shù)據(jù)存儲(chǔ)的開(kāi)發(fā)。

如果使用庫(kù)函數(shù),只是知道調(diào)用API,很難理解Flash模擬EEPROM的原理和方法,本篇博文將以AT32F413(flash:256KB)這款MCU為例,詳細(xì)介紹如何使用Flash模擬EEPROM。

實(shí)現(xiàn)代碼:https://download.csdn.net/download/m0_38106923/88717668

1

FLASH與EEPROM簡(jiǎn)介

FLASH和EEPROM都為非易失性存儲(chǔ)器,在斷電后數(shù)據(jù)仍然可以長(zhǎng)期保存,這為FLASH模擬 EEPROM提供了條件,F(xiàn)LASH與EEPROM特點(diǎn)對(duì)比如下表所示:

圖片


FLASH模擬EEPROM優(yōu)點(diǎn):  

  • 低成本:可節(jié)約一顆EEPROM芯片;  

  • 存儲(chǔ)、讀取速度快:通訊速度快于使用I2C或者SPI通訊的EEPROM元件;  

  • 抗干擾能力強(qiáng):由于FLASH在單片機(jī)內(nèi)部,不會(huì)存在通訊總線被外部干擾的問(wèn)題;  

  • 容量可調(diào):可根據(jù)實(shí)際使用,靈活調(diào)整存儲(chǔ)空間大小。

2

FLASH模擬EEPROM原理

2.1、EERPOM數(shù)據(jù)結(jié)構(gòu)

由于FLASH在寫(xiě)入數(shù)據(jù)前,需要將FLASH數(shù)據(jù)先擦除為0xFF,而FLASH擦除時(shí)通常為扇區(qū)擦除,例如AT32F403A的扇區(qū)大小為2K字節(jié),這個(gè)特性決定了不能簡(jiǎn)單將舊數(shù)據(jù)擦除然后寫(xiě)新數(shù) 據(jù),因?yàn)檫@樣會(huì)導(dǎo)致存儲(chǔ)在這個(gè)扇區(qū)內(nèi)的其他數(shù)據(jù)也被擦除,并且也會(huì)導(dǎo)致FLASH頻繁擦除而降低 其使用壽命。  

所以FLASH模擬EEPROM的思路是:

  • 新數(shù)據(jù)存儲(chǔ)不影響舊數(shù)據(jù); 

  • 盡量減少FLASH擦除次數(shù),延長(zhǎng)FLASH使用壽命。  

基于以上的考慮,我們?cè)O(shè)計(jì)了以下存儲(chǔ)結(jié)構(gòu):


圖片


EERPOM結(jié)構(gòu)

EEPROM由兩個(gè)頁(yè)組成:頁(yè)0和頁(yè)1,在使用的時(shí)候,1個(gè)頁(yè)處于有效狀態(tài),另外一個(gè)頁(yè)處于擦除 狀態(tài),讀取或者寫(xiě)入數(shù)據(jù)都在有效狀態(tài)的頁(yè)進(jìn)行。  

數(shù)據(jù)格式  

存儲(chǔ)的數(shù)據(jù)格式為數(shù)據(jù) + 數(shù)據(jù)地址,地址和數(shù)據(jù)都是16位方式存儲(chǔ),每一次存儲(chǔ)占用32位也就是 4個(gè)字節(jié)。圖中data列為數(shù)據(jù),data address列為數(shù)據(jù)地址,flash address列為數(shù)據(jù)存儲(chǔ)的實(shí)際 flash地址偏移量。例如上圖中頁(yè)0的flash address=12處,數(shù)據(jù)為0x3003,數(shù)據(jù)地址為0x0002。  

頁(yè)狀態(tài)標(biāo)志  

在第一個(gè)數(shù)據(jù)存儲(chǔ)區(qū),存儲(chǔ)頁(yè)狀態(tài)標(biāo)志status,頁(yè)狀態(tài)標(biāo)志有3種:  

  • 有效狀態(tài):EE_PAGE_VALID,status = 0x0000,讀取和寫(xiě)數(shù)據(jù)在此頁(yè)進(jìn)行;  

  • 數(shù)據(jù)轉(zhuǎn)移狀態(tài):EE_PAGE_TRANSFER,status = 0xCCCC,另外一頁(yè)滿了,正在傳輸有效數(shù) 據(jù)到本頁(yè);  

  • 擦除狀態(tài):EE_PAGE_ERASED,status = 0xFFFF。  數(shù)據(jù)寫(xiě)入  每一次寫(xiě)入數(shù)據(jù)前,都會(huì)從頁(yè)起始地址開(kāi)始尋找第一個(gè)未存儲(chǔ)數(shù)據(jù)的區(qū)域(值為0xFFFFFFFF),然后將待寫(xiě)入的數(shù)據(jù)和數(shù)據(jù)地址寫(xiě)到未存儲(chǔ)數(shù)據(jù)的區(qū)域。例如上圖中頁(yè)0的flash address = 20處,值 為0xFFFFFFFF,就是第一個(gè)未存儲(chǔ)數(shù)據(jù)的區(qū)域。  

當(dāng)知道了頁(yè)的大小后,就可以算出最大的變量存儲(chǔ)個(gè)數(shù):頁(yè)容量/4-1。例如當(dāng)頁(yè)大小為1K時(shí),最大 可存儲(chǔ)的變量數(shù)量為1024/4-1=255。需要注意的是,在實(shí)際使用中,應(yīng)該盡量留出較多的空閑容 量,這樣可以減小FLASH擦除次數(shù),提高FLASH壽命。 

另外數(shù)據(jù)地址不可以超過(guò)最大能存儲(chǔ)的變量數(shù)量,例如當(dāng)頁(yè)大小為1K時(shí),最大可存儲(chǔ)的變量數(shù)量為 1024/4-1=255,那么數(shù)據(jù)地址data address不可以大于255。

數(shù)據(jù)讀取  

每一次讀取數(shù)據(jù)都會(huì)從頁(yè)結(jié)束地址開(kāi)始向前尋找最后一個(gè)存儲(chǔ)的有效數(shù)據(jù),例如現(xiàn)在要讀取地址為 0x0000的數(shù)據(jù)。從上圖中看到flash address = 4和flash address = 16都是地址為0x0000的數(shù) 據(jù),因?yàn)樽詈笠淮未鎯?chǔ)的數(shù)據(jù)為flash address = 16處的數(shù)據(jù),所以此時(shí)讀取地址0x0000的數(shù)據(jù)為 0x1234。  

數(shù)據(jù)轉(zhuǎn)移  

當(dāng)一頁(yè)數(shù)據(jù)存滿了之后,會(huì)將數(shù)據(jù)傳輸?shù)娇臻e頁(yè),將會(huì)執(zhí)行以下操作(以頁(yè)0滿,頁(yè)1空為例):  

  • 將頁(yè)1狀態(tài)標(biāo)記為數(shù)據(jù)傳輸狀態(tài)(EE_PAGE_TRANSFER);  

  • 將所有有效數(shù)據(jù)復(fù)制到頁(yè)1;  

  • 擦除頁(yè)0;  

  • 將頁(yè)1狀態(tài)標(biāo)記為有效狀態(tài)(EE_PAGE_VALID)。

EEPROM寫(xiě)入流程如下所示:


圖片


2.2、EERPOM物理結(jié)構(gòu)

實(shí)現(xiàn)的EEPROM結(jié)構(gòu)如下圖所示,一個(gè)頁(yè)可以由1個(gè)或者多個(gè)扇區(qū)組成,可以根據(jù)實(shí)際應(yīng) 用靈活的選擇扇區(qū)數(shù)量,扇區(qū)數(shù)量越多,可以存儲(chǔ)的數(shù)據(jù)量就越多。通常EEPROM存儲(chǔ)區(qū)定義在整 個(gè)FLASH末尾,這樣程序的燒錄、執(zhí)行和EEPROM區(qū)域互不影響。


圖片



*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞: Flash EEPROM

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉