宋書龍,葛 露
(中國西南電子技術研究所,成都 610036)
嵌入式設備在實際使用中可能會遇到各種軟件問題和用戶需求的變化,這就需要對軟件進行升級以提供更好的功能和性能,尤其是交付到外場的設備,需要拆卸設備鏈接仿真器進行軟件升級,對于大型復雜的設備,甚至需要多名專業人員到現場,就會導致軟件升級過程比較繁瑣,增加了維護成本。軟件維護人員對嵌入式終端設備的軟件進行維護升級,常用的方法是拆卸設備,使用仿真器工具進行燒寫,而采用在線更新軟件的方式,可以解決不拆設備和掛載仿真器燒寫的問題。國外的公司PHILIPS的P89C51RX2xx系列單片機同時支持兩種功能在系統中編程和在應用中編程,PHILIPS為了使在線更新技術得以推廣,還在單片機上提供了免費的BOOT固件,使在線燒寫功能實現更簡單,意法半導體公司的PSD系列微控制器的片內Flash大容量存儲器,也同時支持在系統中編程和在應用中編程。國內的華大半導體有限公司HC32L136系列32位微控制器支持在線APP更新,在芯片上電復位的狀態下,BOOT0腳為高電平時,芯片會進入在線編程模式,通過上位機可以進行在線編程。兆易創新科技集團股份有限公司的GD32系列片上FLASH高達3 072 K字節用于存儲指令或數據,支持從系統存儲器啟動,在應用編程則可由用戶在應用中實現。本文采用GD32F450系列ARMCortex-M4內核的32位通用微控制器(MCU,microcontroller unit),處理器主頻高達200 MHz,控制器內部集成了一個以太網外設,支持100 Mbps數據傳輸速率,借助以太網外設,GD32F450控制器可以通過ETH外設按照IEEE 802.3-2002和IEEE 1588-2008標準發送和接收數據包。文獻[1-5]同類的研究大都是采用串口、CAN等總線在線燒寫,本設計是利用在應用編程技術進行免拆設備,在外場通過網絡在線快速升級GD32國產微控制器固件。
通過仿真器燒寫有兩種接口:一種是JTAG模式,另一種是SWD模式,JTAG(Joint Test Action Group)國際標準測試協議被廣泛應用于各種基于嵌入式系統的開發、測試和編程任務中。它提供了一種通用接口,可以方便地訪問芯片內部電路和功能,可以實現與目標設備的通信,讀取和寫入芯片內部寄存器或存儲器中的內容,以及監控和控制芯片的狀態,JTAG接口通常由TMS、TCK、TDI和TDO共4條線組成,TMS用于控制時序和模式選擇,TCK線則提供定時脈沖,TDI和TDO分別用于輸入和輸出數據。SWD(Serial Wire Debug)一種和JTAG不同的模式,使用的協議與JTAG也不一樣,SWD只需要4個引腳,結構簡單,需要的硬件接口為:GND、RST、SWDIO和SWDCLK,分別為地線、復位、數據線及時鐘,調試階段的終端模塊大都使用仿真器仿真調試和燒寫,除了仿真器可以燒寫以外,還有一些通過總線方式在線燒寫[6-8]。
在嵌入式技術中,在線編程方式主要有兩種:IAP(在應用中編程)和ISP(在系統中編程)。
ISP(In-system Programming)在系統中編程,用于嵌入式系統或芯片程序的更新和燒錄,跟傳統的更新和燒錄方式相比,ISP允許直接通過系統的通信接口如SPI、I2C、UART等對芯片內部進行編程操作,無需拆卸芯片,在系統上對程序進行更新、配置或修改,使用專門的編程器連接到目標設備進行編程操作,只要留出上位機的通信口,使用上位機軟件就可以實現對芯片內部存儲器的數據、配置文件、參數設置等進行修改,由于ISP技術可以對芯片內部直接訪問,在系統編程中,需要確保編程操作的準確性和安全性,避免意外寫入錯誤的代碼而損壞目標設備[9]。
IAP(In-application Programming)在應用中編程,它與ISP相似,但ISP通常涉及到整個系統的編程,而IAP是在特定應用程序中對固件進行更新,目標設備開機上電,直接運行應用程序完成固件更新,而無需重新啟動目標設備,需要把目標設備上的存儲器劃分為3個獨立的區域:一個區域作為引導程序,一個區域用于更新程序,最后一個區域用于存儲新固件的升級文件,通過對程序存儲器的指定段進行讀和寫操作,從而實現對目標設備上的程序的更新和燒錄[10]。
在線燒寫系統主要由3部分組成:上位機軟件、手持控制器和終端設備,上位機軟件主要通過網絡把數據發送給手持控制器,手持控制器把數據發送給終端設備,終端設備功能是運行點亮流水燈,系統如圖1所示。

