摘要: 以Freescale公司的MC68HC908JL8 MCU為例,介紹了使用芯片自帶監控ROM程序對片上Flash進行擦/寫等操作的方法和特點。通過對一個因Flash程序被改寫從而引起設備故障的案例進行了分析,為因軟件引起的單片機Flash失效分析提供了參考。
引言
在目前種類繁多的Flash MCU中,有很多可以自編程,即可以在單片機(MCU)運行過程中,實時存儲程序運行中產生的數據,甚至是改變程序本身。具有這種功能的Flash MCU 可以靈活地使用Flash來存儲數據,實現遠程在線自動升級自己的用戶代碼(Firmware)。MC68HC908JL8(以下簡稱JL8)是Freescale公司推出的一款08系列8位MCU,以成熟的Flash存儲技術取代了05系列的EEPROM,繼承了EEPROM的可再編程特性。JL8內部有8 KB的Flash存儲區,可用作程序存儲區和數據存儲區。該Flash為NOR Flash,程序可直接在Flash上運行,不必再把代碼讀到系統RAM中,用戶可以在這個非易失的存儲區內反復存儲和讀取一個數據集。
由于Flash存儲區的最小擦除單位是頁(JL8一頁有64個字節),若數據的長度小于一頁,那么每次寫和擦除都不能完全使用該頁,沒有用到的地方就浪費了。但如果是EEPROM就不存在這個問題,因為EEPROM可以基于字節進行寫和擦除。JL8為了解決這個問題,在其監控ROM區內提供了EE_WRITE、EE_READ子例程給用戶使用,從而更充分地使用Flash頁進行數據存儲。
1、Flash擦寫機制和特性
Freescale公司JL8 MCU采用Flash存儲代碼和數據,通過片上內置電壓泵,支持在線編程[34]。在不需要外接高壓的情況下,通過指令可實現Flash空間的擦/寫操作。Flash擦/寫操作的實現主要有兩種方式:一是用戶自行編寫程序,二是調用監控ROM中自帶子程序。為防止意外操作,單片機在硬件設計上加以改進,增加了FLCR(Flash控制寄存器)和FLBPR(Flash塊保護寄存器)兩個寄存器,如果要擦/寫Flash,須先打開FLCR和FLBPR相應位。用戶編程時需要控制兩個寄存器,而使用監控ROM程序,只需設置FLBPR相應位。
JL8 MCU Flash以頁為單位進行擦除,可將“0”全部置為“1”。Flash寫操作與擦除相反,可將“1”置為“0”,但原來為“0”處不能寫為“1”。所以如果需要用Flash存儲數據時,正常操作流程是先擦除再寫。需要注意的是,擦除操作是按頁進行,寫操作沒有限制,可按照字節進行。
JL8 MCU片內Flash可在監控模式(Monitor Mode)和用戶模式(User Mode)這兩種模式下在線編程。其中監控模式主要用于主機向單片機進行程序寫入,一般用于對出廠的空白芯片進行編程。JL8 MCU監控ROM所提供的所有子程序的入口地址和基本功能如表1所列。具體使用方法可參考技術文檔。 
2、失效現象分析
Flash MCU出現程序改寫,原因可從硬件和軟件兩方面進行分析[5]。硬件方面引起程序改寫的機理主要有:①電源失效;②時鐘毛刺;③VDD爬升時間過長。軟件上引起程序改寫機理主要有:①VDD監視沒有使能,或者VDD監視雖然已經使能,但沒有被設置成復位源,使得當供電不正常時仍然進行Flash操作,導致存儲數據產生異常操作;②用戶代碼(Firmware)對Flash的寫操作不當;③PC指針跑飛。硬件引起的Flash MCU程序改寫出現時具有隨機的特征, 即出現程序改寫的位置不固定。
在一款家用電器通用壓縮機控制設備中,其核心控制單元采用Freescale公司MC68HC908JL8單片機,用于控制和優化壓縮機,可實現壓縮機的開關控制、壓縮機性能的提升以及保護功能。該控制單元程序只對Flash進行讀操作,并無擦除/寫需求和設計。在部分產品出現壓縮機控制設備停機故障后,通過回讀故障設備的單片機存儲Flash后,發現部分代碼已被改寫。按照改寫Flash分布情況,將失效現象分成兩類:一是復位中斷向量($FFFE~$FFFF)低字節($FFFF)處部分位被改寫,失效產品數量較多,達80%,具體現象是將部分位從“1”改為“0”(有3種情況,分別為FF>AF,EF>AF,9F>8F);二是用戶Flash空間部分字節被改寫,這類較少,占20%,具體現象是將連續64字節改為0xFF。根據現象分析,第一類類似于字節寫操作,由于未進行擦除操作,所以只能將“1”改為“0”,且均是試圖將高4位改為“A”;第二類類似于片擦除操作。經過故障整理和分析,由于具有較強意義上的非隨機特征,可基本排除硬件故障引起的程序改寫。
通過分析源程序注意到,可能引起Flash程序改寫的軟件原因如下:對于①,程序已經將VDD監視使能,且設置成復位源;對于②,用戶代碼設計時不對程序Flash進行擦除/寫操作,即使異常出現第一類現象,也不會出現第二類現象,而程序跑飛異常調用到監控ROM程序可產生上述現象。在下節中對第二類失效現象進行復現。
3、現象復現
本節在不修改源代碼的基礎上,在源程序插入少量測試代碼以復現上述失效現象,證明在滿足測試代碼要求的條件下,可實現同樣的程序失效結果,僅對頁擦除操作進行舉例。頁擦除操作可調用EraRnge實現,具體如下:
//調用擦除子程序,起始地址是DE00,整體擦除1頁(即DE00~DE3F)
asm{//時鐘頻率為5 MHz LDA #20 STA $120//在地址0x120處寫入20,總線頻率//BUS_SPEED,該值為4倍時鐘頻率
LDA #$DE
STA $122
LDA #$00
STA $123 //在地址0x122~123處寫入0x DE00,若不為//64的整數倍,將自動截取
LDA #$FF
STA $FFCF //使能FLBPR,允許擦寫操作
LDHX #$120 //使當前累加寄存器A中數據為地址0x120
JSR $FCBE
}
在軟件運行時,由于外部原因使PC指針跑飛,跳轉到$FCBE,如果此時寄存器A中存儲數據(表示地址)指向的地址空間數據為20,則將對Flash進行頁擦除操作。
結語
本文對使用JL8 MCU自帶監控ROM程序對片上Flash進行擦/寫等操作的方法和特點進行了詳細的介紹。MCU的Flash失效現象和原因很多,這里僅對軟件引起的Flash程序改寫的案例進行了分析。根據具體現象判定程序改寫是由于程序跑飛或者異常跳轉使得程序意外調用監控ROM程序,為對Flash進行失效分析的廣大研發和測試工程師提供一個失效分析案例和分析思路。
|