(沈陽新松機器人自動化股份有限公司,沈陽 110168)
STM32在復雜系統中實現固件自動升級的方法
宋宇寧
(沈陽新松機器人自動化股份有限公司,沈陽 110168)
提供了一種應用STM32微控制器實現在復雜的硬件系統中完成固件自動升級的方法。通過以太網和SPI接口實現了ARM架構STM32微控制器固件的傳輸、存儲和自動升級;通過JTAG接口協議實現了STM32微控制器對Xilinx公司Spartan-6系列FPGA固件的下載和升級。文中詳細介紹了固件自動升級方法的實現原理和開發流程,并提供了部分源碼及程序流程圖。經實際產品驗證,該方法極大提升了現場升級維護硬件的效率,節約了服務成本,提高了產品的穩定性。
固件自動升級;STM32;微控制器;以太網;FPGA
伴隨著市場上工業自動化及大型醫療器械產品的競爭加劇,產品的毛利潤不斷壓縮,降低產品的服務成本、提升產品的服務收益已經成為企業利潤成長的重要形式。作為硬件升級與維護不可或缺的環節,板卡的固件升級在工程設計及調試階段通常是應用仿真器連接板卡來進行。但在產品發布及售出之后,應用該方法會帶來很多問題:有些產品需要拆裝外殼,有些則需要在復雜的系統中手動連接下載電纜,除了延長設備維護的時間,提升服務成本外還會帶來額外的安全風險。因此,實現固件的自動升級成為每個大型的工業及醫療產品都必須考慮的服務功能。
實現產品固件的自動升級需要依賴系統中的控制器,本文提出了一種基于ARM微控制器實現自身的固件以及為FPGA固件自動升級的方法,通過上位機及以太網傳輸固件,通過JTAG協議將FPGA固件下載到FPGA外擴的PROM中,整個過程不需要拆裝外殼及連接硬件仿真器,操作簡單且提升了效率。
大型的工業及醫療器械硬件系統實現的功能較多,結構比較復雜,通常會采用x86、ARM以及FPGA多種硬件平臺實現系統功能,典型的系統硬件框圖如圖1所示。

圖1 系統硬件框圖
其中,基于x86平臺的PC104工控機通過有線以太網或者WiFi連接的方式與控制臺計算機連接,并通過集成的無線路由器與控制臺計算機及各ARM控制器板組成內部局域網。PC104用于控制臺控制命令的轉發、各板卡狀態的反饋以及升級固件的傳輸等功能。ARM控制器板卡采用STM32F407微控制器,主要用于實現板卡間協議通信,復雜算法的實現及固件自動升級功能。FPGA板卡采用Xilinx公司Spartan-6系列XC6SLX45T。由于FPGA內部沒有大容量Flash存儲器,需要外擴PROM存儲固件程序。在設置配置方案后,板卡上電時將PROM中的固件讀出并加載到FPGA的SRAM中運行,配套PROM的型號為Xilinx XCF16P。FPGA板卡主要用于實現高速信號數據傳輸及控制命令的并發執行。ARM控制器外擴的Flash用于存放ARM控制器和FPGA板卡的固件。ARM控制器和FPGA板卡之間通過串行及并行接口進行數據通信,并通過JTAG接口將FPGA外接的PROM以菊花鏈的方式連接,按照JTAG的協議規范將固件依次下載到菊花鏈上的各PROM中。
2.1 STM32系列MCU的固件文件介紹
STM32系列的MCU(微控制器單元)可應用IAR for EWARM V6.40編譯環境進行開發設計,程序編譯后默認生成的固件格式后綴為.out,可通過JTAG仿真器及修改編譯環境的配置選項,直接將程序下載到MCU的內部Flash中運行,也可下載到內部SRAM中進行在線調試。
如果采用自動升級方式,建議通過開發編譯環境的配置選項輸出一個*.bin文件,即二進制格式的固件文件。該文件不僅支持STM32固件的傳輸和自動升級,還可通過ST公司提供的STM32系列固件下載工裝軟件ST-link utility及ST-Link V2仿真器,將固件下載到STM32 MCU的內部Flash中運行。

