(沈陽新松機器人自動化股份有限公司,沈陽 110168)
STM32在復(fù)雜系統(tǒng)中實現(xiàn)固件自動升級的方法
宋宇寧
(沈陽新松機器人自動化股份有限公司,沈陽 110168)
提供了一種應(yīng)用STM32微控制器實現(xiàn)在復(fù)雜的硬件系統(tǒng)中完成固件自動升級的方法。通過以太網(wǎng)和SPI接口實現(xiàn)了ARM架構(gòu)STM32微控制器固件的傳輸、存儲和自動升級;通過JTAG接口協(xié)議實現(xiàn)了STM32微控制器對Xilinx公司Spartan-6系列FPGA固件的下載和升級。文中詳細介紹了固件自動升級方法的實現(xiàn)原理和開發(fā)流程,并提供了部分源碼及程序流程圖。經(jīng)實際產(chǎn)品驗證,該方法極大提升了現(xiàn)場升級維護硬件的效率,節(jié)約了服務(wù)成本,提高了產(chǎn)品的穩(wěn)定性。
固件自動升級;STM32;微控制器;以太網(wǎng);FPGA
伴隨著市場上工業(yè)自動化及大型醫(yī)療器械產(chǎn)品的競爭加劇,產(chǎn)品的毛利潤不斷壓縮,降低產(chǎn)品的服務(wù)成本、提升產(chǎn)品的服務(wù)收益已經(jīng)成為企業(yè)利潤成長的重要形式。作為硬件升級與維護不可或缺的環(huán)節(jié),板卡的固件升級在工程設(shè)計及調(diào)試階段通常是應(yīng)用仿真器連接板卡來進行。但在產(chǎn)品發(fā)布及售出之后,應(yīng)用該方法會帶來很多問題:有些產(chǎn)品需要拆裝外殼,有些則需要在復(fù)雜的系統(tǒng)中手動連接下載電纜,除了延長設(shè)備維護的時間,提升服務(wù)成本外還會帶來額外的安全風(fēng)險。因此,實現(xiàn)固件的自動升級成為每個大型的工業(yè)及醫(yī)療產(chǎn)品都必須考慮的服務(wù)功能。
實現(xiàn)產(chǎn)品固件的自動升級需要依賴系統(tǒng)中的控制器,本文提出了一種基于ARM微控制器實現(xiàn)自身的固件以及為FPGA固件自動升級的方法,通過上位機及以太網(wǎng)傳輸固件,通過JTAG協(xié)議將FPGA固件下載到FPGA外擴的PROM中,整個過程不需要拆裝外殼及連接硬件仿真器,操作簡單且提升了效率。
大型的工業(yè)及醫(yī)療器械硬件系統(tǒng)實現(xiàn)的功能較多,結(jié)構(gòu)比較復(fù)雜,通常會采用x86、ARM以及FPGA多種硬件平臺實現(xiàn)系統(tǒng)功能,典型的系統(tǒng)硬件框圖如圖1所示。
圖1 系統(tǒng)硬件框圖
其中,基于x86平臺的PC104工控機通過有線以太網(wǎng)或者WiFi連接的方式與控制臺計算機連接,并通過集成的無線路由器與控制臺計算機及各ARM控制器板組成內(nèi)部局域網(wǎng)。PC104用于控制臺控制命令的轉(zhuǎn)發(fā)、各板卡狀態(tài)的反饋以及升級固件的傳輸?shù)裙δ?。ARM控制器板卡采用STM32F407微控制器,主要用于實現(xiàn)板卡間協(xié)議通信,復(fù)雜算法的實現(xiàn)及固件自動升級功能。FPGA板卡采用Xilinx公司Spartan-6系列XC6SLX45T。由于FPGA內(nèi)部沒有大容量Flash存儲器,需要外擴PROM存儲固件程序。在設(shè)置配置方案后,板卡上電時將PROM中的固件讀出并加載到FPGA的SRAM中運行,配套PROM的型號為Xilinx XCF16P。FPGA板卡主要用于實現(xiàn)高速信號數(shù)據(jù)傳輸及控制命令的并發(fā)執(zhí)行。ARM控制器外擴的Flash用于存放ARM控制器和FPGA板卡的固件。ARM控制器和FPGA板卡之間通過串行及并行接口進行數(shù)據(jù)通信,并通過JTAG接口將FPGA外接的PROM以菊花鏈的方式連接,按照J(rèn)TAG的協(xié)議規(guī)范將固件依次下載到菊花鏈上的各PROM中。
2.1 STM32系列MCU的固件文件介紹
STM32系列的MCU(微控制器單元)可應(yīng)用IAR for EWARM V6.40編譯環(huán)境進行開發(fā)設(shè)計,程序編譯后默認(rèn)生成的固件格式后綴為.out,可通過JTAG仿真器及修改編譯環(huán)境的配置選項,直接將程序下載到MCU的內(nèi)部Flash中運行,也可下載到內(nèi)部SRAM中進行在線調(diào)試。
如果采用自動升級方式,建議通過開發(fā)編譯環(huán)境的配置選項輸出一個*.bin文件,即二進制格式的固件文件。該文件不僅支持STM32固件的傳輸和自動升級,還可通過ST公司提供的STM32系列固件下載工裝軟件ST-link utility及ST-Link V2仿真器,將固件下載到STM32 MCU的內(nèi)部Flash中運行。
圖3 菊花鏈的連接及FPGA配置方式
ISE軟件是Xilinx公司推出的FPGA及CPLD集成開發(fā)環(huán)境,該軟件環(huán)境下編譯生成的FPGA固件格式通常包括.bit和.mcs格式兩種。編譯器默認(rèn)生成.bit格式的固件文件,可通過JTAG仿真器將文件下載到內(nèi)部SRAM中,也可應(yīng)用該文件實現(xiàn)FPGA固件的自動升級。BIT文件的組織格式通常為15字節(jié)的文件開始標(biāo)記、文件名記錄、文件創(chuàng)建時間、配置數(shù)據(jù)開始標(biāo)記及配置數(shù)據(jù),該文件可通過UltraEdit軟件查看。在通過網(wǎng)絡(luò)傳輸FPGA固件的過程中,通常只需要傳遞配置數(shù)據(jù),配置數(shù)據(jù)的起始部分固定為FF FF FF FF AA 99 55 66,所以在傳輸數(shù)據(jù)過程中只需要檢索關(guān)鍵字,識別到配置數(shù)據(jù)起始關(guān)鍵字后將前面的數(shù)據(jù)剔除即可。
MCS格式文件為ASCII格式文件,文件內(nèi)容可通過文本編輯器查看。該文件格式是在ISE軟件中通過BIT文件經(jīng)位轉(zhuǎn)換及添加校驗信息等過程轉(zhuǎn)換生成。該文件格式可用于通過JTAG下載電纜對PROM的配置,也可用于固件自動升級后對固件文件的回讀校驗。
如果只考慮實現(xiàn)ARM及FPGA固件的自動升級功能,可將系統(tǒng)的硬件方案進行簡化,因為STM32F407微控制器提供以太網(wǎng)MAC層接口,也可通過上位機直接與該控制器通過網(wǎng)絡(luò)接口連接,簡化的硬件框圖如圖2所示。
圖2 簡化的系統(tǒng)硬件框圖
通常,F(xiàn)PGA固件的下載方式是通過板卡上預(yù)留的JTAG接口來實現(xiàn)的。應(yīng)用ISE軟件及JTAG仿真器將由BIT文件轉(zhuǎn)換生成的MCS文件下載到FPGA配置的PROM中,系統(tǒng)重新啟動后FPGA控制器讀取外部PROM的文件,并將配置文件自動下載到FPGA的SARM中運行。
FPGA固件自動升級的配置方案及硬件連接如圖3所示,STM32控制器要為3個FPGA控制器傳遞升級固件,而實現(xiàn)過程是將STM32及3個PROM以菊花鏈的方式連接,按照J(rèn)TAG軟件協(xié)議依次將固件下載到3個PROM中。系統(tǒng)重新啟動后,FPGA從PROM中分別讀取各自的配置文件,并加載到SRAM中實現(xiàn)各自的功能。
固件升級的功能在IAR for EWARM V6.4集成開發(fā)環(huán)境中完成,STM32和FPGA固件升級代碼都通過STM32平臺實現(xiàn),STM32通過網(wǎng)絡(luò)接收上位機傳遞的固件升級代碼。FPGA固件升級的過程更加復(fù)雜,需要 STM32控制器按照J(rèn)TAG協(xié)議將固件下載到FPGA外擴的PROM中。
4.1 STM32自動升級方案
STM32系統(tǒng)中除了要實現(xiàn)固件升級功能,還要完成板卡間通信、系統(tǒng)狀態(tài)監(jiān)控等多項功能。為了實現(xiàn)多任務(wù)調(diào)度及網(wǎng)絡(luò)傳輸功能,需要在STM32系統(tǒng)中移植μC/OS-II系統(tǒng)及LwIP以太網(wǎng)協(xié)議棧。μC/OS-II是Micrium(現(xiàn)被Silicon Labs收購)公司的一款可裁剪、可移植、搶占式多任務(wù)嵌入式實時內(nèi)核,廣泛應(yīng)用于微控制器中。LwIP是瑞典計算機科學(xué)院開發(fā)的一個小型開源的TCP/IP協(xié)議棧,由于它能在保持TCP協(xié)議主要功能的前提下減少對RAM和存儲空間的占用,特別適合于硬件資源比較有限的MCU。操作系統(tǒng)的移植過程可以參考Micrium公司網(wǎng)站上基于STM32控制器的移植范例。
圖4 .bin固件文件的存儲映射方案
為了實現(xiàn)STM32固件自升級功能并提高系統(tǒng)的穩(wěn)定性,需要將STM32的固件分成3個部分,分別為引導(dǎo)代碼、備份代碼及應(yīng)用代碼。3部分代碼分別建立3個工程開發(fā),最后將3個編譯生成的.bin文件通過VC++軟件合并為一個大小為256 KB的固件文件。如圖4所示,引導(dǎo)代碼存放的地址區(qū)間為0x00000~0x28000,是一個未移植操作系統(tǒng)的單循環(huán)任務(wù),主要用于加載BSP文件并判斷系統(tǒng)的固件狀態(tài),如果有新固件存放在外部Flash中,則從外部Flash將固件讀取到內(nèi)部Flash中。
當(dāng)引導(dǎo)程序通過讀取內(nèi)部Flash標(biāo)志位確認(rèn)沒有新固件需要更新時,引導(dǎo)代碼將重映射的起始地址設(shè)置為應(yīng)用代碼的起始地址,初始化用戶應(yīng)用程序的堆棧指針后進行程序的重映射,程序會自動跳轉(zhuǎn)到應(yīng)用程序中運行,重映射部分的代碼如下:
//判斷用戶固件起始地址是否映射到內(nèi)部Flash地址
if (((*(_ _IO uint32_t*)App_base_address) & 0x2FFE0000 ) == 0x20000000){
JumpAddress = *(_ _IO uint32_t*) (App_base_address + 4);//App_base_address為應(yīng)用代碼起始地址
Jump_To_Application = (pFunction) JumpAddress;
//初始化用戶應(yīng)用代碼堆棧
_ _set_MSP(*(_ _IO uint32_t*) App_base_address);
Jump_To_Application(); //跳轉(zhuǎn)到應(yīng)用程序
}
備份代碼存放在固件中的地址區(qū)間為0x28000~0x16800,它作為應(yīng)用代碼的備份,只保留最基本的功能,當(dāng)引導(dǎo)代碼檢測到上次固件升級失敗時,將加載備份代碼起始地址為重映射地址,并跳轉(zhuǎn)到備份代碼中運行,確保系統(tǒng)的基本功能能夠?qū)崿F(xiàn),防止因固件升級失敗導(dǎo)致板卡功能失效。
應(yīng)用程序代碼存放的位置為0x16800~0x3FFFF,共166 KB,用于實現(xiàn)全部的用戶自定義應(yīng)用程序,包括STM32和FPGA的固件自動升級任務(wù)。μC/OS-II系統(tǒng)提供了任務(wù)調(diào)度、任務(wù)管理、內(nèi)存管理、任務(wù)間通信等基本功能,固件升級功能通過5個任務(wù)相互協(xié)調(diào)完成。這5個任務(wù)包括IP層任務(wù)、TCP層任務(wù)、網(wǎng)絡(luò)服務(wù)任務(wù)、FPGA升級任務(wù)、外部Flash讀寫驅(qū)動任務(wù)。
(1)IP層任務(wù)和TCP層任務(wù)
這兩個任務(wù)為TCP/IP協(xié)議棧的任務(wù),負(fù)責(zé)Ethernet網(wǎng)絡(luò)數(shù)據(jù)傳輸,是以太網(wǎng)應(yīng)用層和物理層之間銜接的橋梁。代碼主要來源于LwIP以太網(wǎng)協(xié)議棧,在此不進行詳細的設(shè)計說明,只給出協(xié)議棧工作流程圖。此協(xié)議棧對外的接口為標(biāo)準(zhǔn)的Socket接口函數(shù),圖5為TCP/IP協(xié)議棧的流程示意圖。
圖5 TCP/IP協(xié)議棧流程圖
圖6為TCP/IP協(xié)議棧在應(yīng)用中的層次關(guān)系圖。網(wǎng)絡(luò)協(xié)議棧允許多任務(wù)通信。應(yīng)用程序和協(xié)議棧的通信通過消息郵箱完成。對于每一個通信任務(wù)都有一個專用結(jié)構(gòu)體變量記錄任務(wù)中的信號量和消息隊列。在通信時,應(yīng)用進程將消息放入到郵箱中,等待TCP進程來提取消息,TCP進程根據(jù)消息的類別進行不同的處理,處理完成后TCP進程發(fā)送消息到應(yīng)用進程。
圖6 TCP/IP協(xié)議棧在應(yīng)用中的層次關(guān)系圖
(2)網(wǎng)絡(luò)服務(wù)任務(wù)
該任務(wù)主要用于與上位機之間建立連接并實現(xiàn)數(shù)據(jù)傳輸。此任務(wù)建立網(wǎng)絡(luò)服務(wù)器,接收來自于上位機的連接、服務(wù)請求,并接收升級固件。升級固件包括STM32和FPGA固件兩種,當(dāng)接收到升級STM32的請求后啟動外部Flash讀寫驅(qū)動任務(wù),將接收到的升級數(shù)據(jù)保存到外部Flash中,當(dāng)收到完整的升級數(shù)據(jù)后將升級標(biāo)志置為1并存儲到特定的Flash地址。重新上電之后,引導(dǎo)代碼優(yōu)先啟動,并檢查該標(biāo)志位,如果為1,啟動升級流程,清空標(biāo)志位。應(yīng)用DMA將外部Flash中的固件讀出并拷貝到內(nèi)部Flash中然后進行重映射,程序?qū)⑻D(zhuǎn)到應(yīng)用程序入口運行。此任務(wù)對外的接口為接收消息隊列和網(wǎng)絡(luò)層接口隊列(通過標(biāo)準(zhǔn)的Socket接口與TCP/IP進行通信)。圖7為網(wǎng)絡(luò)服務(wù)任務(wù)的流程圖。
圖7 網(wǎng)絡(luò)服務(wù)任務(wù)流程圖
(3)外部Flash讀寫驅(qū)動任務(wù)
圖8 Flash讀寫驅(qū)動任務(wù)流程圖
外部數(shù)據(jù)Flash讀寫任務(wù)主要負(fù)責(zé)將從網(wǎng)絡(luò)接收到的FPGA和STM32的升級文件通過SPI接口存儲到外擴的數(shù)據(jù)Flash中,并進行數(shù)據(jù)校驗。如果校驗失敗則上電后運行備份代碼,實現(xiàn)系統(tǒng)的基本功能。在任務(wù)中采用定時查詢的方式進行外部Flash的讀寫。任務(wù)啟動后首先初始化控制I/O,并檢測外部Flash狀態(tài),如果狀態(tài)正常則進入等待接收數(shù)據(jù)狀態(tài),否則發(fā)送錯誤信息。當(dāng)通過接收消息隊列收到消息后,分別完成向外部Flash寫入數(shù)據(jù)和從Flash回讀校驗的工作,完成后將數(shù)據(jù)寫入成功信號發(fā)送給網(wǎng)絡(luò)服務(wù)任務(wù)。此任務(wù)對外的接口為接收消息隊列(用于接收其他任務(wù)的消息)和控制外部串行Flash的接口隊列。圖8為外部Flash讀寫任務(wù)的流程圖。
4.2 FPGA自動升級方案
圖9 FPGA升級任務(wù)流程圖
FPGA的固件是通過網(wǎng)絡(luò)服務(wù)任務(wù)接收而來的。網(wǎng)絡(luò)服務(wù)任務(wù)傳遞消息給外部Flash讀寫驅(qū)動任務(wù),調(diào)用寫外部Flash函數(shù)將數(shù)據(jù)按頁寫入到外部Flash中并進行回讀校驗,隨后啟動FPGA升級任務(wù)。將按頁讀取的數(shù)據(jù)通過JTAG協(xié)議寫入到FPGA外接的PROM存儲器中。重新上電后,經(jīng)過配置的FPGA會自動讀取PROM中的固件并運行。FPGA升級任務(wù)首先初始化I/O及JTAG接口,并申請用于保存外部Flash數(shù)據(jù)的緩存區(qū),順序地讀取固件數(shù)據(jù),通過異或校驗碼確定讀取數(shù)據(jù)的正確性,然后調(diào)用JTAG下載函數(shù)執(zhí)行程序下載。JTAG函數(shù)中每次讀取指定字節(jié)的數(shù)據(jù)并按照J(rèn)TAG協(xié)議下載到FPGA的存儲器中,通過寫入之后的回讀校驗來驗證寫入固件數(shù)據(jù)的正確性。當(dāng)所有固件數(shù)據(jù)都正確寫入后向網(wǎng)絡(luò)服務(wù)任務(wù)返回升級成功信號,否則返回錯誤信息。FPGA升級任務(wù)再次進入等待狀態(tài),等待任務(wù)啟動信號量的喚醒,圖9為FPGA升級任務(wù)流程圖。
在FPGA升級任務(wù)中,JTAGRun_for_16P()函數(shù)通過JTAG下載時序?qū)⒆x出的固件升級數(shù)據(jù)下載到FPGA的PROM中,PROM的型號為XCF16P,函數(shù)中的關(guān)鍵子函數(shù)及實現(xiàn)方法如下:
(1)Detect( )
由圖3可知,STM32微控制器的JTAG與PROM是按照菊花鏈方式連接的,操作PROM之前需要先通過指令探測菊花鏈中PROM的數(shù)量,確定后續(xù)讀寫PROM的指令格式。JTAG TAP狀態(tài)機有6個穩(wěn)定的狀態(tài),其中Shift-IR和Shift-DR為兩個主要的穩(wěn)態(tài),分別用于傳遞指令和數(shù)據(jù)。探測器件數(shù)量應(yīng)進入Shift-DR狀態(tài),將32位的0xFFFF FFFF數(shù)據(jù)通過TDI接口傳遞給PROM1,隨后按時鐘周期循環(huán)發(fā)送數(shù)據(jù)到TDI端口,直到TDO接口中收到該數(shù)據(jù),則PROM器件的數(shù)量為循環(huán)的次數(shù)減1。在循環(huán)了4次后,TDO端口收到0xFFFF FFFF數(shù)據(jù),所以PROM數(shù)量為3個。
(2)Ispen( )
向有效器件發(fā)送ISPEN命令,設(shè)置器件進入ISP狀態(tài),并進行Unlock操作,只有進入ISP狀態(tài)后,器件才可以進行擦除和寫入等其他操作。XSIR函數(shù)中的兩個參數(shù)分別表示指令編號及輸入指令后的等待時間;XSDR函數(shù)的4個參數(shù)分別表示要移入數(shù)據(jù)的長度、移入數(shù)據(jù)的起始地址、保存移出數(shù)據(jù)的地址及延時時間。
{
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狀態(tài)后進行擦除操作,依次輸入擦除指令和地址,并通過調(diào)用Check_STATUS函數(shù)周期性查詢寄存器的狀態(tài),判斷擦除是否結(jié)束。
{
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( )函數(shù)完成的,F(xiàn)lash讀取函數(shù)按行將STM32外部Flash中的數(shù)據(jù)讀取到緩存中,每行512字節(jié)。因為MCS文件是BIT文件經(jīng)過位轉(zhuǎn)換而得到的,而實際PROM中的配置文件應(yīng)該是MCS格式,所以從Flash讀取的數(shù)據(jù)需要將每個字節(jié)按位顛倒順序,再依次寫入PROM中。寫入和回讀的過程同樣按照先指令后數(shù)據(jù)的順序,循環(huán)將數(shù)據(jù)下載到PROM中存儲,如果回讀校驗失敗,則將升級失敗的結(jié)果傳遞給網(wǎng)絡(luò)服務(wù)任務(wù),并通過網(wǎng)絡(luò)通信方式反饋給上位機。操作人員可以決定重新執(zhí)行升級流程或檢查軟硬件故障。
[1] 高世皓.利用HEX文件實現(xiàn)TMS320F28335的程序升級方法[J].單片機與嵌入式系統(tǒng)應(yīng)用,2017(7):13-18.
[2] 楊旭.基于微處理器的螺旋CT固件遠程升級的設(shè)計與實現(xiàn)[D].沈陽:東北大學(xué),2009.
[3] 劉火良,楊森. STM32庫開發(fā)實戰(zhàn)指南[M].北京:機械工業(yè)出版社,2013.
[4] 徐文波,田耕.Xilinx FPGA開發(fā)實用教程[M].北京:清華大學(xué)出版社,2012.
[5] 程小艷.嵌入式STM32F107VCT6微處理器接口模塊開發(fā)及應(yīng)用研究[D].合肥:合肥工業(yè)大學(xué),2012.
宋宇寧(工程師),主要從事基于ARM架構(gòu)的嵌入式系統(tǒng)軟硬件開發(fā)與設(shè)計工作。
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)