在嵌入式設計中,許多應用設計都需要使用EEPROM 存儲非易失性數據,由于成本原因,某些單片機在芯片內部并沒有集成EEPROM。MSP430G 系列處理器是TI 推出的低成本16 位處理器,在MSP430G 系列單片機中并不具備EEPROM。為了存儲非易失性數據,MSP430G 系列處理器在芯片內部劃分出了256 字節的Flash 空間作為信息Flash,可用于存儲非易失性數據,但是由于Flash 與EEPROM 在擦寫壽命上存在一定差距,所以在實際應用中,這種應用方式并不能夠滿足所有客戶的需求。本應用筆記介紹了使用代碼區域Flash 來模擬EEPROM,通過一定的軟件處理算法,可以大大增加數據存儲周期的一種方法。本文給出了實現上述功能的軟件流程。
1. 嵌入式Flash 存儲介質與EEPROM 的主要特性對比
電可擦除和編程只讀存儲器(EEPROM)是在絕大多數嵌入式應用中都會使用到的用于保存非易失性數據的關鍵器件,用于在程序運行期間保存數據。Flash 閃存(Flash Memory,簡稱為“Flash”)是一種非易失性( Non-Volatile )存儲器,廣泛應用于各種嵌入式處理器中,用于存儲程序代碼。
由于硬件成本原因,在許多嵌入式處理器中并沒有集成EEPROM 模塊,通常我們可以采用在片內Flash 存儲器中保存非易失性數據的應用方式來達到使用要求。對一些普通的應用場合,這種使用方式可以滿足要求。
表一 EEPROM與Flash 對比分析
1.1 寫訪問時間
由于EEPROM 和Flash 的工作特性不同,所以寫訪問時間也不相同。Flash 具有更短的寫訪問時間,所以更適用于對存儲速度有要求的場合。
1.2 寫方法
外置EEPROM和采用Flash 模擬EEPROM的最大不同之處在于寫的方法。
EEPROM:對EEPROM 的寫操作不需要額外的操作,只需要提供電源供給;但是一旦啟動寫操作流程后,寫操作不能夠被打斷。所以需要外接電容器等措施來保證在芯片掉電時能夠維持供電,保證完成數據操作。
Flash 模擬EEPROM:當芯片上電后,寫操作可以被電源掉電和芯片復位打斷。和EEPROM 相比,需要應用設計者增加相關的處理來應對可能存在的異常。
1.3 擦寫時間
EEPROM和采用Flash 模擬EEPROM在擦除時間上存在很大的差異。
與Flash 不同,EEPROM 在進行寫操作之前不要擦除操作。由于Flash 需要幾個毫秒時間進行擦除操作,所以如果在進行擦除操作的過程中出現電源掉電的情況,需要軟件做相關的保護處理。為了設計一個健壯的Flash 存儲器的管理軟件,需要深入的了解和掌握Flash 存儲器的擦除過程特性。
2. 增加Flash 模擬EEPROM 擦寫壽命的方法
可以根據用戶的需求采用不同的方法實現Flash 存儲器模擬EEPROM。
2.1 虛擬地址加數據方案
通常需要兩個頁以上的Flash 空間來模擬EEPROM。上電后,初始化代碼先查找出有效頁,同時將另外一個頁初始化為擦除狀況,以提供字節寫的能力,并用作備份和隨時準備執行寫入操作。需要存儲EEPROM 的變量數據首先寫入有效頁,當有效頁寫滿后,需將所有數據的最后狀態保存到備份頁,并切換到備份頁進行操作。每一頁的第一個字節通常用來指示該頁的狀態。
每個頁存在3 種可能狀態:
擦除態:該頁是空的。
已寫滿數據狀態:該頁已經寫滿數據,準備切換到下一個頁進行操作。
有效頁狀態:該頁包含著有效數據并且標示狀態尚未改變,所有的有效數據全部拷貝到了已經擦除的頁。
下圖以采用兩個頁模擬EEPROM的方式為例,描述了頁狀態字的在頁0 和頁1 之間的切換過程。
采用這種方式,用戶不知道數據刷新的頻率。
下面的圖例以采用兩個頁模擬EEPROM 的應用方式為例進行描述。為了方便獲取模擬EEPROM數據和更新數據內容,每個存儲變量元素都在Flash 里定義了一個操作單元,在該操作單元中對每個存
儲變量元素都分配一個虛擬操作地址,即一個EEPROM 操作單元包含一個虛擬地址單元和一個數據單元。當需要修改數據單元內容時,新的數據內容和之前分配的虛擬地址一同寫入一個新的模擬EEPROM存儲器單元中,同時返回最新修改的數據內容。EEPROM存儲單元格式描述如圖二。
使用虛擬地址加數據的方案總結如下。
? 為每一個目標存儲變量分配一個虛擬地址,該虛擬地址需一同存入Flash 中。當讀取存儲變量內容時,需根據該變量的虛擬地址搜索虛擬EEPROM并返回最后更新的內容。
? 在軟件處理上,需要記錄下一次寫入的物理目的地址;在每一次執行寫入操作后,根據EEPROM存儲單元大小(操作粒度),將目的操作指針自動累加。
? 當一個頁(Page)寫滿后,需要將所有變量的EEPROM數據拷貝到下一個頁,再執行該頁的擦除操作。
? 在嵌入式軟件處理上需加入合適的校驗機制,保證寫入數據的正確性并監Flash 是否已經失效。
2.2 劃分子頁方案
在Flash 中劃分出至少2 個頁(Page)用作模擬EEPROM,根據應用需求將需寫入EEPROM 進行保存的變量數據劃分成一個定長的數組(子頁),例如16 個字節或者32 字節,將頁劃分成若干子頁后,需對Flash 中的所有子頁按照地址順序進行逐次編號。每個子頁的第一個字節通常用來指示該子頁的狀態,子頁狀態可以為:空、已寫入或者失效。
在芯片上電初始化時,首先查找出第一個尚未寫入數據的子頁,并進行標識,在進行寫EEPROM操作時,應用程序需將待寫入EEPROM 子頁的所有數據按照事先約定好的順序整理好,再一次性將所有變量數據寫入空的子頁中,最后將模擬EEPROM 的操作指針指向下一個空閑的子頁,等待下一次寫入。待將一個頁的數據寫滿后,再進行一次擦除操作。需要處理好指向子頁的指針的跳轉。
每個頁存在3 種可能狀態:
擦除態:該頁是空的。
已寫滿數據狀態:該頁已經寫滿數據。
有效頁狀態:該頁包含著有效數據并且該頁尚未寫滿,仍可向子頁寫入數據。
圖三介紹了使用子頁的方式實現Flash 模擬EEPROM的數據處理方法。
2.2.1 軟件描述
在軟件實現上,為了便于軟件處理,建議定義一些關鍵宏定義和結構體,指定Flash 模擬EEPROM 的起始、結束地址、頁的大小、子頁的大小、每個頁的子頁數目等參數,同時將需要操作的參數封裝起來,便于軟件操作和管理,不建議定義許多離散的標志變量。
在軟件操作上,Flash 模擬EEPROM模塊需要提供幾個API 接口給應用程序調用。
? 通過typedef 關鍵字定義設備類型,typedef unsigned char u8;
? ChkFstPowerOnInfo()用于檢測芯片是否為第一次上電并初始化EEPROM 參數到內存,原型如下。
Void ChkFstPowerOnInfo(void);
? FlashWrite()用于寫Flash,傳遞的形參包括指向待寫入數據的指針,待寫入數據在子頁中的起始字節編號,寫入數據的長度,原型如下。
void FlashWrite( u8 *array, u8 startNum, u8 length );
? FlashErase()用于擦除Flash,傳遞的形參是子頁的編號,在擦除函數中需要根據子頁的編號判斷是否需要執行頁的擦除操作,原型如下。
void FlashErase(u8 seg_sn);
2.2.2 軟件流程圖
軟件啟動后,初始化模擬EEPROM流程圖描述如下。
調用API,向模擬EEPROM 寫入數據的軟件流程如圖五所示。在軟件處理中,要特別注意目標指針的切換和保證寫入數據的正確性,在代碼空間允許的情況下,可以增加一些校驗算法來保證。
采用劃分子頁的方案總結如下。
? 每次寫入模擬EEPROM的數據長度為定長,即為子頁的長度。
? 軟件需要定義一個存儲變量結構體,用于刷新和同步模擬EEPROM內容。在將數據寫入模擬EEPROM之前,程序員需要按照約定的數據格式,在內存中將所有的目標存儲變量進行整理。
? 在軟件處理上,需要計算當前寫入和下一次寫入的物理地址;在每一次執行寫入操作后,根據子頁長度大小,將指向子頁的目的操作指針自動累加。
? 待一個頁(Page)寫滿后,需要將最后更新的模擬EEPROM數據拷貝到下一個頁,再對寫滿頁執行一次擦除操作。
? 在嵌入式軟件處理上需加入合適的校驗機制,保證寫入數據的正確性并監測用于模擬EEPROM功能的Flash 子頁是否已經失效。
2.3 兩種方案的對比分析
兩種方案的對比分析見表二。
表二 兩種方案的對比分析
3. 實際的嵌入式應用
根據軟件需要,建議采用字節(8bit)做為操作的最小粒度,適用性會更廣泛。
3.1 Flash 存儲器擦寫壽命的提升
對于MSP430G 系列的Flash 存儲器,可以保證至少10000 次的編程和擦除壽命。如圖六所示。
圖六 MSP430G 系列單片機Flash 編程和擦除壽命
采用劃分小頁結合至少分配2 個大頁的操作方式,則可以大大增加Flash 模擬EEPROM 的擦寫壽命。例如,對于MSP430G 系列單片機,如果將每個小頁的尺寸劃分為16 字節,采用2 個大頁(每頁512 字節)作為模擬EEPROM 使用,則可以提供64 個操作子頁((512/16)x2=64),可以保證至少640000 次的擦寫壽命。
3.2 掉電時的異常處理
如果正在進行Flash 數據存儲時發生掉電,數據可能會保存不成功,存在異常。為了增強健壯性,在軟件處理上,需要考慮設備異常掉電等可能會導致Flash 擦寫失敗的情況。
在軟件處理中,當成功保存Flash 數據后,再寫入該子頁的狀態標志。單片機上電后,用戶程序將查找最后一次寫入的子頁,再將該子頁的數據內容并恢復到內存中的數據結構中。
4. 系統可靠性設計
4.1 時鐘源的選擇
由于驅動Flash 的時鐘源(ACLK、MCLK、SMCLK)和時鐘頻率可以設定,為了保證在將數據寫入模擬EEPROM時的可靠性,建議在將Flash 的時鐘頻率降低后,再對其進行操作。例如將Flash 的時鐘頻率降低到1MHz 后,進行寫入操作。需要注意,在降低了時鐘頻率后,若此時鐘源也是定時器(Timer)的時鐘源,則可能會影響到定時器的定時準確性,需要軟件上做好處理。
4.2 代碼在RAM中運行
由于向Flash 寫入數據操作是通過執行Flash 中程序代碼,對Flash 進行擦除和編程操作。由于對Flash 的編程需要mcu 內部執行一個升壓操作,所以如果有足夠的內存空間,建議將編程、擦除等關鍵代碼拷貝到RAM中運行,可以使用關鍵字__ramfunc 指定,如下圖七所示。
圖七 使用關鍵字__ramfunc 將程序指定到Ram 中運行
5. 總結
本文從軟件方面,以及安全性方面探討了使用MSP430G 系列單片機在使用Flash 模擬EEPROM方面的應用,提供了兩種不同的方式供選擇。兩種方式都可以大幅度提高模擬EEPROM的編寫、擦除壽命,并且滿足高可靠性的應用設計,用戶可以結合具體的應用進行選擇。
評論
查看更多