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