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