ADuCM3027/ADuCM3029 Flash EEPROM仿真
簡(jiǎn)介
本文引用地址:http://m.butianyuan.cn/article/201706/360262.htm非易失性數(shù)據(jù)存儲(chǔ)器是許多嵌入式系統(tǒng)的必備元件。諸如自舉配置、校準(zhǔn)常數(shù)和網(wǎng)絡(luò)相關(guān)信息之類的數(shù)據(jù),一般存儲(chǔ)在電子可擦除可編程只讀存儲(chǔ)器(EEPROM)上。采用EEPROM存儲(chǔ)這種數(shù)據(jù)的好處是可以重寫或更新EEPROM器件上的單個(gè)字節(jié),而不會(huì)影響其他位置中的內(nèi)容。
ADuCM3027/ADuCM3029是集成閃存的超低功耗微控制器單元(MCU)。若在集成閃存上仿真EEPROM,則設(shè)計(jì)中可省去EEPROM,從而降低BOM成本。同時(shí),軟件復(fù)雜性也會(huì)降低。
背景
閃存通常由頁(yè)陣列組成。ADuCM3027中的一頁(yè)為2 kB。寫入數(shù)據(jù)之前必須擦除頁(yè)面內(nèi)容。擦除操作適用于整個(gè)頁(yè)面,而讀或?qū)懖僮骺舍槍?duì)單一可尋址位置(字節(jié)或字)執(zhí)行。
對(duì)單一可尋址位置執(zhí)行讀或?qū)懖僮饔腥缦绿魬?zhàn):
● 字節(jié)寬數(shù)據(jù)的讀和寫操作。
● 應(yīng)能擦除或更新任意位置的數(shù)據(jù),同時(shí)其他位置的數(shù)據(jù)保持不變,因?yàn)殚W存擦除是對(duì)整頁(yè)進(jìn)行的。
本應(yīng)用筆記說(shuō)明利用ADuCM3027/ADuCM3029器件和內(nèi)置閃存仿真EEPROM的軟件,如圖1所示。
Figure 1. ADuCM3027/ADuCM3029 Internal Flash and EEPROM System Overview
圖1.ADuCM3027/ADuCM3029內(nèi)置閃存和EEPROM系統(tǒng)概覽
圖2.ADuCM3027/ADuCM3029 Flash EEPROM仿真軟件結(jié)構(gòu)
工作原理
EEPROM仿真需要閃存的一個(gè)專用部分。多數(shù)EEPROM可以在一個(gè)寫命令中更新一個(gè)字節(jié)。然而,只要在兩次寫操作之間執(zhí)行擦除序列,閃存器件便能寫入多個(gè)字節(jié)并相應(yīng)地更新數(shù)據(jù)。為了在閃存中仿真可讀寫字節(jié)的EEPROM,必須執(zhí)行讀取、更改、寫入序列,這與EEPROM操作相似。
本部分介紹的程序使用兩個(gè)閃存頁(yè)面(可擴(kuò)展到兩個(gè)以上的頁(yè)面),然后將其劃分為多個(gè)扇區(qū)并用標(biāo)簽加以識(shí)別。這種扇區(qū)標(biāo)簽提供關(guān)于當(dāng)前正在處理的扇區(qū)的信息,以及寫入該扇區(qū)的數(shù)據(jù)字節(jié)數(shù)。注意,每個(gè)扇區(qū)的最后一個(gè)位置保留用于扇區(qū)標(biāo)簽,其大小與閃存數(shù)據(jù)總線的大小相同。扇區(qū)大小和一個(gè)閃存頁(yè)面中的扇區(qū)數(shù)取決于仿真的EEPROM大小。
EEPROM
EEPROM寫入和讀取函數(shù)涉及到應(yīng)用程序代碼輸入的處理,如EEPROM數(shù)據(jù)和地址信息等。EEPROM應(yīng)用程序編程接口(API)負(fù)責(zé)根據(jù)閃存接口的要求處理和提供數(shù)據(jù)與地址信息。
寫入EEPROM
圖3顯示了EEPROM寫操作流程圖。EEPROM寫操作的步驟如下:
1. 利用find_current_sector()函數(shù)調(diào)用找到當(dāng)前扇區(qū)。此搜索基于扇區(qū)標(biāo)簽和對(duì)應(yīng)的扇區(qū)標(biāo)簽值;返回值為當(dāng)前扇區(qū)起始地址(其為閃存中的一個(gè)物理位置)。
2. 借助當(dāng)前扇區(qū)起始地址將EEPROM地址轉(zhuǎn)換為閃存地址。由于ADuCM3027/ADuCM3029閃存具有64位寬數(shù)據(jù)總線,仿真EEPROM具有8位數(shù)據(jù)總線,所以軟件利用EEPROM地址確定所需的移位次數(shù)。
3. 在所獲得的閃存地址處讀取數(shù)據(jù);如果此數(shù)據(jù)等于0xFF,則屏蔽這些位以創(chuàng)建最低有效位(LSB)和最高有效位(MSB) 32位數(shù)據(jù)包,并對(duì)EEPROM數(shù)據(jù)執(zhí)行左移位操作以形成待寫入閃存的64位寬數(shù)據(jù)集。
4. 調(diào)用write_flash()函數(shù),對(duì)閃存控制器執(zhí)行寫命令。此函數(shù)的輸入?yún)?shù)為閃存地址及LSB和MSB數(shù)據(jù)包。
5. 對(duì)閃存成功執(zhí)行寫操作之后,調(diào)用update_tag()函數(shù)以更新當(dāng)前扇區(qū)的扇區(qū)標(biāo)簽。
如果所獲得的閃存地址中已存在數(shù)據(jù),則數(shù)據(jù)讀取函數(shù)不返回0xFF。這種情況下,通過(guò)調(diào)用move2nextsector()函數(shù)將所獲得閃存地址之前或之后的數(shù)據(jù)移入下一或相鄰扇區(qū)。將已轉(zhuǎn)換為L(zhǎng)SB和MSB數(shù)據(jù)包的EEPROM數(shù)據(jù)寫入下一扇區(qū)上的新閃存地址。這樣,每次對(duì)EEPROM的一個(gè)已寫位置執(zhí)行寫操作時(shí),該數(shù)據(jù)就被移動(dòng)到下一扇區(qū),其位置中包含修改后的數(shù)據(jù)。
如果新扇區(qū)位于下一頁(yè),則調(diào)用erase_flash(page_number)函數(shù)執(zhí)行閃存頁(yè)面擦除命令,在數(shù)據(jù)移動(dòng)之后擦除前一頁(yè)。所有地址寄存器均通過(guò)move2nextpage()函數(shù)更新。
關(guān)于write_eeprom(uint16_t addr_eeprom, uint8_t data_eeprom)函數(shù)的詳細(xì)信息,請(qǐng)參閱表1。
讀取EEPROM
圖4顯示了EEPROM讀操作流程圖。EEPROM讀操作的步驟如下:
1. 調(diào)用read_eerprom(addr)函數(shù)以讀取地址位置處存儲(chǔ)的EEPROM值。
2. 在應(yīng)用程序代碼發(fā)出的EEPROM讀請(qǐng)求中,軟件首先確定當(dāng)前扇區(qū),其中包含最新數(shù)據(jù)。利用EEPROM地址和當(dāng)前扇區(qū)起始地址獲得閃存地址。
3. 利用所獲得的閃存地址調(diào)用read_flash()函數(shù)以執(zhí)行讀命令。
4. 處理從閃存地址接收到的64位寬數(shù)據(jù);然后屏蔽、右移此地址的各位,并將其提供給應(yīng)用程序代碼。
關(guān)于read_eeprom(uint16_t addr_eeprom)函數(shù)的詳細(xì)信息,請(qǐng)參閱表2。
圖3.EEPROM寫操作
圖4.EEPROM讀操作
擦除EEPROM
圖5顯示了EEPROM擦除操作流程圖。EEPROM擦除操作的步驟如下:
1. 調(diào)用erase_eeprom()函數(shù)以擦除閃存中分配的整個(gè)EEPROM空間。
圖5.EEPROM擦除操作
閃存中專門用于EEPROM仿真的所有頁(yè)面均被擦除。因此,在應(yīng)用程序代碼中使用此操作時(shí)務(wù)必小心。
關(guān)于erase_eeprom()函數(shù)的詳細(xì)信息,請(qǐng)參閱表3。
閃存
ADuCM3027/ADuCM3029處理器包含128 kB和256 kB嵌入式閃存,可通過(guò)閃存控制器加以訪問(wèn)。嵌入式閃存具有72位寬數(shù)據(jù)總線,每次訪問(wèn)提供兩個(gè)32位字的數(shù)據(jù)和一個(gè)對(duì)應(yīng)的8位糾錯(cuò)碼(ECC)字節(jié)。閃存組織成頁(yè)面形式,每頁(yè)2 kB,另有256字節(jié)保留用于ECC。
閃存寫入
擦除閃存時(shí),各位置1;寫入數(shù)據(jù)(編程)時(shí),選擇性地將相關(guān)位清0。沒(méi)有寫操作能將任何位從0置1。因此,一般寫訪問(wèn)必須前置一個(gè)擦除操作。
鎖眼寫操作是一種間接寫操作,其中用戶代碼將目標(biāo)地址和數(shù)據(jù)值寫入存儲(chǔ)器映射寄存器,然后命令閃存控制器在后臺(tái)執(zhí)行寫操作。閃存控制器僅支持通過(guò)鎖眼寫操作對(duì)閃存進(jìn)行寫訪問(wèn)。對(duì)寫訪問(wèn)的這種約束使得閃存控制器能夠保證寫操作作為原子式雙字(64位)操作正確執(zhí)行。
利用EEPROM數(shù)據(jù)創(chuàng)建的LSB和MSB數(shù)據(jù)包提供給鎖眼數(shù)據(jù)寄存器。寫命令置位后,閃存控制器啟動(dòng)對(duì)給定閃存地址的64位雙字寫操作。
注意:不支持字(32位)、半字(16位)和字節(jié)(8位)寫操作。
關(guān)于write_flash(uint32_t addr, uint32_t lower_data, uint32_t upper_data)函數(shù)的詳細(xì)信息,請(qǐng)參閱表4。
閃存讀取
只有經(jīng)過(guò)原子式初始化過(guò)程之后,才能讀取閃存。讀取閃存的結(jié)果是返回64位雙字。
閃存地址信息提供給閃存控制器,后者返回讀取的數(shù)據(jù)。此數(shù)據(jù)由EEPROM接口進(jìn)一步處理以實(shí)現(xiàn)EEPROM值。
關(guān)于read_flash(uint32_t addr)函數(shù)的詳細(xì)信息,請(qǐng)參閱表6。
閃存擦除
若在寫入EEPROM期間有頁(yè)面變更,則調(diào)用erase_flash(page)函數(shù)以對(duì)前一頁(yè)執(zhí)行頁(yè)面擦除命令。擦除頁(yè)面之前會(huì)發(fā)生數(shù)據(jù)移動(dòng),如上文所述。
關(guān)于erase_flash(uint8_t PAGE)函數(shù)的詳細(xì)信息,請(qǐng)參閱表5。
限制
在實(shí)際EEPROM中,若更新一個(gè)位置,只會(huì)計(jì)數(shù)一個(gè)擦除周期,然后對(duì)該特定地址執(zhí)行寫操作,而其他位置保持不變。
在這個(gè)仿真EEPROM中,更新一個(gè)位置會(huì)引起數(shù)據(jù)從當(dāng)前扇區(qū)移動(dòng)到下一扇區(qū),這會(huì)消耗數(shù)目為EEPROM大小的寫周期。因此,每次更新一個(gè)位置時(shí),數(shù)據(jù)便移動(dòng)到下一扇區(qū);如果該扇區(qū)位于下一頁(yè),則會(huì)發(fā)生頁(yè)面擦除操作。這種行為會(huì)減少閃存的有效使用期限。
為了克服這些限制,
● 選擇用于仿真的EEPROM大小時(shí)應(yīng)小心。小EEPROM可減少數(shù)據(jù)移動(dòng)期間的寫周期數(shù),間接增加閃存的使用期限。
● 避免不必要的EEPROM寫操作。這樣可以增加閃存的有效使用期限。例如,系統(tǒng)僅在電源故障序列期間才需要執(zhí)行寫操作。正常工作期間可利用RAM緩沖器存儲(chǔ)數(shù)據(jù)。注意,軟件可處理一些對(duì)仿真EEPROM的不必要的寫操作。例如,若要寫入的數(shù)據(jù)為0xFF,且該特定位置的當(dāng)前數(shù)據(jù)為0xFF,則不對(duì)閃存執(zhí)行寫操作。
結(jié)語(yǔ)
本應(yīng)用筆記旨在利用ADuCM3027/ADuCM3029比對(duì)EEPROM和閃存的差異。仿真EEPROM與實(shí)際EEPROM相似,并且消除了與硅面積、輸入/輸出總線資源、制造成本等相關(guān)的問(wèn)題。
本應(yīng)用筆記為用戶提供了一個(gè)較大仿真EEPROM(64字節(jié)至1024字節(jié))。仿真EEPROM的大小與閃存使用期限是一對(duì)矛盾,建議用戶選擇適當(dāng)?shù)拇笮∫栽鰪?qiáng)硬件效率。除了這種方法之外,軟件也能處理一些對(duì)ADuCM3027/ADuCM3029閃存的不必要的寫操作,從而有效增加使用期限。
評(píng)論