圖3 菊花鏈的連接及FPGA配置方式
ISE軟件是Xilinx公司推出的FPGA及CPLD集成開發環境,該軟件環境下編譯生成的FPGA固件格式通常包括.bit和.mcs格式兩種。編譯器默認生成.bit格式的固件文件,可通過JTAG仿真器將文件下載到內部SRAM中,也可應用該文件實現FPGA固件的自動升級。BIT文件的組織格式通常為15字節的文件開始標記、文件名記錄、文件創建時間、配置數據開始標記及配置數據,該文件可通過UltraEdit軟件查看。在通過網絡傳輸FPGA固件的過程中,通常只需要傳遞配置數據,配置數據的起始部分固定為FF FF FF FF AA 99 55 66,所以在傳輸數據過程中只需要檢索關鍵字,識別到配置數據起始關鍵字后將前面的數據剔除即可。
MCS格式文件為ASCII格式文件,文件內容可通過文本編輯器查看。該文件格式是在ISE軟件中通過BIT文件經位轉換及添加校驗信息等過程轉換生成。該文件格式可用于通過JTAG下載電纜對PROM的配置,也可用于固件自動升級后對固件文件的回讀校驗。
如果只考慮實現ARM及FPGA固件的自動升級功能,可將系統的硬件方案進行簡化,因為STM32F407微控制器提供以太網MAC層接口,也可通過上位機直接與該控制器通過網絡接口連接,簡化的硬件框圖如圖2所示。

圖2 簡化的系統硬件框圖
通常,FPGA固件的下載方式是通過板卡上預留的JTAG接口來實現的。應用ISE軟件及JTAG仿真器將由BIT文件轉換生成的MCS文件下載到FPGA配置的PROM中,系統重新啟動后FPGA控制器讀取外部PROM的文件,并將配置文件自動下載到FPGA的SARM中運行。
FPGA固件自動升級的配置方案及硬件連接如圖3所示,STM32控制器要為3個FPGA控制器傳遞升級固件,而實現過程是將STM32及3個PROM以菊花鏈的方式連接,按照JTAG軟件協議依次將固件下載到3個PROM中。系統重新啟動后,FPGA從PROM中分別讀取各自的配置文件,并加載到SRAM中實現各自的功能。
固件升級的功能在IAR for EWARM V6.4集成開發環境中完成,STM32和FPGA固件升級代碼都通過STM32平臺實現,STM32通過網絡接收上位機傳遞的固件升級代碼。FPGA固件升級的過程更加復雜,需要 STM32控制器按照JTAG協議將固件下載到FPGA外擴的PROM中。
4.1 STM32自動升級方案
STM32系統中除了要實現固件升級功能,還要完成板卡間通信、系統狀態監控等多項功能。為了實現多任務調度及網絡傳輸功能,需要在STM32系統中移植μC/OS-II系統及LwIP以太網協議棧。μC/OS-II是Micrium(現被Silicon Labs收購)公司的一款可裁剪、可移植、搶占式多任務嵌入式實時內核,廣泛應用于微控制器中。LwIP是瑞典計算機科學院開發的一個小型開源的TCP/IP協議棧,由于它能在保持TCP協議主要功能的前提下減少對RAM和存儲空間的占用,特別適合于硬件資源比較有限的MCU。操作系統的移植過程可以參考Micrium公司網站上基于STM32控制器的移植范例。

圖4 .bin固件文件的存儲映射方案
為了實現STM32固件自升級功能并提高系統的穩定性,需要將STM32的固件分成3個部分,分別為引導代碼、備份代碼及應用代碼。3部分代碼分別建立3個工程開發,最后將3個編譯生成的.bin文件通過VC++軟件合并為一個大小為256 KB的固件文件。如圖4所示,引導代碼存放的地址區間為0x00000~0x28000,是一個未移植操作系統的單循環任務,主要用于加載BSP文件并判斷系統的固件狀態,如果有新固件存放在外部Flash中,則從外部Flash將固件讀取到內部Flash中。
當引導程序通過讀取內部Flash標志位確認沒有新固件需要更新時,引導代碼將重映射的起始地址設置為應用代碼的起始地址,初始化用戶應用程序的堆棧指針后進行程序的重映射,程序會自動跳轉到應用程序中運行,重映射部分的代碼如下:
//判斷用戶固件起始地址是否映射到內部Flash地址
if (((*(_ _IO uint32_t*)App_base_address) & 0x2FFE0000 ) == 0x20000000){
JumpAddress = *(_ _IO uint32_t*) (App_base_address + 4);//App_base_address為應用代碼起始地址
Jump_To_Application = (pFunction) JumpAddress;
//初始化用戶應用代碼堆棧
_ _set_MSP(*(_ _IO uint32_t*) App_base_address);
Jump_To_Application(); //跳轉到應用程序
}
備份代碼存放在固件中的地址區間為0x28000~0x16800,它作為應用代碼的備份,只保留最基本的功能,當引導代碼檢測到上次固件升級失敗時,將加載備份代碼起始地址為重映射地址,并跳轉到備份代碼中運行,確保系統的基本功能能夠實現,防止因固件升級失敗導致板卡功能失效。
應用程序代碼存放的位置為0x16800~0x3FFFF,共166 KB,用于實現全部的用戶自定義應用程序,包括STM32和FPGA的固件自動升級任務。μC/OS-II系統提供了任務調度、任務管理、內存管理、任務間通信等基本功能,固件升級功能通過5個任務相互協調完成。這5個任務包括IP層任務、TCP層任務、網絡服務任務、FPGA升級任務、外部Flash讀寫驅動任務。
(1)IP層任務和TCP層任務
這兩個任務為TCP/IP協議棧的任務,負責Ethernet網絡數據傳輸,是以太網應用層和物理層之間銜接的橋梁。代碼主要來源于LwIP以太網協議棧,在此不進行詳細的設計說明,只給出協議棧工作流程圖。此協議棧對外的接口為標準的Socket接口函數,圖5為TCP/IP協議棧的流程示意圖。