圖1 系統框圖
1)上位機軟件通過網絡,把編譯鏈接生成最終的BIN格式文件發送給手持控制器。
2)終端設備上電時候,會進入BOOT引導區,此時如果手持控制器沒有給終端設備發送“啟動燒寫”指令,BOOT引導區的程序等待10 s以后,自動跳轉到APP運行區執行;此時如果手持控制器給終端設備發送“啟動燒寫”指令,BOOT引導區的程序收到正確的指令會跳轉到UPDATE升級區,手持控制器發送需要待燒寫的BIN文件給終端設備,由UPDATE升級區運行的程序把收到的數據燒寫到指定Flash分區上,燒寫完成后自動跳轉到APP運行區執行。
3)終端設備程序在APP運行區運行,手持控制器可以給終端設備發送復位命令,此時終端設備程序會進入BOOT引導區運行[11-12]。
2.2.1 上位機模塊設計
如圖2所示,上位機軟件基于PC機開發設計,讀取本次編譯的BIN格式文件,通過網絡發送給手持控制器,網絡收發數據使用UDP協議,每次傳輸數據的大小1 024字節,數據傳輸完成會給手持控制器發送傳輸完成標志。

圖2 上位機模塊圖
2.2.2 手持控制器模塊設計
手持控制器的片上Flash不需要分區,程序運行于片上Flash的開始區域0x08000000,收到數據存儲在片外Flash上,外掛的Flash存儲容量512 MB。
手持控制器由自檢、數據讀取、啟動燒寫及數據注入等命令組成,手持控制器發送自檢命令給終端設備模塊,終端設備模塊收到命令將自檢結果發送給手持控制器,如果手持控制器未收到自檢數據,會重傳自檢命令給終端設備,重傳3次以后仍未收到數據或收到數據異常,都會顯示自檢超時,只有收到正確的自檢數據,會把自檢結果信息顯示,通過自檢命令判斷手持控制器與終端設備網絡鏈接是否正常[13-14]。
如圖3所示,手持控制器會主動發送數據讀取命令給上位機軟件,接收到上位機軟件發送的數據會寫入到外掛的片外Flash進行存儲,當手持控制器會發送數據注入命令給終端設備模塊時,會從外掛的片外Flash中讀取數據,發送給終端設備模塊。

圖3 手持控制器模塊圖
2.2.3 終端設備模塊設計
終端設備模塊的程序分區運行,防止在更新程序時候失敗,導致應用程序無法執行,終端設備模塊分為3個區加載程序,分別是BOOT區、UPDATE區和APP應用區,如圖4所示。

