樂志國, 金啟前
(1.同濟大學(xué),上海 201804;2.吉利汽車研究院,浙江 杭州 311228)
在整車控制器(簡稱VCU)開發(fā)過程中需要多次將應(yīng)用程序燒寫到芯片中.傳統(tǒng)的燒寫方法一般是利用芯片專用下載器通過BDM調(diào)試接口下載程序,該方法不僅下載速度慢,而且給后期整車控制器的調(diào)試和維護都帶來極大不便.因為無論前期開發(fā)多么完善,寫出來的程序都不可避免會存在一定的bug.對于電動汽車來說,當車輛已投入使用,如何方便快捷的升級主程序,對已知的問題進行改善是急需解決的一個問題.車載CAN總線能很好滿足ECU節(jié)點升級的需求,可通過CAN網(wǎng)絡(luò)作為通信介質(zhì)開發(fā)BootLoader解決這一問題[1].BootLoaer為主程序運行之前運行的一段程序,主要完成應(yīng)用程序的升級更新.基于CAN總線的BootLoader需要在CAN協(xié)議的基礎(chǔ)上實現(xiàn)一個數(shù)據(jù)傳輸和命令執(zhí)行的協(xié)議.本文采用自定義數(shù)據(jù)傳輸和命令執(zhí)行的協(xié)議,設(shè)計實現(xiàn)了整車控制器BootLoader功能.
設(shè)備上電復(fù)位后,立即執(zhí)行BootLoader代碼.Bootloader開始運行后,初始化CPU硬件設(shè)備,設(shè)置系統(tǒng)所需要的環(huán)境變量,并且最后進入C代碼的main函數(shù)入口,啟動內(nèi)核.一般BootLoader會跳轉(zhuǎn)到主程序運行,當檢測到需要燒寫程序時,Boot-Loader才會繼續(xù)運行.在技術(shù)層面上說,Bootloader的啟動過程可以是單階段,也可以是多階段.通常地,多階段有助于實現(xiàn)更好的可移植特性以及更多復(fù)雜函數(shù)[2].而在芯片CPU啟動的BootLoader大多數(shù)分兩個階段完成.首先是外圍硬件設(shè)備的初始化,如對CPU功能模塊、串口、看門狗、時鐘 等;其次是內(nèi)部硬件設(shè)備的初始化,即相關(guān)寄存器的初始化,設(shè)置內(nèi)核的啟動參數(shù).初始化完成后進入通信任務(wù)循環(huán),等待接收命令.如循環(huán)等待超時,則自動跳轉(zhuǎn)的主程序運行[3].不同的芯片MCU實現(xiàn)Boot-Loader方法各不相同,但是實現(xiàn)思路上基本一致.
上位機端的BootLoader主要用于為整車控制器讀取并下載升級程序代碼,即S19文件.整車控制器采用的主芯片為飛思卡爾16位芯片MC9S12XDP512,通過該芯片的集成開發(fā)環(huán)境CodeWarrior對應(yīng)用程序編譯后,即可生成芯片的下載文件S19文件.S19文件為飛思卡爾推薦使用的標準文件傳送格式,是一段直接燒寫進芯片的ASCII碼.文件中每行最多包含78個字節(jié),包括類型、計數(shù)、地址、數(shù)據(jù)及校驗和[4].
BootLoader上位機界面是基于Visual C++6開發(fā),采取多線程機制實現(xiàn).提供人機交互功能、CAN通信功能、S19文件讀取功能以及數(shù)據(jù)處理功能.相應(yīng)的模塊構(gòu)成如下:
(1)人機交互模塊:人機交互主要包括人機界面和中央控制.通過人機界面,操作人員可以更便捷地了解BootLoader功能實時運行情況;中央控制負責(zé)通信功能的開啟關(guān)閉、文件的讀取解析以及程序下載過程中系統(tǒng)狀態(tài)的監(jiān)控.
(2)CAN通信模塊:通過使用整車控制器現(xiàn)有的CAN接口,上位機把CAN總線作為數(shù)據(jù)傳輸?shù)慕橘|(zhì),按照既定的CAN協(xié)議實現(xiàn)上位機端與整車控制器端的握手、應(yīng)答、數(shù)據(jù)傳輸、校驗以及模式控制等功能.
(3)S19文件解析模塊:S19文件具有體積小、攜帶方便、格式易于分析的有點.上位機S19文件解析模塊主要包括S19文件的讀取程序、解釋程序、發(fā)送報文生成程序和通信程序.
(4)數(shù)據(jù)處理模塊:為保證CAN通信的正常,數(shù)據(jù)傳輸?shù)挠行?,上位機會針對讀取的S19文件數(shù)據(jù)、生成的報文數(shù)據(jù)以及接收到的整車控制器端發(fā)送的數(shù)據(jù)進行監(jiān)控校驗處理,并將處理結(jié)果實時顯示在人機界面,方便操作人員采取有效的動作.
上位機圖形界面如圖1所示.
圖1 上位機圖形界面
由于PC機上沒有CAN控制器,上位機CAN通信選用周立功CAN卡實現(xiàn),周立功CAN接口卡提供了CAN驅(qū)動所需的動態(tài)鏈接庫.上位機啟動CAN,打開CAN口后,即自動激活S19文件讀取功能,操作人員手動選取被讀取文件的路徑.上位機將S19文件的所有數(shù)據(jù)讀進來,存放的預(yù)先分配的內(nèi)存中,按照記錄地址及記錄長度將其分成連續(xù)的字節(jié)塊,每塊再分為512 Byte的連續(xù)段.根據(jù)自定義CAN協(xié)議將S19文件的一行記錄(地址:連續(xù)段的首地址,數(shù)據(jù),校驗和等)拆分為若干個小的數(shù)據(jù)包,然后使用單個CAN的數(shù)據(jù)幀對其逐一傳送.
當S19文件內(nèi)容按照既定格式生成報文,即可向整車控制器發(fā)送握手信號請求升級應(yīng)用程序,若整車控制器工作正常則發(fā)送相應(yīng)的應(yīng)答信號允許下載程序.數(shù)據(jù)的傳送由CAN通信命令序列處理機制實現(xiàn).根據(jù)不同的處理序列,發(fā)送數(shù)據(jù)封裝在CAN消息的數(shù)據(jù)幀中,通過周立功控制器驅(qū)動接口程序,將升級后的應(yīng)用程序由上位機經(jīng)CAN接口卡發(fā)送給整車控制器.上位機端發(fā)送流程如圖2所示.數(shù)據(jù)傳輸時,整車控制器反饋信息并顯示數(shù)據(jù)校驗結(jié)果、寫入情況等功能.
圖2 上位機BootLoader發(fā)送流程
為防止其他人員通過非正常途徑下載、修改整車控制器應(yīng)用程序,本文開發(fā)一套自定義的數(shù)據(jù)通信下載協(xié)議.具體規(guī)定了上位機與整車控制器之間如何握手、應(yīng)答、數(shù)據(jù)的發(fā)送與接收,以及CAN報文校驗的機制.同時,在數(shù)據(jù)下載之前,要求驗證操作人員的身份.本文簡單實現(xiàn)了驗證碼解析功能,將整車控制器返回的編碼值作為偽碼.當連接時,上位機端通過發(fā)送編碼獲取命令得到整車控制器反饋的偽碼,經(jīng)內(nèi)部解析計算出正確的驗證碼后把它傳送給整車控制器.如果驗證碼正確,則授權(quán)升級應(yīng)用程序.
圖3 主程序流程框圖
通常,基于嵌入式的BootLoader開發(fā)需要依賴具體的硬件實現(xiàn),但是針對某一架構(gòu)的系列芯片,可以實現(xiàn)一定程度上的通用.飛思卡爾16位基于HCS12內(nèi)核的系列芯片在CPU上電后總是從地址0xFFFE處取第一條指令,可以將BootLoader放在此處使其成為CPU上電后執(zhí)行的第一條指令.本文所使用的飛思卡爾芯片自帶CAN通信模塊.整車控制器端BootLoader功能主要分為3個模塊:主程序模塊,CAN通信模塊和Flash數(shù)據(jù)擦寫模塊.
整車控制器上電復(fù)位后,進入BootLoader程序入口地址,在完成上電初始化后,即等待上位機發(fā)送的握手信號.在等待500ms后若沒收到上位機信號,系統(tǒng)判別不進行應(yīng)用程序加載,退出Boot-Loader功能,跳轉(zhuǎn)到應(yīng)用程序入口地址處,執(zhí)行應(yīng)用程序.若系統(tǒng)收到上位機握手信號,則有可加載的應(yīng)用程序代碼,BootLoader向上位機發(fā)送應(yīng)答信號,同時擦除芯片用于存儲應(yīng)用程序代碼部分的Flash,等待上位機數(shù)據(jù)報文的到來.整車控制器接收到上位機發(fā)送來得數(shù)據(jù)后,按照既定的協(xié)議對每個數(shù)據(jù)包解析,每完成一行數(shù)據(jù)的接收,即進行一次數(shù)據(jù)的校驗,當確認校驗正確,調(diào)用Flash編程函數(shù)將通過校驗的數(shù)據(jù)按照給定的地址寫入到Flash中,并將校驗和擦寫的結(jié)果反饋給上位機.數(shù)據(jù)寫入完成,重新執(zhí)行上電過程,芯片復(fù)位,系統(tǒng)跳轉(zhuǎn)到整車控制器應(yīng)用程序執(zhí)行.主程序流程如圖3所示.
圖4 MSCAN初始化流程
圖5 MSCAN發(fā)送流程
通信模塊負責(zé)與BootLoader上位機的通信,分為CAN控制器初始化、CAN接收和CAN發(fā)送3部分.用于實現(xiàn)數(shù)據(jù)的收發(fā)和CAN報文的解包.
3.2.1 MSCAN 初始化
初始化CAN控制器模塊,需要對MSCAN模塊寄存器進行配置.寄存器的配置在MSCAN休眠模式下完成,寄存器配置完后,通過MSCAN的寄存器使能位使能CAN,并喚醒CAN通信.要求如下:
根據(jù)CAN通信協(xié)議,選取合適的時鐘源.本文根據(jù)協(xié)議中規(guī)定的波特率和整車控制器的硬件設(shè)計,選取振蕩器作為CAN通信時鐘源.整車控制器所使用的晶振為16MHz,經(jīng)過預(yù)分頻處理后得到CAN通信的波特率為500Kbps.
設(shè)定CAN通信的濾波參數(shù).BootLoader數(shù)據(jù)的下載通過特定的幀來完成.根據(jù)協(xié)議,選取標準幀格式,并設(shè)置相應(yīng)的濾波器,使得MSCAN僅接收特定段的CAN報文.MSCAN初始化流程如圖4所示.
3.2.2 MSCAN 發(fā)送程序設(shè)計
要發(fā)送的數(shù)據(jù)打包后,首先選擇MSCAN中空閑發(fā)送緩沖區(qū),并將報文放置于發(fā)送緩沖區(qū).MSCAN具有多個發(fā)送緩沖區(qū),可以同時寫入多個報文,寫入報文后,通過設(shè)置相應(yīng)緩沖區(qū)的指針,通知MSCAN模塊有需要發(fā)送的報文.當總線空閑時,MSCAN會根據(jù)存儲報文的優(yōu)先級依次發(fā)送寫入發(fā)送緩沖區(qū)的報文.MSCAN發(fā)送流程如圖5所示[5].
圖6 MSCAN接收流程
3.2.3 MSCAN 接收程序設(shè)計
MSCAN具有多個數(shù)據(jù)接收緩沖區(qū),可同時接收多個數(shù)據(jù)報文.數(shù)據(jù)報文的讀取可采取中斷和查詢的方式,本文選取采用查詢的方式接收報文,每隔一定的時間周期,程序通過讀取接收標志寄存器確認接收緩沖區(qū)中是否有報文要讀取.數(shù)據(jù)讀取后,清零接收標志寄存器釋放接收緩沖區(qū).MSCAN接收流程如圖6所示.
飛思卡爾微控制器內(nèi)部集成Flash,可以存儲運行所需的代碼和數(shù)據(jù).芯片的Flash區(qū)域被分塊處理,內(nèi)部配有Flash保護配置寄存器,用以確定被保護的區(qū)域的大小.系統(tǒng)復(fù)位時,首先從此區(qū)域加載數(shù)據(jù).為了保證整個順利擦除和寫入Flash,必須保證總線時鐘和Flash工作時鐘在合理范圍內(nèi).本文所選用的16MHz外部時鐘參考,可以保證總線時鐘大于2MHz,滿足Flash編程的要求.初始化Flash模塊時,可通過設(shè)置合理的Flash時鐘分頻寄存器的值,使Flash工作時鐘保證在150~200kHz內(nèi),否則有可能導(dǎo)致Flash擦除和寫入失敗[6].
具體來說,對Flash的擦除既可整體擦除,也可以僅擦除一個扇區(qū),但擦除的內(nèi)容不能小于一個扇區(qū).而針對Flash的寫入操作要以字為基礎(chǔ).Flash的擦除和寫入操作主要包括以下4個步驟:
(1)設(shè)置Flash預(yù)分頻寄存器,保證Flash工作頻率在150~200kHz內(nèi);
(2)設(shè)置Flash控制寄存器的值,使能擦除或?qū)懭朊?
(3)讀取狀態(tài)寄存器值,確認擦除或?qū)懭氩僮魍瓿?
(4)判斷命令執(zhí)行過程有無錯誤產(chǎn)生.
圖7 應(yīng)用程序S19文件
圖8 芯片內(nèi)存中的數(shù)據(jù)
整車控制器端代碼完成后,編譯源代碼生成BootLoader程序的S19文件并下載到整車控制器上運行,并進行測試.芯片復(fù)位后對當前狀態(tài)做出判斷,將S19文件中數(shù)據(jù)按照實際地址寫入Flash.測試及結(jié)果如下.
如圖7為生成的應(yīng)用程序S19文件,應(yīng)用程序中集成了CAN通信功能,跑馬燈功能,可以用來直觀地測試應(yīng)用程序下載后的結(jié)果.圖8是通過BootLoader程序下載到Flash中后顯示的芯片內(nèi)存中的數(shù)據(jù).通過對比,應(yīng)用程序可以按照實際的地址下載到指定的芯片內(nèi)存中,實現(xiàn)了整車控制器的BootLoader功能.
利用CAN測試工具CANoe可以快速實現(xiàn)對整車控制器CAN通信功能的診斷.在線測試如圖9所示,測試環(huán)境由CANoe、整車控制器、系統(tǒng)電源等組成.系統(tǒng)電源用于整車控制器供電,將CANoe與整車控制器的CAN通信接口相連,啟動CANoe軟件監(jiān)控測試界面,系統(tǒng)上電后,即可監(jiān)控測試結(jié)果.
圖9 BootLoader功能在線測試
整車控制器在供電后開始運行.通過在線測試可以看到,跑馬燈有規(guī)律地按固定周期閃爍.利用CANoe工具,隨機對整車控制器CAN故障診斷功能進行了測試,測試結(jié)果如圖10所示,包含了故障代碼、故障狀態(tài)等的描述,CAN通信功能正常.
圖10 測試結(jié)果
一個設(shè)計良好的BootLoader既能夠加快應(yīng)用程序的開發(fā),又方便后期使用階段應(yīng)用程序的升級、修改.本文實現(xiàn)了基于整車控制器的BootLoader功能的開發(fā),通過自定義的協(xié)議,基于CAN通信實現(xiàn)了應(yīng)用程序S19文件的解析和下載.測試表明,所開發(fā)的BootLoader能正確下載應(yīng)用程序,可穩(wěn)定擦寫芯片F(xiàn)lash,未出現(xiàn)數(shù)據(jù)丟失,能快速、準確地實現(xiàn)整車控制器升級功能,并可進一步擴展,提高應(yīng)用程序的開發(fā)效率.
[1]王薇.基于嵌入式linux的BootLoader的設(shè)計與應(yīng)用[D].成都:西南交通大學(xué),2006.
[2]孫天澤,袁文菊,張海峰.嵌入式設(shè)計與Linux驅(qū)動開發(fā)指南[M].北京:電子工業(yè)出版社,2005.
[3]游侃民.嵌入式系統(tǒng)網(wǎng)絡(luò)化BOOTLOADER的設(shè)計與實現(xiàn)[D].廣州:華南理工大學(xué),2010.
[4]王宜懷,劉曉升.嵌入式系統(tǒng):使用HCS12微控制器的設(shè)計與應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2008.
[5]鄒東升,佘龍華.一種基于CAN總線的程序調(diào)試技術(shù)研究[J].計算機技術(shù)與應(yīng)用,2008,26(5):116-117.
[6]羅勝耘,路安江.串行Flash啟動BootLoader的設(shè)計與實現(xiàn)[J].化工自動化及儀表,2010,37(8):90-93.