實(shí)例分析MCU的Data Flash訪問(wèn)控制
筆者在家用火災(zāi)報(bào)警系統(tǒng)項(xiàng)目的開(kāi)發(fā)過(guò)程中,在進(jìn)行主從機(jī)通訊和從機(jī)自身任務(wù)處理時(shí),需要經(jīng)常與從機(jī)MCU進(jìn)行運(yùn)行數(shù)據(jù)的存取。過(guò)去傳統(tǒng)的方法是在MCU上外掛EEPROM或?qū)CU內(nèi)部的部分存儲(chǔ)單元專門劃分出來(lái),以存取運(yùn)行數(shù)據(jù)。這兩種方法的不利之處是:外掛EEPROM需要增加MCU與EEPROM的讀寫(xiě)接口,增加了MCU的管腳負(fù)擔(dān),減慢了數(shù)據(jù)的讀寫(xiě)速度的同時(shí)還增加了功耗;專門為運(yùn)行數(shù)據(jù)劃分存儲(chǔ)單元?jiǎng)t減少了程序代碼的存儲(chǔ)空間,同時(shí)存儲(chǔ)空間的讀寫(xiě)、擦除等操作會(huì)比較麻煩,另外還要非常小心,以防擦掉了有用的程序代碼。
瑞薩RL78系列MCU內(nèi)嵌2KB的DATA FLASH,省去了用戶單獨(dú)外擴(kuò)數(shù)據(jù)FLASH的麻煩。RL78系列MCU還支持BGO操作,程序指令在DATA FLASH讀寫(xiě)時(shí)仍可正常執(zhí)行。其對(duì)DATA FLASH存儲(chǔ)單元的寫(xiě)操作壽命高達(dá)1百萬(wàn)次以上,非常適合于需要頻繁存取數(shù)據(jù)的應(yīng)用場(chǎng)合。
與有些半導(dǎo)體廠商的控制芯片不同,瑞薩并沒(méi)有直接將DATA FLASH的讀寫(xiě)操作完全開(kāi)放給用戶,而是提供了一套叫做PFDL(Pico Data Flash Library,即微型數(shù)據(jù)閃存訪問(wèn)庫(kù))的軟件接口,來(lái)實(shí)現(xiàn)對(duì)閃存系統(tǒng)的操作。用戶使用時(shí)只需要調(diào)用相應(yīng)的庫(kù)函數(shù)即可進(jìn)行DATA FLASH的讀寫(xiě)、校驗(yàn)、擦除等操作,而不必關(guān)心底層驅(qū)動(dòng)函數(shù)的具體實(shí)現(xiàn)方式。這在很大程度上方便了用戶程序的設(shè)計(jì),縮短了開(kāi)發(fā)周期。
1)DATA FLASH結(jié)構(gòu)和PFDL
RL78的存儲(chǔ)結(jié)如圖1所示。其中Data Flash memory物理地址為F1000H-F17FFH,被分成了兩個(gè)BLOCK區(qū),每個(gè)BLOCK區(qū)1KB,共2KB。
圖1:瑞薩RL78系列MCU的存儲(chǔ)結(jié)構(gòu)
PFDL由表1所示的庫(kù)文件組成。
表1:PFDL庫(kù)文件
2)Data Flash的存儲(chǔ)結(jié)構(gòu)和使用方法
首先有必要將RL78系列MCU關(guān)于DATA FLASH操作的幾個(gè)問(wèn)題進(jìn)行說(shuō)明。RL78系列DATA FLASH的擦除操作只能以BLOCK為單位,不支持單字或單字節(jié)擦除。所以當(dāng)有一項(xiàng)長(zhǎng)度為若干字節(jié)的數(shù)據(jù)要寫(xiě)入DATA FLASH時(shí),不可能將數(shù)據(jù)每次都寫(xiě)入固定的物理地址所對(duì)應(yīng)的存儲(chǔ)單元中,而是必須在新的空存儲(chǔ)單元中寫(xiě)入。這就意味著用戶在設(shè)計(jì)DATA FLASH的存儲(chǔ)結(jié)構(gòu)時(shí),必須有尋址功能。
RL78系列DATA FLASH同一時(shí)刻只能有1個(gè)BLOCK處于激活狀態(tài),是有效的,此時(shí)另一個(gè)BLOCK不可訪問(wèn),是無(wú)效的。習(xí)慣上,我們常將DATA FLASH的一個(gè)BLOCK稱為一頁(yè),當(dāng)一個(gè)有效頁(yè)被寫(xiě)滿數(shù)據(jù)時(shí),要想繼續(xù)寫(xiě)入數(shù)據(jù)的話,則只能在下一頁(yè)中寫(xiě)入,同時(shí)還需要將前一頁(yè)中有用的其他數(shù)據(jù)項(xiàng)拷貝到下一頁(yè)中,并將下一頁(yè)標(biāo)記為當(dāng)前的有效頁(yè),將上一頁(yè)標(biāo)記為無(wú)效頁(yè),即必須有DATA FLASH的頁(yè)標(biāo)記和導(dǎo)頁(yè)機(jī)制。
為此,筆者將整個(gè)DATA FLASH分成兩頁(yè)(每個(gè)BLOCK自然形成一頁(yè),兩頁(yè)交替使用),每頁(yè)的起始地址作為頁(yè)標(biāo)記單元,見(jiàn)表2。每次進(jìn)行DATA FLASH操作前應(yīng)先讀取該標(biāo)記單元來(lái)確認(rèn)當(dāng)前有效頁(yè)。
表2:頁(yè)標(biāo)記