圖4 終端設備模塊圖
1)BOOT區:終端模塊設備開機上電BOOT區的程序先加載運行,根據接收到的網絡命令進行程序跳轉。
2)UPDATE區:固件程序更新區,主要是更新程序,下載完成新固件后,自動跳轉到APP應用區運行。
3)APP應用區:主要用來實現所需要的業務的程序。
終端設備模塊開機上電時候,程序會在BOOT區運行,首先會初始化網絡,此時手持控制器發送“啟動燒寫”命令,終端設備模塊BOOT區的程序就會跳轉到UPDATE區域去運行,手持控制器發送 “數據注入”命令,會把待燒寫文件通過網絡發送給終端設備模塊,終端設備模塊收到正確數據后會把數據寫入到片上Flash,數據寫入完成后,終端設備模塊的程序會跳轉到APP運行區去運行,就會看到流水燈點亮,此時手持控制器發送復位命令,終端設備模塊就會進行軟件復位,程序會從BOOT區重新運行,APP程序為用戶功能代碼,執行用戶功能操作。
GD32F450ZI上使用了兩片閃存,前1 024 kB容量在第0片閃存中,后續的容量在第1片閃存中,主存儲閃存總共容量為3 072 kB,包含8個16 kB的扇區、2個64 kB的扇區、14個128 kB的扇區、4個256 kB的扇區[15]。主存儲閃存的每個扇區都可以單獨擦除,支持32位整字或16位半字、字節編程,4 kB頁擦除,扇區擦除和整片擦除操作,Bank0的總大小為1 024 kB,閃存的地址范圍為0x08000000-0x080FFFFF。根據固件在線升級的需要,將其劃分為 3個作用不同的區域,具體劃分如表1所示。

表1 終端設備Flash地址區域劃分
終端設備模塊在系統上電后或復位后立即進入 BOOT引導區執行,即系統上電或復位后,軟件從地址為0x8000000處執行,因此在MDK上需設置BOOT引導區片上Flash 起始地址為 0x08000000,BOOT引導區生成的BIN文件大小為52 kB設置分區大小為192 kB,同樣原理,UPDATE升級區生成的BIN文件大小100 kB,因此在MDK上需要設置UPDATE升級區片上Flash 起始地址為 0x08030000,APP運行區生成的BIN文件大小150 kB,在MDK上需要設置APP運行區片上Flash 起始地址為 0x08060000,BOOT引導區、UPDATE升級區和 APP 運行區的存儲區域相互獨立,只存在簡單的跳轉關系[16]。
終端模塊BOOT引導區的程序必須通過仿真器燒入,運行于片上Flash的開始區域0x08000000,UPDATE升級區的程序也必須通過仿真器燒入,運行于片上Flash的開始區域0x08030000,APP運行區的程序可以通過手持控制器燒入,運行于片上Flash的開始區域0x08060000,以后需要更新終端模塊的程序,只需要更新手持控制器存儲內容,無需通過仿真器進行更新,即使在燒寫的過程中突然掉電,只會導致APP運行區的程序會破壞,BOOT引導區和UPDATE燒寫區的程序仍然可以正確運行。
ARM結構CM4手冊規定芯片復位時要從0x0000 0000地址開始取出中斷向量,GD32的片上Flash在MDK里被設置為起始地址0x0800 0000,因為啟動模式決定了向量表的位置,GD32有3種啟動模式:
1)片上Flash存儲器。當選擇從片上Flash啟動模式后,使用JTAG或SWD模式燒寫程序,一般會將程序下載到設備內置的片上Flash存儲器中的0x0800 0000地址處,設備重啟直接從這個地址啟動程序,片上Flash的0x0800 0000地址被映射到0地址處,這個時候CM4既可以在0地址處訪問中斷向量表,也可以在0x0800 0000地址處訪問中斷向量表,而代碼存放在地址0x0800 0000。GD32通過做了一個啟動映射,NVIC中有一個寄存器,稱為向量表偏移量寄存器,在文件GD32f4xx_misc.c通過修改該寄存器的值就能重新定位向量表,向量表在地址空間中的位置是通過重定位寄存器設置的值來指出向量表的地址。在復位后,該寄存器的值為0[17]。
2)系統存儲器啟動。從系統存儲器啟動,通過設置引導引腳BOOT1=0 BOOT0=1,芯片能夠從特定區域的固化程序開始執行,特定區域的內存地址從0x1FFFF000開始,存放了廠家預置的程序,也稱為ISP程序,通常是只讀的,在出廠后,這個區域的數據不可以被修改或擦除,因此被認為是ROM區域。它存放著芯片出廠時預置的固化程序,主要用于初始化系統和提供下載功能,我們可以使用廠商提供的ISP程序,通過串口總線將用戶的應用程序下載到芯片的Flash存儲器中,下載完成后,為了使芯片能夠正常啟動運行已下載的程序,需要將BOOT0引腳和BOOT1引腳都重新設置為低電平。這種方式的好處是在不使用仿真器的情況下,直接通過串口進行程序更新和調試[18]。
3)片上SRAM啟動。從片上SRAM啟動時,確保程序正確執行,需要在應用程序的初始化代碼中重新設置向量表的位置,從特定的起始地址0x2000 0000進行訪問,與前面提到的系統存儲器啟動不同,SRAM無法永久存儲程序,且在掉電后數據將丟失,如果需要長期保存的數據,必須采取其他方式進行存儲,以防止掉電導致數據丟失,因此這種啟動模式主要用于程序的調試和臨時存儲數據[19]。
在許多GD32系列芯片上,存在兩個引腳BOOT0和BOOT1,它們在芯片復位時的電平狀態決定了芯片復位后從哪個區域開始執行程序。多數正常啟動情況下BOOT0和BOOT1引腳都被拉低,電平都為0時,芯片從片上Flash存儲器的起始地址處開始執行程序。當芯片從系統存儲器啟動時候,BOOT0引腳被設置為高電平,才允許外部串口下載新的程序到芯片的Flash存儲器中,下載完成后,將BOOT0引腳重新設置為低電平,以便芯片正常啟動已下載的程序,而BOOT1引腳通常保持為低電平。當芯片從SRAM啟動,BOOT0和BOOT1兩個引腳都需要拉高。啟動模式如表2所示。

