楊玉春,蘇燕辰,伍川輝,燕春光
(1.西南交通大學 機械工程學院,成都 610031;2.中車唐山機車車輛有限公司,唐山 063035)
近年來,高速列車集成了越來越多的電子設(shè)備,例如車載視頻監(jiān)控、故障診斷設(shè)備、失穩(wěn)平穩(wěn)監(jiān)控設(shè)備、弓網(wǎng)監(jiān)控設(shè)備等。當前電子設(shè)備軟件升級是通過以太網(wǎng)、CAN總線、串口等通信接口實現(xiàn)在線升級,同濟大學石盼等人提出基于以太網(wǎng)接口的 IAP(In Application Programming)遠程升級技術(shù)[1],該技術(shù)優(yōu)點是傳輸速度快;南京郵電大學王琦和李龍光等人提出基于CAN總線的程序在線升級技術(shù)[2-3];東南大學提出基于串口的應(yīng)用程序在線升級技術(shù)[4]。以上技術(shù)均是在線升級技術(shù),需要攜帶電腦和專用通信線纜,連接設(shè)備和電腦后在線完成設(shè)備升級,該類方式操作不夠便捷,且串口和CAN的實際數(shù)據(jù)傳輸速率相對較低。由于列車車載設(shè)備數(shù)量眾多、操作環(huán)境復雜、不便拆卸等原因,這種在線升級的方式對工作人員來說無疑是一件繁重的工作。本文以STM32F407為主控芯片,進行基于USB的列車車載設(shè)備軟件升級的技術(shù)研究,提出一種傳輸速率更快的,基于USB 2.0通信的離線升級技術(shù),利用便攜式U盤對多個車載電子設(shè)備進行軟件升級,工作人員只需攜帶裝有bin文件的U盤,插入對應(yīng)主機上,便可實現(xiàn)對整列車的同系列設(shè)備的軟件升級。
STM32F407芯片是32位低功耗、高性能的處理器,該處理器基于ARM Cottex–M4內(nèi)核,集成FPU和DSP指令,支持浮點運算,其CPU工作頻率達168 MHz,F(xiàn)lash為1 024 K,SRAM為192 K,具有豐富的資源(定時器、內(nèi)部存儲、CAN、485、USB、以太網(wǎng)、串口等)。該處理器使用新內(nèi)核的Thumb–2指令集,使設(shè)計人員可以把代碼容量降低45%,把應(yīng)用軟件所需內(nèi)存容量降低了近一半[5]。STM32F407內(nèi)部自帶USB OTG FS控制器和USB OTG HS控制器,支持高速HS(USB2.0,傳輸速率480 Mbps)、全速FS(USB1.1,傳輸速率12 Mbps)和低速(USB1.0,傳輸速率1.5 Mbps)傳輸。
USB是一種串行總線通信方式,具有速率高、支持熱插拔、性能可靠、價格低廉和易于擴展等特點[6]。(1)速率高,目前的USB 2.0標準支持傳輸速率達到480 Mbps,能很好地滿足大部分的接口需求;(2)支持熱插拔,即插即用;(3)易于擴展,通過USB集線器,1個USB主控制器上最多可以連接126個外設(shè);(4)性能可靠,USB系統(tǒng)通過規(guī)范的硬件設(shè)計和USB協(xié)議中完善的數(shù)據(jù)錯誤檢測機制來確保數(shù)據(jù)準確無誤地發(fā)送和接收[7]。
USB外接設(shè)備從插入主機到拔出的整個過程中,共有6種狀態(tài),包括:連接態(tài)、上電態(tài)、缺省態(tài)、地址態(tài)、配置態(tài)、掛起態(tài)[8],這個過程稱為枚舉過程。
當一個USB外接設(shè)備被掛接到總線上時,主機通過枚舉過程識別和管理新加入的設(shè)備,這個過程使得USB外接設(shè)備支持熱插拔[9]。圖1展示了枚舉過程的轉(zhuǎn)換流程及轉(zhuǎn)化條件,狀態(tài)切換的因素包括硬件電平變化和設(shè)備軟件或主機軟件的設(shè)置[10]。
圖1 外接設(shè)備枚舉轉(zhuǎn)換過程示意圖
(1)連接狀態(tài),USB外接設(shè)備通過USB接口連接主機或Hub,進而改變總線電平,總線由此判斷有新設(shè)備接入。
(2)上電狀態(tài),USB外接設(shè)備連接后,總線給其供電,但由于設(shè)備未被分配地址,尚不能進行通信,該狀態(tài)稱為供電狀態(tài)。
(3)缺省狀態(tài),USB外接設(shè)備插入接口等待100 ms,待供電穩(wěn)定后,主機給端口發(fā)送復位命令,完成寄存器復位后,給設(shè)備分配地址0,該地址為USB總線公共地址,稱為缺省地址。此時,USB外接設(shè)備可通過該地址與主機通信,完成設(shè)備配置。
(4)地址狀態(tài),主機通過缺省地址0與USB外接設(shè)備通信,獲取設(shè)備描述符、配置參數(shù)、配置通道,同時配一個總線地址,之后各種數(shù)據(jù)傳輸都是通過該地址。USB外接設(shè)備獲得唯一地址的狀態(tài)稱為地址狀態(tài)。
(5)配置狀態(tài),主機獲得設(shè)備描述符之后,開始配置USB外接設(shè)備,此時設(shè)備處于配置狀態(tài)。
(6)掛起狀態(tài),當總線無任何活動的時間達到3 ms,USB外接設(shè)備將自動切換為低功耗掛起狀態(tài),此時,USB接口處電流小于0.5 mA,USB接口保持其地址信息和配置信息,等待總線活動將其喚醒。
主機與USB外接設(shè)備通信是通過端點和管道來實現(xiàn)的,主機緩沖區(qū)和設(shè)備端點間的通信數(shù)據(jù)形成通信流。USB通信流如圖2所示。
(1)端點:USB外接設(shè)備端點是設(shè)備的標識。設(shè)備端點號有多個,設(shè)備地址只有一個。端點按種類分為輸入、輸出端點;按功能分為0端點和非0端點。
(2)管道:管道是主機存儲緩沖器與設(shè)備端點間進行數(shù)據(jù)傳輸?shù)耐ǖ繹11]。主機與設(shè)備0端點進行通信的管道稱為缺省管道。
很多車載監(jiān)控設(shè)備需進行高速數(shù)據(jù)傳輸,故選用USB OTG HS通信模式,外接PHY芯片。本文選用USB 3300芯片作為USB通信的物理芯片,該芯片兼容USB 2.0協(xié)議,傳輸速率最高達480 Mbps,采用并行接口與STM32F407連接,可實現(xiàn)數(shù)據(jù)快速交互;外接24 MHz晶振,將DP和DM引腳連接至USB–A型接口完成數(shù)據(jù)傳輸。USB電路設(shè)計如圖3所示。
圖2 USB通信流示意圖
圖3 USB電路設(shè)計圖
IAP技術(shù)將F1ash映射為System Memory和User Flash Memory 2個存儲體。當運行System Memory存儲體上的IAP程序時,可對User Flash Memory存儲體重新燒寫[12],這樣做是方便在使用一段時間后,通過預留的接口(USB、CAN、USART等)對產(chǎn)品進行升級。實現(xiàn)IAP時,需要設(shè)計2個程序,即IAP程序和App程序,IAP程序通過特定通信方式接收App程序,將App程序存儲到指定位置,實現(xiàn)程序更新;App程序是功能程序,用于實現(xiàn)設(shè)備的功能。
程序一般存放在STM32內(nèi)部Flash中,IAP程序從最低位置(0X08000000)開始存放,App程序通過USB接口讀入并存儲在IAP程序的后面。加載IAP程序后,程序運行流程如圖4所示。STM32F407控制器復位后,從0X08000004處取出IAP復位中斷向量的地址,如標號①所示,并跳轉(zhuǎn)到IAP復位中斷服務(wù)程序執(zhí)行;執(zhí)行完后,跳轉(zhuǎn)到0X08000004+N的位置執(zhí)行IAP中main函數(shù),如標號②所示;IAP中main函數(shù)讀取App更新標志,如標號③所示,并判斷是否需要升級,若需要升級,則讀取IAP升級程序,并存儲到Flash的0X08010000位置[13],如果不需要,則直接執(zhí)行App程序,如標號④所示;從0X08000004+N+M位置讀取App復位中斷向量的地址,并跳轉(zhuǎn)到對應(yīng)復位中斷服務(wù)程序執(zhí)行,之后跳轉(zhuǎn)到App main函數(shù)執(zhí)行用戶程序,如標號⑤所示[14]。在App main函數(shù)執(zhí)行過程中,如果接收到1個中斷請求,PC指針強制跳轉(zhuǎn)到0X08000004中斷向量表位置,如標號⑥所示,之后程序再根據(jù)App程序偏移量,跳轉(zhuǎn)到對應(yīng)中斷服務(wù)程序,如標號⑦所示[15]。中斷服務(wù)程序執(zhí)行結(jié)束后,返回到App main函數(shù)繼續(xù)執(zhí)行應(yīng)用程序,如標號⑧所示。
在車載設(shè)備的IAP設(shè)計過程中,采用USB接口進行通信。(1)執(zhí)行IAP程序中的USB驅(qū)動程序,初始化USB接口,并連接U盤;(2)掛載FAT32文件系統(tǒng),實現(xiàn)對U盤的讀寫操作,并檢測U盤中是否存在bin文件;(3)IAP程序通過USB接口讀取提前配置并存儲在U盤中的升級程序,將升級程序存儲到Flash的0X08010000位置,升級后IAP跳轉(zhuǎn)到App程序位置開始執(zhí)行新版App。
以上過程中,若存在U盤連接失敗、文件系統(tǒng)掛載失敗、bin文件讀取失敗或校驗不通過等情況,則視為升級失敗,執(zhí)行系統(tǒng)復位;若U盤中不存在bin文件,則會跳到Flash0x08010000位置繼續(xù)執(zhí)行舊版應(yīng)用程序。具體升級過程如圖5所示。
圖4 加載IAP后程序運行流程圖
底包程序采用Keil 5開發(fā)平臺搭建,Keil 5一般生成hex文件,但系統(tǒng)升級需使用bin文件。bin文件生成需3個步驟,包括:配置升級程序起始地址、配置中斷向量表偏移量、運行fromelf.exe。
4.2.1 升級程序起始地址設(shè)置方法
升級程序偏移地址設(shè)置過程為,打開Options for Target 配置軟件,點擊Target 選項卡,軟件界面如圖6所示,在該界面設(shè)置App程序起始地址為0X08010000,即偏移量為0X10000。STM32F4系列芯片內(nèi)部Flash大小為1 024 KB,留給App的存儲空間為0X08010000~0X08100000(960 KB);留給IAP的存儲空間為:0X08000000~0X0800FFFF(64 KB)。
圖5 車載設(shè)備軟件升級流程圖
圖6 升級程序起始地址設(shè)置界面示意圖
4.2.2 中斷向量表偏移量設(shè)置方法
(1)中斷向量表設(shè)置函數(shù)
NVIC_SetVectorTable(uint32 NVIC_VecTab,uint32 Offset)
(2)IAP中斷向量表設(shè)置
NVIC_SetVectorTable(0x08000000,0x00)
//IAP偏移量為0
(3)App中斷向量表設(shè)置
(1)軟件升級完成時,在從IAP程序跳轉(zhuǎn)到App程序之前,必須復位嵌套向量中斷控制器(NVIC,Nested Vectored Interrupt Controller ),防止跳轉(zhuǎn)過程中出現(xiàn)中斷,導致應(yīng)用程序運行失敗。
(2)在App程序初始化時需正確設(shè)置NVIC向量表,將NVIC向量表映射到App程序起始地址;
(3)實現(xiàn)IAP程序過程中,必須正確處理計時器的清零操作,特別是在bin文件讀和寫、Flash擦除和編程過程中,要充分考慮計時器清零時間,在程序關(guān)鍵位置清零,一般在while循環(huán)函數(shù)中進行計時器清零操作。
本文詳細分析了IAP和USB通信協(xié)議的技術(shù)要點,實現(xiàn)了基于USB通信的車載設(shè)備軟件升級程序,通過裝有bin文件的U盤,就可完成整列車同系列產(chǎn)品的軟件升級任務(wù),顯著降低了工作量。自帶USB協(xié)議接口的電子設(shè)備使用該技術(shù)不需要增加額外成本,只需通過軟件的更改,就可實現(xiàn)產(chǎn)品的升級和功能的修復。目前,該技術(shù)已應(yīng)用于走行部故障診斷、平穩(wěn)失穩(wěn)在線監(jiān)測等車載設(shè)備的系統(tǒng)升級。未來可探索該技術(shù)在智能家居、消費電子等更廣泛的物聯(lián)網(wǎng)應(yīng)用場所的應(yīng)用。