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