表2 啟動模式
通過設置BOOT1和BOOT0兩個引腳的電平狀態,就可以靈活切換芯片的啟動模式,本文啟動模式設計為BOOT1=0和BOOT0=0從片上Flash存儲器啟動,如圖5所示。

圖5 啟動模式原理圖
DP83848是一種由德州儀器(Texas Instruments)公司生產的集成以太網控制芯片,用于實現100 Mbit/s單路物理層以太網的收發功能,支持100 M的以太網通信,集成度高,具有低功耗等性能,同時支持MII(媒體獨立接口)與RMII(簡化的媒體獨立接口)兩種與物理層(PHY)通訊的標準接口,實現以太網數據幀的發送與接收,遵守IEEE 802.3-2002標準和IEEE 1588-2008標準,還集成了串行管理接口(SMI,serial management interface),專門用于訪問PHY芯片寄存器[20-21],SMI接口包括MDC和MDIO兩條信號線,MDIO是用來讀寫PHY的寄存器,以獲取PHY的狀態,MDC為MDIO提供時鐘。SMI接口可以支持最多32個PHY,但在任意時刻只能訪問一個PHY的一個寄存器。
本文采用RMII接口模式,需要7根線通信,MII模式需要16根通信線,RMII模式在功能上與MII是相同的,在保持物理層器件現有特性的前提下減少了PHY芯片引腳數量,RMII接口模式主要包括以下引腳:參考時鐘、發送使能、接收使能、發送數據及接收數據等。PHY芯片原理如圖6所示。

