朱孟江,聶云杰
(南京南瑞集團(tuán)公司,南京211100)
在線應(yīng)用編程(In-Application Programming,IAP)技術(shù)是用戶自己的程序在運(yùn)行過程中對(duì)User Flash的部分區(qū)域進(jìn)行燒寫,目的是為了在產(chǎn)品發(fā)布后方便地通過服務(wù)通信端口對(duì)產(chǎn)品中的固件程序進(jìn)行更新升級(jí)。
目前電力市場的電能數(shù)據(jù)采集終端、集中抄表終端等設(shè)備之間通信都是通過GPRS,在一些偏遠(yuǎn)或者信號(hào)覆蓋較少地區(qū)GPRS存在一定的不穩(wěn)定性,會(huì)出現(xiàn)數(shù)據(jù)傳輸中斷等現(xiàn)象。傳統(tǒng)IAP方式?jīng)]有考慮傳輸中斷和傳輸誤碼等問題,采取傳統(tǒng)方式對(duì)設(shè)備進(jìn)行升級(jí),如果升級(jí)過程中出現(xiàn)中斷,不僅導(dǎo)致APP程序區(qū)遭到破壞,還會(huì)因?yàn)樯?jí)中斷而再次重復(fù)升級(jí),產(chǎn)生大量GPRS流量,因此急需一種行之有效的方法來解決這類問題。
本文將以ST公司的STM32F103RBT6為平臺(tái),闡述IAP斷點(diǎn)續(xù)傳的方案及其優(yōu)化。該方案解決了升級(jí)過程中意外中斷、遠(yuǎn)程升級(jí)數(shù)據(jù)傳輸誤碼等關(guān)鍵性技術(shù)問題,保證了待升級(jí)終端內(nèi)部應(yīng)用程序的正確運(yùn)行。該方案方便快捷,避免了傳統(tǒng)應(yīng)用程序升級(jí)所帶來的復(fù)雜繁瑣過程,節(jié)約了大量人力資源,已在電力集抄系統(tǒng)中得到廣泛的應(yīng)用。
STM32F103RBT6是一款以Cortex-M3為內(nèi)核的32位CPU,帶有20KB的靜態(tài)RAM以及128KB的Flash存儲(chǔ)器,最高主頻可達(dá)72MHz,外部擁有豐富的外設(shè)資源和通信端口,為在線升級(jí)端口提供更多選擇。
對(duì)MCU而言,其程序都是一系列二進(jìn)制代碼,并存儲(chǔ)在Flash空間。當(dāng)MCU上電之后,內(nèi)核把存儲(chǔ)在Flash內(nèi)部的數(shù)據(jù)映射到RAM空間執(zhí)行。因此在線編程可以看作是MCU對(duì)Flash空間的數(shù)據(jù)進(jìn)行讀/寫操作。
傳統(tǒng)IAP原理是在用戶程序(APP)運(yùn)行過程中,當(dāng)接收到升級(jí)的命令后,把用戶數(shù)據(jù)保存到EEPROM或上傳到主站,然后跳轉(zhuǎn)到升級(jí)區(qū),對(duì)APP程序區(qū)進(jìn)行升級(jí),當(dāng)程序升級(jí)完畢,再跳轉(zhuǎn)到APP區(qū)執(zhí)行APP程序。正常情況下,這種升級(jí)方法沒有問題;但是當(dāng)升級(jí)過程中出現(xiàn)中斷,則整個(gè)APP數(shù)據(jù)區(qū)被破壞,即使下次升級(jí)成功,中間也會(huì)出現(xiàn)一段空白期。在電力儀表中,這種空白期將產(chǎn)生很大的影響,不僅丟失大量電能表數(shù)據(jù),還會(huì)對(duì)用戶產(chǎn)生一系列的影響。
傳統(tǒng)升級(jí)流程圖如圖1所示。
斷點(diǎn)續(xù)傳能夠很好地解決傳統(tǒng)升級(jí)方式的不足,該方法主要原理是把Flash分成不同區(qū)域,每個(gè)區(qū)域存儲(chǔ)不同的數(shù)據(jù)或者用戶程序。以STM32F103RBT6為例,把內(nèi)部Flash分成4個(gè)區(qū)域,如表1[2]所列。
圖1 傳統(tǒng)IAP流程圖
表1 STM32RBT6內(nèi)部Flash區(qū)域劃分
第1個(gè)區(qū)域?yàn)镮AP斷點(diǎn)續(xù)傳程序區(qū),當(dāng)終端上電或接收到升級(jí)命令時(shí),程序指針跳轉(zhuǎn)到0x08000000處開始執(zhí)行,等待接收升級(jí)數(shù)據(jù)包;第2個(gè)區(qū)域存儲(chǔ)一些升級(jí)相關(guān)的信息,每個(gè)信息表示上一次升級(jí)的狀態(tài),以結(jié)構(gòu)體形式存放。如:
第3和第4個(gè)區(qū)域分別存儲(chǔ)的是低區(qū)用戶程序和高區(qū)用戶程序。這樣做的目的是當(dāng)升級(jí)其中一個(gè)用戶程序時(shí)候,即使升級(jí)被中斷,也可以到另外一個(gè)用戶區(qū)去執(zhí)行相應(yīng)用戶程序,保證用戶數(shù)據(jù)能夠得到及時(shí)有效處理,該方法在電力集抄系統(tǒng)中顯得尤為重要。假如某次系統(tǒng)升級(jí)被破壞,還可以運(yùn)行原有的程序,繼續(xù)電能量的采集。但是采用傳統(tǒng)方式升級(jí)系統(tǒng),假如升級(jí)過程被中斷,就會(huì)導(dǎo)致整個(gè)終端系統(tǒng)崩潰,不僅造成國家大量電能量的流失,而且會(huì)影響用戶的日常生活。
斷點(diǎn)續(xù)傳原理流程圖如圖2所示。
中斷向量表關(guān)系到終端的穩(wěn)定運(yùn)行,正常情況下終端設(shè)備復(fù)位后,設(shè)備程序指針自動(dòng)指向0x00000004處,但是我們修改了用戶程序的起始地址,因此要相應(yīng)地把中斷向量表的起始地址進(jìn)行偏移。以低區(qū)用戶程序?yàn)槔?/p>
這里用串口對(duì)終端設(shè)備進(jìn)行升級(jí),協(xié)議幀結(jié)構(gòu)如下:
圖2 斷點(diǎn)續(xù)傳流程圖
報(bào)文頭設(shè)備ID幀類型控制碼報(bào)文長度報(bào)文內(nèi)容校驗(yàn)位報(bào)文結(jié)尾2字節(jié)2字節(jié)1字節(jié)1字節(jié)2字節(jié)數(shù)據(jù)1字節(jié)1字節(jié)
報(bào)文頭:0x5A 0xA5。
設(shè)備ID:設(shè)備號(hào)。
幀類型:預(yù)留用來判斷幀的作用,暫定0x01。
控制碼:用來表明報(bào)文的作用,暫定下行是0x9X,上行是0x1X。
報(bào)文長度:是“報(bào)文內(nèi)容”的長度。
校驗(yàn)位:校驗(yàn)位之前所有字符CRC(即從報(bào)文頭至校驗(yàn)位之前的所有位的CRC)。
報(bào)文結(jié)尾:0xA5。
在通信協(xié)議里面加入CRC校驗(yàn),能夠很好地解決傳輸誤碼的問題;當(dāng)接收方對(duì)接收到的數(shù)據(jù)進(jìn)行校驗(yàn)時(shí),如果校驗(yàn)值不正確,則丟棄本包數(shù)據(jù),同時(shí)告訴主站重新發(fā)送該包數(shù)據(jù)。
Flash讀數(shù)據(jù)直接從相應(yīng)地址讀取相應(yīng)數(shù)據(jù)內(nèi)容,即地址所指向的內(nèi)容就是要讀取的數(shù)據(jù)。Flash寫操作需要注意在寫之前應(yīng)該先把寫保護(hù)去除,否則導(dǎo)致寫入失敗。寫入操作如下:
PC指針成功跳轉(zhuǎn)是升級(jí)的關(guān)鍵。在跳轉(zhuǎn)之前先關(guān)閉全局中斷,保證PC指針指向非中斷服務(wù)程序。跳轉(zhuǎn)之后,首先把地址傳入PC指針,然后初始化堆棧指針[3]。實(shí)現(xiàn)方式如下:
本文提出了一種基于STM32平臺(tái)的嵌入式終端斷點(diǎn)續(xù)傳升級(jí)的新方法,該方法省去了傳統(tǒng)應(yīng)用程序升級(jí)所帶來的復(fù)雜繁瑣步驟,同時(shí)又規(guī)避了升級(jí)失敗所帶來的風(fēng)險(xiǎn)。隨著國家對(duì)智能電網(wǎng)改造的推進(jìn),該方法也在電力集抄終端等設(shè)備得到大面積應(yīng)用,便捷,可靠,具有極高的實(shí)用價(jià)值。
[1] ST.STM32F103XXX User Guide,2009.
[2] ST.STM32F10XXX閃存編程手冊(cè),2009.
[3] ST.STM32F10x_IAP_AN,2007.