在應(yīng)用編程MAXQ微控制器中可分區(qū)擦除的程序和數(shù)
引言
本應(yīng)用筆記介紹了如何管理MAXQ微控制器中、可分區(qū)擦除的內(nèi)部數(shù)據(jù)和程序閃存。一般性地介紹了怎樣構(gòu)建一個引導(dǎo)裝載應(yīng)用,實現(xiàn)程序閃存的在應(yīng)用編程。注意:本文不適于那些使用頁擦除閃存的MAXQ微控制器,即那些只允許少量閃存被擦除的微控制器。各MAXQ數(shù)據(jù)手冊都會說明其所采用的閃存類型。閃存簡介
存儲器配置本應(yīng)用筆記給出了多種不同尺寸的閃存配置,并不完全和某一特定MAXQ器件相符。這些配置僅用于本文中的實例。各MAXQ器件的數(shù)據(jù)手冊會列出該器件的存儲器配置。
引導(dǎo)、程序和數(shù)據(jù)區(qū)在操作上并沒有區(qū)別。如果引導(dǎo)裝載程序需要的空間超過了第一閃存區(qū)的范圍,那么可將程序擴(kuò)展到下一分區(qū)中。然而,在下面的實例中,標(biāo)號會有所不同。
表1. 閃存配置實例
數(shù)據(jù)閃存
數(shù)據(jù)閃存可以被用來可靠地存儲一些系統(tǒng)工作期間需要一次性或周期性保存的系統(tǒng)數(shù)據(jù)。數(shù)據(jù)閃存的容量因特定的MAXQ器件而異,通常在128至2k字之間。
數(shù)據(jù)閃存的使用有一些限制。與EEPROM不同,數(shù)據(jù)閃存不能按字擦除;每次必須擦除一個完整的分區(qū)。擦除一個分區(qū)通常需要0.7秒的時間,最壞情況下可能會長達(dá)15秒。在這期間,用戶代碼停止運(yùn)行,不能進(jìn)行其他操作。因此,在根據(jù)系統(tǒng)需求選擇軟件技術(shù)時,必須要仔細(xì)考慮這些限制。對于絕大多數(shù)周期性數(shù)據(jù)存儲,采用有界隊列和/或分區(qū)切換技術(shù),即可滿足系統(tǒng)可靠性的要求。下面給出分區(qū)交換和有界隊列技術(shù)的簡單實例。
有界隊列
有界隊列是一個包含固定數(shù)量元素的隊列。該方法常用于處理周期性數(shù)據(jù)。例如,可以將一個2k字的數(shù)據(jù)閃存分成32至64個字的條目,如表2所示的存儲器配置。
初始化時,啟動程序掃描隊列,以確定隊列中下一個可用條目。隊列填滿之后只有將其擦處后方可寫入下一個條目。如果要保留全部條目,那么必須改變分區(qū)以保持所有數(shù)據(jù)。閃存擦除后,則可以寫入新的條目。這種方法的缺點是在擦寫過程中如果掉電,所有數(shù)據(jù)將會丟失。圖1示例條目載入有界隊列的流程。附錄A給出了一個簡單的C源代碼實例。
如果這種有界隊列方法還不能滿足您的系統(tǒng)要求,那么還可以采用分區(qū)交換技術(shù)。
表2. 有界隊列存儲器配置舉例
FLASHQueue[ ] | |
Queue Index | Data Flash Address |
31 | 0xF7C0-0xF7FF |
30 | 0xF780-0xF7BF |
29 | 0xF740-0xF77F |
. . . . | . . . . |
2 | 0xF080-0xF0BF |
1 | 0xF040-0xF07F |
0 | 0xF000-0xF03F |
圖1. 有界隊列流程
塊交換
塊交換能夠有效防止數(shù)據(jù)在漫長的分區(qū)擦除過程中丟失或損壞。這里所講的“塊”等同于“分區(qū)”。塊交換方式最適合于分區(qū)尺寸略大于數(shù)據(jù)總量的情況。缺點是至少需要兩個數(shù)據(jù)閃存分區(qū)。當(dāng)要寫入的數(shù)據(jù)總量遠(yuǎn)小于分區(qū)尺寸時,最好將塊交換和有界隊列兩種方法結(jié)合使用。
如果需要采用塊交換,則需要選用至少含有兩個數(shù)據(jù)閃存分區(qū)的MAXQ器件。表3給出了一個包含兩個1K x 16閃存分區(qū)的存儲器配置實例。圖2給出了塊交換寫/擦流程。
附錄A給出了一個簡單的C源代碼實例。
表3. 塊交換存儲器配置實例
Flash Sectors | |
Sector Number | Data Flash Address |
0 | 0xF000-0xF3FF |
1 | 0xE000-0xE3FF |
圖2. 塊交換流程
同時采用有界隊列和塊交換
管理數(shù)據(jù)閃存的最可靠、最靈活的辦法是同時采用有界隊列和塊交換技術(shù)。當(dāng)需要將少量的數(shù)據(jù)周期性存入閃存,并要保持?jǐn)?shù)據(jù)完整性的時候,結(jié)合使用這兩種技術(shù)將非常有利。表4給出了一個包含兩個2K x 16分區(qū),每個分區(qū)被劃分為32個相等條目的實例。圖3示例數(shù)據(jù)在兩個分區(qū)之間、有界排隊內(nèi)的流向。
這種組合方法的程序比有界隊列方法稍微復(fù)雜一些。附錄A給出了一個簡單的C源代碼實例。
表4. 塊交換和有界隊列存儲器配置實例
|
|
圖3. 有界隊列和塊交換流程
應(yīng)用ROM閃存例程
MAXQ微控制器具有片內(nèi)閃存支持程序,駐留在ROM (只讀內(nèi)存)中,用來對閃存進(jìn)行編程、擦寫和校驗。有兩種方法來調(diào)用這些例程。第一種也是最快的方法是直接訪問,只需通過以下代碼提供一個頭文件:
u16 flashEraseSector(void *);u16 flashEraseAll(void);u16 flashWrite(u16 *pAddress, u16 iData);然后,加入鏈接定義給每個例程分配合適的地址。對于IAR鏈接文件,加入下面幾行語句:
-DflashEraseSector=0x8XXX-DflashEraseAll=0x8XXX-DflashWrite=0x8XXX具體使用時,用每個例程相應(yīng)的存儲器地址替代0x8XXX。其他編譯器可能使用不同的方法添加這些聲明。
注意,直接訪問方法與未來的ROM版本無法前向兼容。
第二種為查表法。盡管這種方法兼容性較好,但是執(zhí)行時間較長。在下面每一段例程說明的后面,匯編例程采用查表法獲取ROM應(yīng)用例程的地址。表5所示為應(yīng)用ROM提供的幾個閃存例程。關(guān)于ROM應(yīng)用例程的完整列表,參見特定MAXQ器件的用戶指南。
表5. 應(yīng)用ROM閃存例程
Routine Number | Routine Name | Entry Point ROMTable = ROM[800Dh] | Entry Point Physical Address |
2 | flashEraseSector | ROM[ROMTable + 1] | 0x8XXX |
3 | flashEraseAll | ROM[ROMTable + 2] | 0x8XXX |
15 | flashWrite | ROM[ROMTable + 14] | 0x8XXX |
flashWrite
Routine | u16 flashWrite(u16 *pAddress, u16 iData) |
Summary | Programs a single word of flash memory. |
Inputs | A[0] - Word address in flash memory to which to write. A[1] - Word value to write to flash memory. |
Outputs | Carry: Set on error and cleared on success. If set, then A[0] contains one of the following error codes: 1 : failure due to software timeout 2 : failure reported by hardware (DQ5/FERR)< 相關(guān)推薦
技術(shù)專區(qū)
|
評論