圖6 PHY芯片原理圖
ETH_50M:在RMII模式下使用,提供給PHY芯片的50 MHz參考時鐘,這個外部時鐘非常重要,需要穩定、高精度,讓系統各個組件時序同步。
MCU_PHY_TXEN:數據發送使能,高電平有效。在整個數據發送過程保存有效電平,表示MAC層正在將要傳輸的數據放到MCU_PHY_TXD0和MCU_PHY_TXD1上。
MCU_PHY_TXD0:發送數據,MCU_PHY_TXEN有效后,作為發送端。
MCU_PHY_TXD1:在RMII模式下只有2位,只有在MCU_PHY_TXEN 有效數據線才有效。
MCU_PHY_CRS_DV:數據接收使能,用于數據接收。對于RMII 模式,這個MCU_PHY_CRS_DV引腳有效,則認為在MCU_PHY_RXD0和MCU_PHY_RXD1上的數據是有效的。
MCU_PHY_RXD0:接收數據,與ETH_50M時鐘同步,在MCU_PHY_CRS_DV有效后的每個時鐘周期里,MCU_PHY_RXD0和MCU_PHY_RXD1接收PHY芯片的兩位數據。
MCU_PHY_RXD1:接收數據,MCU_PHY_CRS_DV有效后,作為接收端。
MCU_PHY_MDC:為MCU_PHY_MDIO提供時鐘,最高頻率為2.5 MHz的時鐘信號,在空閑狀態下該引腳保持為低電平狀態。
MCU_PHY_MDIO:用于與PHY之間的數據傳輸,與MCU_PHY_MDC時鐘線配合,接收和發送數據。
網絡變壓器原理如圖7所示。在PHY芯片與RJ45網絡插座之間還需要一個網絡變壓器,PHY芯片工作時送出的上行數據信號從網絡變壓器的 Pin1和Pin3進入,再由Pin16和Pin14輸出,經RJ45水晶頭連接網線發送出去,外部設備送來的下行數據信號經網線和RJ45水晶頭,由Pin9和Pin11進入網絡變壓器,再由Pin6和Pin8輸出,送到PHY芯片的收發器上。

圖7 網絡變壓器原理圖
理論上來說,可以不接網絡變壓器,從PHY芯片出來信號直接連到RJ45上,也是能正常工作的,但傳輸距離就會受到限制,因為PHY芯片驅動器的功率有限,當網線較長時,到接收端RJ45上的信號會逐漸衰減,導致工作異常,添加網絡變壓器后,通過變壓器輸出信號顯著提高,傳輸距離進一步增加。增加網絡變壓器相當于將PHY芯片與RJ45線路隔離,減少PHY芯片受到各種干擾,輸出信號更加穩定,還可以確保不同型號PHY芯片信號正常傳輸,增強整個網絡的兼容性。
上位機軟件通過網絡與手持控制器進行數據通信,手持控制器是固件更新操作的發起端,手持控制器發送數據讀取命令給上位機,上位機把編譯生成的BIN文件發送手持控制器存儲。其具體實現流程如下:
1)上位機軟件初始化,讀取本地更新BIN文件,如果收到手持控制器發送的數據讀取命令后,會把文件大小通過網絡發送給手持控制器,手持控制器接收到正確的文件大小后擦除本地片外Flash;
2)上位機根據讀取數據幀長度判斷是否需要拆幀發送,數據超過1 024字節需要進行拆分為若干幀,沒有超過1 024字節的數據直接發送,上位機發送的每幀數據1 024字節,發送完成都要等待手持控制器回復,否則對該幀數據進行重傳3次,重傳3次仍沒有收到表示傳輸失敗;
3)上位機下發的每幀數據都收到了手持控制器回復,當傳輸完最后一幀數據,手持控制器會顯示數據讀取成功,如果傳輸過程中出現異常,手持控制器會顯示數據讀取超時。
手持控制器操作按鍵選擇相應功能執行,跟設備進行命令式交互,通過以太網接口與終端設備模塊通信,交互信息顯示在屏上顯示,手持控制器起到了中轉數據的作用,手持控制器設計流程如圖8所示。

圖8 手持控制器設計流程
手持控制器交互具體實現流程如下:
1)上電初始化手持控制器,主要包括顯示模塊、按鍵模塊、網絡傳輸模塊、Flash模塊等;
2)初始化完成進入主菜單,通過查詢判斷按鍵是否被按下,如果按下就會發送對應的命令給終端設備模塊,終端設備模塊收到命令回復確認消息,超過設置的時間未收到數據,則顯示超時;
3)如果按下數據注入命令,就會讀取存儲在片外Flash中的數據,通過網絡發送給終端設備模塊,發送完成后顯示發送成功;如果按下數據讀取命令,就會接收上位機軟件發送的數據,并將數據存儲到片外Flash,接收完成后顯示接收成功;
4)如果按下自檢命令,就會通過網絡發送給終端設備模塊,終端設備模塊收到自檢命令就會把自檢結果回傳給手持控制器。
終端設備模塊的設計需要創建3個工程,分別是BOOT工程、 UPDATE工程和APP點亮流水燈工程,如圖9所示,終端模塊上電運行BOOT區程序,等待手持控制器發送升級命令,10 s沒有升級收到命令,程序跳轉到APP區運行。如果終端設備模塊上電以后,手持控制器發送升級命令,程序跳轉到UPDATE區運行,將收到的數據寫入到0x8060000開始的地址,數據全部燒寫完成后,程序會跳轉到APP區運行。