圖5 TCP/IP協議棧流程圖
圖6為TCP/IP協議棧在應用中的層次關系圖。網絡協議棧允許多任務通信。應用程序和協議棧的通信通過消息郵箱完成。對于每一個通信任務都有一個專用結構體變量記錄任務中的信號量和消息隊列。在通信時,應用進程將消息放入到郵箱中,等待TCP進程來提取消息,TCP進程根據消息的類別進行不同的處理,處理完成后TCP進程發送消息到應用進程。

圖6 TCP/IP協議棧在應用中的層次關系圖
(2)網絡服務任務
該任務主要用于與上位機之間建立連接并實現數據傳輸。此任務建立網絡服務器,接收來自于上位機的連接、服務請求,并接收升級固件。升級固件包括STM32和FPGA固件兩種,當接收到升級STM32的請求后啟動外部Flash讀寫驅動任務,將接收到的升級數據保存到外部Flash中,當收到完整的升級數據后將升級標志置為1并存儲到特定的Flash地址。重新上電之后,引導代碼優先啟動,并檢查該標志位,如果為1,啟動升級流程,清空標志位。應用DMA將外部Flash中的固件讀出并拷貝到內部Flash中然后進行重映射,程序將跳轉到應用程序入口運行。此任務對外的接口為接收消息隊列和網絡層接口隊列(通過標準的Socket接口與TCP/IP進行通信)。圖7為網絡服務任務的流程圖。

圖7 網絡服務任務流程圖
(3)外部Flash讀寫驅動任務

圖8 Flash讀寫驅動任務流程圖
外部數據Flash讀寫任務主要負責將從網絡接收到的FPGA和STM32的升級文件通過SPI接口存儲到外擴的數據Flash中,并進行數據校驗。如果校驗失敗則上電后運行備份代碼,實現系統的基本功能。在任務中采用定時查詢的方式進行外部Flash的讀寫。任務啟動后首先初始化控制I/O,并檢測外部Flash狀態,如果狀態正常則進入等待接收數據狀態,否則發送錯誤信息。當通過接收消息隊列收到消息后,分別完成向外部Flash寫入數據和從Flash回讀校驗的工作,完成后將數據寫入成功信號發送給網絡服務任務。此任務對外的接口為接收消息隊列(用于接收其他任務的消息)和控制外部串行Flash的接口隊列。圖8為外部Flash讀寫任務的流程圖。
4.2 FPGA自動升級方案

