實(shí)例分析MCU的Data Flash訪(fǎng)問(wèn)控制
筆者在家用火災報警系統項目的開(kāi)發(fā)過(guò)程中,在進(jìn)行主從機通訊和從機自身任務(wù)處理時(shí),需要經(jīng)常與從機MCU進(jìn)行運行數據的存取。過(guò)去傳統的方法是在MCU上外掛EEPROM或將MCU內部的部分存儲單元專(zhuān)門(mén)劃分出來(lái),以存取運行數據。這兩種方法的不利之處是:外掛EEPROM需要增加MCU與EEPROM的讀寫(xiě)接口,增加了MCU的管腳負擔,減慢了數據的讀寫(xiě)速度的同時(shí)還增加了功耗;專(zhuān)門(mén)為運行數據劃分存儲單元則減少了程序代碼的存儲空間,同時(shí)存儲空間的讀寫(xiě)、擦除等操作會(huì )比較麻煩,另外還要非常小心,以防擦掉了有用的程序代碼。
本文引用地址:http://dyxdggzs.com/article/201710/367740.htm瑞薩RL78系列MCU內嵌2KB的DATA FLASH,省去了用戶(hù)單獨外擴數據FLASH的麻煩。RL78系列MCU還支持BGO操作,程序指令在DATA FLASH讀寫(xiě)時(shí)仍可正常執行。其對DATA FLASH存儲單元的寫(xiě)操作壽命高達1百萬(wàn)次以上,非常適合于需要頻繁存取數據的應用場(chǎng)合。
與有些半導體廠(chǎng)商的控制芯片不同,瑞薩并沒(méi)有直接將DATA FLASH的讀寫(xiě)操作完全開(kāi)放給用戶(hù),而是提供了一套叫做PFDL(Pico Data Flash Library,即微型數據閃存訪(fǎng)問(wèn)庫)的軟件接口,來(lái)實(shí)現對閃存系統的操作。用戶(hù)使用時(shí)只需要調用相應的庫函數即可進(jìn)行DATA FLASH的讀寫(xiě)、校驗、擦除等操作,而不必關(guān)心底層驅動(dòng)函數的具體實(shí)現方式。這在很大程度上方便了用戶(hù)程序的設計,縮短了開(kāi)發(fā)周期。
1)DATA FLASH結構和PFDL
RL78的存儲結如圖1所示。其中Data Flash memory物理地址為F1000H-F17FFH,被分成了兩個(gè)BLOCK區,每個(gè)BLOCK區1KB,共2KB。
PFDL由表1所示的庫文件組成。
表1:PFDL庫文件
2)Data Flash的存儲結構和使用方法
首先有必要將RL78系列MCU關(guān)于DATA FLASH操作的幾個(gè)問(wèn)題進(jìn)行說(shuō)明。RL78系列DATA FLASH的擦除操作只能以BLOCK為單位,不支持單字或單字節擦除。所以當有一項長(cháng)度為若干字節的數據要寫(xiě)入DATA FLASH時(shí),不可能將數據每次都寫(xiě)入固定的物理地址所對應的存儲單元中,而是必須在新的空存儲單元中寫(xiě)入。這就意味著(zhù)用戶(hù)在設計DATA FLASH的存儲結構時(shí),必須有尋址功能。
RL78系列DATA FLASH同一時(shí)刻只能有1個(gè)BLOCK處于激活狀態(tài),是有效的,此時(shí)另一個(gè)BLOCK不可訪(fǎng)問(wèn),是無(wú)效的。習慣上,我們常將DATA FLASH的一個(gè)BLOCK稱(chēng)為一頁(yè),當一個(gè)有效頁(yè)被寫(xiě)滿(mǎn)數據時(shí),要想繼續寫(xiě)入數據的話(huà),則只能在下一頁(yè)中寫(xiě)入,同時(shí)還需要將前一頁(yè)中有用的其他數據項拷貝到下一頁(yè)中,并將下一頁(yè)標記為當前的有效頁(yè),將上一頁(yè)標記為無(wú)效頁(yè),即必須有DATA FLASH的頁(yè)標記和導頁(yè)機制。
為此,筆者將整個(gè)DATA FLASH分成兩頁(yè)(每個(gè)BLOCK自然形成一頁(yè),兩頁(yè)交替使用),每頁(yè)的起始地址作為頁(yè)標記單元,見(jiàn)表2。每次進(jìn)行DATA FLASH操作前應先讀取該標記單元來(lái)確認當前有效頁(yè)。
表2:頁(yè)標記
如前所述,各種數據項同時(shí)在DATA FLASH中存在時(shí),其存儲地址是不固定的,如不加以區分,將不能識別數據,所以為實(shí)現DATA FLASH的尋址功能,我們引入數據項索引的概念。在每頁(yè)DATA FLASH中,將存儲單元一分為二,上半部分用于存放數據項索引,數據項索引用于在DATA FLASH中區別各種不同的數據項,并指示其代表的數據項在DATA FLASH中存儲的相對地址。下半部分用于存放各種數據項。
為進(jìn)一步描述的方便,我們不妨舉例說(shuō)明,假設用戶(hù)有A、B、C、D四種數據項需要在DATA FLASH中存取,每種數據項的數據長(cháng)度分別為1、2、3、4字節,其定義如表3所示。
表3:數據項定義
一個(gè)典型的DATA FLASH存儲結構的例子如圖2所示。頁(yè)標記占用每頁(yè)的相對起始地址單元。相對地址0x0001~0x01FF定義為數據項索引區,每個(gè)數據項索引包含3個(gè)字節,分別是數據項索引、索引數據地址低字節、索引數據地址高字節。相對地址0x0200~0x03FF定義為數據項存儲區。
向DATA FLASH寫(xiě)入數據時(shí),先找到當前有效頁(yè),然后在當前頁(yè)中查找是否有可供寫(xiě)入數據的數據存儲空間和索引空間。查找時(shí)可采取自上而下的查找順序,先分別從每頁(yè)數據項索引區和數據項存儲區的相對起始地址開(kāi)始查找空白單元,若有滿(mǎn)足該數據項存儲要求的連續空白存儲單元,則調用寫(xiě)FLASH庫函數將數據項索引和數據項寫(xiě)入該存儲空間。
圖2:DATA FLASH存儲結構
從DATA FLASH讀取數據時(shí),先找到當前有效頁(yè),然后在當前頁(yè)中查找所要讀取的數據位于何處,即尋址。查找時(shí)應采取自下而上的查找順序(可確保每次查找到的是該種數據項的最新數據),從每頁(yè)數據項索引區的相對結束地址開(kāi)始查找數據項索引,若索引匹配則表明數據項找到,若未找到匹配索引則表明要讀取的數據項未找到(未寫(xiě)入DATA FLASH),可設計函數返回不同值來(lái)表示是否找到數據項。當索引匹配時(shí),讀出存儲在索引數據地址單元中的數據項地址,調用讀FLASH庫函數讀出數據項即可。
3)總結
使用上述DATA FLASH存儲結構和存取規則,實(shí)現了數據存儲的可尋址和頁(yè)交替,比較充分的利用數據存儲空間。另外,數據項索引區和數據項存儲區的劃分并不一定要各占一半存儲空間,而應根據實(shí)際的各種數據項長(cháng)度來(lái)選擇優(yōu)化,當每種數據項字節數較多時(shí),可適當增加數據項存儲區的空間,避免存儲空間浪費。為了使數據存儲更加可靠,可使用數據的三備份存儲機制:實(shí)際存儲的每個(gè)數據項,均按順序地址依次進(jìn)行三備份存儲,讀取時(shí)必須有兩個(gè)備份相同才能確認數據有效。
評論