圖9 終端模塊的圖
4.3.1 BOOT啟動區的軟件設計
終端模塊上電復位后在0x0800 0000地址處訪問中斷向量表,如果收到手持控制器升級命令,跳轉到UPDATE區,10 s沒有收到手持控制器命令,跳轉到APP區,下面程序是收到升級命令從BOOT區跳轉到UPDATE區。
define FLASH_UPDATE_ADDR 0x08003000 /*UPDATE區中斷向量表*/
void iap_jump_to_update(void)
{
if (((*(__IO uint32_t*)FLASH_UPDATE_ADDR) &0x2FFE0000 ) 0x20000000) /*檢查棧頂地址是否合法 */
{
__disable_irq();/*屏蔽所有中斷,否則可能導致跳轉的失敗*/
JumpAddress = *(__IO uint32_t*) (FLASH_UPDATE_ADDR + 4); /*設置UPDATE區堆棧首地址即跳轉到新的程序的起始地址 */
Jump_To_Update = (pFunction) JumpAddress; /*將跳轉到達UPDATE區程序的首地址賦值給一個函數指針*/
__set_MSP(*(__IO uint32_t*) FLASH_UPDATE_ADDR); /*初始化堆棧指針*/
Jump_To_Update (); /*函數指針完成跳轉*/
}
}
4.3.2 UPDATE燒寫區的軟件設計
UPDATE區的程序能夠運行,需要在程序中再次被映射中斷向量表,根據表1終端設備模塊片上Flash地址區域劃分,UPDATE區中斷向量表被映射到0x0803 0000,修改中斷向量表函數使用nvic_vector_table_set(NVIC_VECTTAB_FLASH,0x30000),UPDATE區程序存儲更改為0x0803 0000,如圖10所示。

圖10 UPDATE區程序存儲位置
手持控制器負責將上位機軟件下發的數據幀內容通過網絡總線轉發到對應的終端設備模塊,UPDATE區的程序按照表3數據幀消息內容進行解析,每幀前8個字節分別表示幀頭、長度和幀序號,后面接著1 024字節真實BIN文件數據,為避免傳輸出錯會進行CRC校驗,終端設備模塊收到每幀數據都正確,就會寫入到片上Flash存儲。

表3 數據幀消息內容
下面程序是UPDATE區核心程序,主要功能是燒寫BIN文件到片上Flash中,燒寫完成程序會自動跳轉到APP區。
define FLASH_APP2_ADDR (0x08060000) /* APP區起始地址*/
define READ_LEN (1024) /*一幀固件數據大小*/
void Write_MCU_To_Flash(void)/*把固件數據寫到flash*/
{
uint32_t data_buff[512]={0};
if(JTAG_flag 1)
{
g_cn = 0;/*計數清0*/
}
else if(JTAG_flag 2)/*收到一幀數據1024字節*/
{
memcpy(data_buff,g_UdpRxBuf+8,READ_LEN);
fmc_write_32bit_data(FLASH_APP2_ADDR+g_cn,READ_LEN/4, data_buff); /*寫入片上FLASH*/
g_cn+=READ_LEN;
}
else if(JTAG_flag 3) /*收到最后一幀數據不足1024字節*/
{
memcpy(data_buff,g_UdpRxBuf+8,data_len);
fmc_write_32bit_data(FLASH_APP2_ADDR+g_cn,data_len/4, data_buff); /*寫入片上FLASH*/
g_cn = g_cn + data_len;
}
}
4.3.3 APP運行區的軟件設計
1)同樣原理APP區的程序能夠運行,根據表1終端設備模塊片上Flash地址區域劃分,APP區中斷向量表被映射到0x08060000,修改中斷向量表映射位置nvic_vector_table_set(NVIC_VECTTAB_FLASH,0x60000)。
2)默認情況下MDK編譯鏈接是不會生成 BIN 文件,需要配置工程選項,在 MDK的“Options For Target->Users”中加入fromelf 指令,編譯生成BIN格式文件如圖11所示,KARMARMCCinfromelf.exe --bin-output=@L.bin !L。原始數據如圖12所示,其中BIN 文件是最直接的代碼映像,它記錄的內容就是要存儲到片上FLASH 的二進制數據,在片上FLASH 中燒寫的內容與BIN文件內容完全相同[22]。