圖9 FPGA升級任務流程圖
FPGA的固件是通過網絡服務任務接收而來的。網絡服務任務傳遞消息給外部Flash讀寫驅動任務,調用寫外部Flash函數將數據按頁寫入到外部Flash中并進行回讀校驗,隨后啟動FPGA升級任務。將按頁讀取的數據通過JTAG協議寫入到FPGA外接的PROM存儲器中。重新上電后,經過配置的FPGA會自動讀取PROM中的固件并運行。FPGA升級任務首先初始化I/O及JTAG接口,并申請用于保存外部Flash數據的緩存區,順序地讀取固件數據,通過異或校驗碼確定讀取數據的正確性,然后調用JTAG下載函數執行程序下載。JTAG函數中每次讀取指定字節的數據并按照JTAG協議下載到FPGA的存儲器中,通過寫入之后的回讀校驗來驗證寫入固件數據的正確性。當所有固件數據都正確寫入后向網絡服務任務返回升級成功信號,否則返回錯誤信息。FPGA升級任務再次進入等待狀態,等待任務啟動信號量的喚醒,圖9為FPGA升級任務流程圖。
在FPGA升級任務中,JTAGRun_for_16P()函數通過JTAG下載時序將讀出的固件升級數據下載到FPGA的PROM中,PROM的型號為XCF16P,函數中的關鍵子函數及實現方法如下:
(1)Detect( )
由圖3可知,STM32微控制器的JTAG與PROM是按照菊花鏈方式連接的,操作PROM之前需要先通過指令探測菊花鏈中PROM的數量,確定后續讀寫PROM的指令格式。JTAG TAP狀態機有6個穩定的狀態,其中Shift-IR和Shift-DR為兩個主要的穩態,分別用于傳遞指令和數據。探測器件數量應進入Shift-DR狀態,將32位的0xFFFF FFFF數據通過TDI接口傳遞給PROM1,隨后按時鐘周期循環發送數據到TDI端口,直到TDO接口中收到該數據,則PROM器件的數量為循環的次數減1。在循環了4次后,TDO端口收到0xFFFF FFFF數據,所以PROM數量為3個。
(2)Ispen( )
向有效器件發送ISPEN命令,設置器件進入ISP狀態,并進行Unlock操作,只有進入ISP狀態后,器件才可以進行擦除和寫入等其他操作。XSIR函數中的兩個參數分別表示指令編號及輸入指令后的等待時間;XSDR函數的4個參數分別表示要移入數據的長度、移入數據的起始地址、保存移出數據的地址及延時時間。
{
unsigned int command;
unsigned int ucTdo = 1;
GotoTapState( XTAPSTATE_RESET );
XSIR( SVF_ISPEN, 0 );
//ISPEN命令 command = 0xd0;
XSDR( 8, &command, &ucTdo, 100 );
XSIR( SVF_UNLOCK, 0 ); //解鎖
command = 0x3f;
XSDR( 24, &command, &ucTdo, 100 );
}
(3)Erase( )
器件進入ISP狀態后進行擦除操作,依次輸入擦除指令和地址,并通過調用Check_STATUS函數周期性查詢寄存器的狀態,判斷擦除是否結束。
{
unsigned int ucTdo;
unsigned int command = 0;
unsigned long int RunTimeTest;
RunTimeTest = 0;
XSIR( SVF_ERASER, 0 ); //擦除命令
command = 0x3f;
XSDR( 24, &command, &ucTdo, RunTimeTest );
}
(4)Write_row( )和Fvfy( )
寫入和回讀校驗是通過Write_row( )和Fvfy( )函數完成的,Flash讀取函數按行將STM32外部Flash中的數據讀取到緩存中,每行512字節。因為MCS文件是BIT文件經過位轉換而得到的,而實際PROM中的配置文件應該是MCS格式,所以從Flash讀取的數據需要將每個字節按位顛倒順序,再依次寫入PROM中。寫入和回讀的過程同樣按照先指令后數據的順序,循環將數據下載到PROM中存儲,如果回讀校驗失敗,則將升級失敗的結果傳遞給網絡服務任務,并通過網絡通信方式反饋給上位機。操作人員可以決定重新執行升級流程或檢查軟硬件故障。

[1] 高世皓.利用HEX文件實現TMS320F28335的程序升級方法[J].單片機與嵌入式系統應用,2017(7):13-18.
[2] 楊旭.基于微處理器的螺旋CT固件遠程升級的設計與實現[D].沈陽:東北大學,2009.
[3] 劉火良,楊森. STM32庫開發實戰指南[M].北京:機械工業出版社,2013.
[4] 徐文波,田耕.Xilinx FPGA開發實用教程[M].北京:清華大學出版社,2012.
[5] 程小艷.嵌入式STM32F107VCT6微處理器接口模塊開發及應用研究[D].合肥:合肥工業大學,2012.
宋宇寧(工程師),主要從事基于ARM架構的嵌入式系統軟硬件開發與設計工作。
RealizationofFirmwareAutomaticUpdatinginComplexSystemBasedonSTM32
SongYuning
(SIASUN Robot&Automation Co.,Ltd.,Shenyang 110168,China)
In the paper,a method of firmware automatic updating in complicated hardware system through STM32 microcontroller is proposed.The ARM architecture STM32 microcontroller firmware transmission,storage and automatic upgrade are achieved through Ethernet and SPI interface.Spartan-6 series FPGA of Xilinx firmware download and upgrade are achieved through the STM32 microcontroller and JTAG protocol.In the paper,the realization principle and development flow of the firmware automatic upgrade method are introduced in detail.Some source codes and program flow chart are also provided.By the actual product verification,the method greatly enhances the efficiency of on-site hardware updating and maintenance,saves the service costs,and improves the stability of the product effectively.
firmware automatic updating;STM32;microcontroller;Ethernet;FPGA
TP368.1
A
2017-08-21)