提高M(jìn)SP430G系列單片機(jī)的Flash擦寫(xiě)壽命的方法
2.2 劃分子頁(yè)方案
在Flash 中劃分出至少2 個(gè)頁(yè)(Page)用作模擬EEPROM,根據(jù)應(yīng)用需求將需寫(xiě)入EEPROM 進(jìn)行保存的變量數(shù)據(jù)劃分成一個(gè)定長(zhǎng)的數(shù)組(子頁(yè)),例如16 個(gè)字節(jié)或者32 字節(jié),將頁(yè)劃分成若干子頁(yè)后,需對(duì)Flash 中的所有子頁(yè)按照地址順序進(jìn)行逐次編號(hào)。每個(gè)子頁(yè)的第一個(gè)字節(jié)通常用來(lái)指示該子頁(yè)的狀態(tài),子頁(yè)狀態(tài)可以為:空、已寫(xiě)入或者失效。
在芯片上電初始化時(shí),首先查找出第一個(gè)尚未寫(xiě)入數(shù)據(jù)的子頁(yè),并進(jìn)行標(biāo)識(shí),在進(jìn)行寫(xiě)EEPROM操作時(shí),應(yīng)用程序需將待寫(xiě)入EEPROM 子頁(yè)的所有數(shù)據(jù)按照事先約定好的順序整理好,再一次性將所有變量數(shù)據(jù)寫(xiě)入空的子頁(yè)中,最后將模擬EEPROM 的操作指針指向下一個(gè)空閑的子頁(yè),等待下一次寫(xiě)入。待將一個(gè)頁(yè)的數(shù)據(jù)寫(xiě)滿后,再進(jìn)行一次擦除操作。需要處理好指向子頁(yè)的指針的跳轉(zhuǎn)。
每個(gè)頁(yè)存在3 種可能狀態(tài):
擦除態(tài):該頁(yè)是空的。
已寫(xiě)滿數(shù)據(jù)狀態(tài):該頁(yè)已經(jīng)寫(xiě)滿數(shù)據(jù)。
有效頁(yè)狀態(tài):該頁(yè)包含著有效數(shù)據(jù)并且該頁(yè)尚未寫(xiě)滿,仍可向子頁(yè)寫(xiě)入數(shù)據(jù)。
圖三介紹了使用子頁(yè)的方式實(shí)現(xiàn)Flash 模擬EEPROM的數(shù)據(jù)處理方法。

2.2.1 軟件描述
在軟件實(shí)現(xiàn)上,為了便于軟件處理,建議定義一些關(guān)鍵宏定義和結(jié)構(gòu)體,指定Flash 模擬EEPROM 的起始、結(jié)束地址、頁(yè)的大小、子頁(yè)的大小、每個(gè)頁(yè)的子頁(yè)數(shù)目等參數(shù),同時(shí)將需要操作的參數(shù)封裝起來(lái),便于軟件操作和管理,不建議定義許多離散的標(biāo)志變量。


在軟件操作上,F(xiàn)lash 模擬EEPROM模塊需要提供幾個(gè)API 接口給應(yīng)用程序調(diào)用。
? 通過(guò)typedef 關(guān)鍵字定義設(shè)備類型,typedef unsigned char u8;
? ChkFstPowerOnInfo()用于檢測(cè)芯片是否為第一次上電并初始化EEPROM 參數(shù)到內(nèi)存,原型如下。
Void ChkFstPowerOnInfo(void);
? FlashWrite()用于寫(xiě)Flash,傳遞的形參包括指向待寫(xiě)入數(shù)據(jù)的指針,待寫(xiě)入數(shù)據(jù)在子頁(yè)中的起始字節(jié)編號(hào),寫(xiě)入數(shù)據(jù)的長(zhǎng)度,原型如下。
void FlashWrite( u8 *array, u8 startNum, u8 length );
? FlashErase()用于擦除Flash,傳遞的形參是子頁(yè)的編號(hào),在擦除函數(shù)中需要根據(jù)子頁(yè)的編號(hào)判斷是否需要執(zhí)行頁(yè)的擦除操作,原型如下。
void FlashErase(u8 seg_sn);
2.2.2 軟件流程圖
軟件啟動(dòng)后,初始化模擬EEPROM流程圖描述如下。

調(diào)用API,向模擬EEPROM 寫(xiě)入數(shù)據(jù)的軟件流程如圖五所示。在軟件處理中,要特別注意目標(biāo)指針的切換和保證寫(xiě)入數(shù)據(jù)的正確性,在代碼空間允許的情況下,可以增加一些校驗(yàn)算法來(lái)保證。
pos機(jī)相關(guān)文章:pos機(jī)原理
評(píng)論