圖11 配置工程

圖12 BIN文件的原始數據
3)程序在UPDATE區運行時候,才能更新固件,在APP區運行無法更新,此時,手持控制器給終端設備模塊發送復位命令,通過NVIC_SystemReset()函數執行軟件復位。軟件復位后程序就會重新從BOOT區運行,手持控制器給終端設備模塊發送燒寫命令,終端設備模塊程序跳轉到UPDATE區運行,固件更新完成后會自動運行新的應用程序。
本文是把生成固件通過上位機發送給手持控制器,通過手持控制器,對終端設備模塊的應用程序進行燒寫,通過實驗對固件升級過程進行模擬測試驗證,并對終端設備模塊的環境實驗進行測試驗證,最后對實驗結果進行分析和總結。
1)按照3.3節完成終端設備模塊設計,把片上Flash全部擦除,BOOT區的可執行程序和UPDATE區的可執行程序通過仿真器燒錄到片上Flash,將APP應用程序生成的BIN文件,通過上位機軟件發送到手持控制器;
2)終端設備模塊上電復位,通過手持控制器把APP應用程序生成的BIN文件燒寫到片上Flash指定地址,通過讀取0x0806 0000地址數據與BIN源文件比對,如果兩者一樣,說明燒寫到片上Flash成功,BIN源文件的部分數據如圖12所示,片上Flash部分數據如圖13所示;

圖13 片上Flash讀出來的數據
3)燒寫完成后,手持控制器會顯示燒寫完成,觀察終端設備模塊上的流水燈會閃爍,表明此次升級成功。有多種情況會造成固件升級失敗,比如升級過程中網絡斷開、突然斷電都會導致終端設備模塊燒寫失敗,此時終端模塊上電復位會無法工作,流水燈無法點亮。由于本設計分為BOOT區、UPDATE區和APP區,異常造成固件升級失敗,只是APP區的程序無法正常運行,斷電后終端設備模塊重新上電燒寫,仍可以將固件寫入APP區完成升級。
通過手持控制器燒寫完成的終端設備模塊放到溫箱進行環境實驗測試,分別在高溫正52 ℃、低溫負55 ℃和常溫正30 ℃進行功能驗證,觀察流水燈是否點亮,在此范圍溫度上電斷電各30次,測試記錄如圖14所示,流水燈全部點亮。

圖14 環境實驗圖
通過上述實驗表明,在-55~52 ℃流水燈都點亮,固件都能正常工作,上下電各30次全部點亮,成功率均達到了100%,實驗結果與預期一致,通過在線燒寫固件方法,可以讓終端設備模塊程序正確運行,方案是穩定可靠的。
本文是通過免拆終端模塊及無須掛載仿真器對其在線燒寫,并對其功能進行驗證,通過實驗測試驗證流水燈都能正常工作,說明此方案可行性,達到了預期的目的,基于GD32芯片網絡在線燒寫固件技術可靠,為外場升級免拆設備提供依據,在企業的實際生產和維護過程中使用在線燒寫技術,可以降低設備維護人力成本,大大地提高了企業經濟效益。