朱孟江,聶云杰
(南京南瑞集團公司,南京211100)
在線應用編程(In-Application Programming,IAP)技術是用戶自己的程序在運行過程中對User Flash的部分區域進行燒寫,目的是為了在產品發布后方便地通過服務通信端口對產品中的固件程序進行更新升級。
目前電力市場的電能數據采集終端、集中抄表終端等設備之間通信都是通過GPRS,在一些偏遠或者信號覆蓋較少地區GPRS存在一定的不穩定性,會出現數據傳輸中斷等現象。傳統IAP方式沒有考慮傳輸中斷和傳輸誤碼等問題,采取傳統方式對設備進行升級,如果升級過程中出現中斷,不僅導致APP程序區遭到破壞,還會因為升級中斷而再次重復升級,產生大量GPRS流量,因此急需一種行之有效的方法來解決這類問題。
本文將以ST公司的STM32F103RBT6為平臺,闡述IAP斷點續傳的方案及其優化。該方案解決了升級過程中意外中斷、遠程升級數據傳輸誤碼等關鍵性技術問題,保證了待升級終端內部應用程序的正確運行。該方案方便快捷,避免了傳統應用程序升級所帶來的復雜繁瑣過程,節約了大量人力資源,已在電力集抄系統中得到廣泛的應用。
STM32F103RBT6是一款以Cortex-M3為內核的32位CPU,帶有20KB的靜態RAM以及128KB的Flash存儲器,最高主頻可達72MHz,外部擁有豐富的外設資源和通信端口,為在線升級端口提供更多選擇。
對MCU而言,其程序都是一系列二進制代碼,并存儲在Flash空間。當MCU上電之后,內核把存儲在Flash內部的數據映射到RAM空間執行。因此在線編程可以看作是MCU對Flash空間的數據進行讀/寫操作。
傳統IAP原理是在用戶程序(APP)運行過程中,當接收到升級的命令后,把用戶數據保存到EEPROM或上傳到主站,然后跳轉到升級區,對APP程序區進行升級,當程序升級完畢,再跳轉到APP區執行APP程序。正常情況下,這種升級方法沒有問題;但是當升級過程中出現中斷,則整個APP數據區被破壞,即使下次升級成功,中間也會出現一段空白期。在電力儀表中,這種空白期將產生很大的影響,不僅丟失大量電能表數據,還會對用戶產生一系列的影響。
傳統升級流程圖如圖1所示。
斷點續傳能夠很好地解決傳統升級方式的不足,該方法主要原理是把Flash分成不同區域,每個區域存儲不同的數據或者用戶程序。以STM32F103RBT6為例,把內部Flash分成4個區域,如表1[2]所列。

圖1 傳統IAP流程圖

表1 STM32RBT6內部Flash區域劃分
第1個區域為IAP斷點續傳程序區,當終端上電或接收到升級命令時,程序指針跳轉到0x08000000處開始執行,等待接收升級數據包;第2個區域存儲一些升級相關的信息,每個信息表示上一次升級的狀態,以結構體形式存放。如:


第3和第4個區域分別存儲的是低區用戶程序和高區用戶程序。這樣做的目的是當升級其中一個用戶程序時候,即使升級被中斷,也可以到另外一個用戶區去執行相應用戶程序,保證用戶數據能夠得到及時有效處理,該方法在電力集抄系統中顯得尤為重要。假如某次系統升級被破壞,還可以運行原有的程序,繼續電能量的采集。但是采用傳統方式升級系統,假如升級過程被中斷,就會導致整個終端系統崩潰,不僅造成國家大量電能量的流失,而且會影響用戶的日常生活。
斷點續傳原理流程圖如圖2所示。
中斷向量表關系到終端的穩定運行,正常情況下終端設備復位后,設備程序指針自動指向0x00000004處,但是我們修改了用戶程序的起始地址,因此要相應地把中斷向量表的起始地址進行偏移。以低區用戶程序為例,

這里用串口對終端設備進行升級,協議幀結構如下:

圖2 斷點續傳流程圖

報文頭設備ID幀類型控制碼報文長度報文內容校驗位報文結尾2字節2字節1字節1字節2字節數據1字節1字節
報文頭:0x5A 0xA5。
設備ID:設備號。
幀類型:預留用來判斷幀的作用,暫定0x01。
控制碼:用來表明報文的作用,暫定下行是0x9X,上行是0x1X。
報文長度:是“報文內容”的長度。
校驗位:校驗位之前所有字符CRC(即從報文頭至校驗位之前的所有位的CRC)。
報文結尾:0xA5。
在通信協議里面加入CRC校驗,能夠很好地解決傳輸誤碼的問題;當接收方對接收到的數據進行校驗時,如果校驗值不正確,則丟棄本包數據,同時告訴主站重新發送該包數據。
Flash讀數據直接從相應地址讀取相應數據內容,即地址所指向的內容就是要讀取的數據。Flash寫操作需要注意在寫之前應該先把寫保護去除,否則導致寫入失敗。寫入操作如下:
PC指針成功跳轉是升級的關鍵。在跳轉之前先關閉全局中斷,保證PC指針指向非中斷服務程序。跳轉之后,首先把地址傳入PC指針,然后初始化堆棧指針[3]。實現方式如下:

本文提出了一種基于STM32平臺的嵌入式終端斷點續傳升級的新方法,該方法省去了傳統應用程序升級所帶來的復雜繁瑣步驟,同時又規避了升級失敗所帶來的風險。隨著國家對智能電網改造的推進,該方法也在電力集抄終端等設備得到大面積應用,便捷,可靠,具有極高的實用價值。
[1] ST.STM32F103XXX User Guide,2009.
[2] ST.STM32F10XXX閃存編程手冊,2009.
[3] ST.STM32F10x_IAP_AN,2007.