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