文獻(xiàn)標(biāo)識碼: A
DOI:10.16157/j.issn.0258-7998.2016.01.010
中文引用格式: 李會,王宜懷,王磊. 基于CAN的數(shù)據(jù)無損代碼更新方法設(shè)計與應(yīng)用[J].電子技術(shù)應(yīng)用,2016,42(1):40-43.
英文引用格式: Li Hui,Wang Yihuai,Wang Lei. The design and application of CAN-based code updation with data lossless[J].Application of Electronic Technique,2016,42(1):40-43.
0 引言
針對汽車電子在復(fù)雜工作環(huán)境下更新固件過程繁瑣、穩(wěn)定性不高、數(shù)據(jù)易丟失、實時性欠佳等情況[1],以電磁環(huán)境較復(fù)雜的無刷直流電機(jī)控制器為例,深入剖析Bootloader機(jī)制[2-4],使用自定義的BLC通信協(xié)議,基于面向汽車電子的CAN總線通信方式[5],結(jié)合用戶程序運(yùn)行區(qū)與備份區(qū)交替使用的方式,設(shè)計了數(shù)據(jù)無損的代碼更新方法,實現(xiàn)了數(shù)據(jù)穩(wěn)定傳輸、快速下載更新等功能。同時還對Bootloader代碼區(qū)進(jìn)行保護(hù),并采用MCU加密與后門密鑰驗證機(jī)制防止外界對用戶應(yīng)用程序區(qū)的意外修改,從而增強(qiáng)系統(tǒng)的穩(wěn)定性和可靠性。
1 系統(tǒng)介紹
1.1 CAN節(jié)點硬件構(gòu)成
CAN模塊用來進(jìn)行數(shù)據(jù)通信,是CAN Bootloader系統(tǒng)的核心模塊之一。KEA128微控制器[6]有一路CAN通道與CAN收發(fā)器MC33901[7]相連,其中,MC33901是面向汽車電子應(yīng)用的高速CAN收發(fā)器,可提供物理接口。CAN節(jié)點硬件組成如圖1所示。
KEA128芯片的MSCAN模塊的時鐘源為總線時鐘,大小為24 MHz,波特率為1 000 Kb/s。并采用32位接收過濾器過濾目標(biāo)ID,PC端軟件可以根據(jù)此目標(biāo)ID通過USB-CAN卡將數(shù)據(jù)正確地發(fā)送給目標(biāo)CAN節(jié)點——無刷直流電機(jī)控制器KEA128芯片。本文設(shè)置控制器的ID為0x64。
為防止數(shù)據(jù)在導(dǎo)線終端被反射導(dǎo)致數(shù)據(jù)丟失,每個CAN總線需要兩個終端電阻,分別在主干線的兩個端點,一般為120 Ω,由于USB-CAN卡中已內(nèi)置120 Ω電阻,此處不需要外接。
1.2 系統(tǒng)構(gòu)成
為了向KEA128微控制器直接編程,本文提出了一種基于汽車CAN總線的數(shù)據(jù)無損的用戶程序備份加密與數(shù)據(jù)無損的BLC通信協(xié)議設(shè)計方法,實現(xiàn)了對無刷直流電機(jī)控制器快捷、穩(wěn)定的代碼更新功能。本文搭建的系統(tǒng)包括無刷直流電機(jī)控制器內(nèi)置的Bootloader、用戶應(yīng)用程序以及PC機(jī)端上位機(jī)軟件。在硬件連接上,采用廣成科技研發(fā)的USB-CAN卡實現(xiàn)PC機(jī)端與控制器KEA128之間的CAN通信。圖2為各個硬件之間的數(shù)據(jù)傳輸示意圖。
PC機(jī)端上位機(jī)軟件采用C#語言編程實現(xiàn),通過對用戶程序的機(jī)器碼文件逐行遍歷并進(jìn)行解析,去除無效數(shù)據(jù)(例如前綴等),將有效數(shù)據(jù)組成符合CAN總線協(xié)議的數(shù)據(jù)幀發(fā)送給無刷直流電機(jī)控制器內(nèi)置的Bootloader,Bootloader將數(shù)據(jù)幀解析并放在指定的用戶代碼區(qū),等待PC指針跳轉(zhuǎn)執(zhí)行。PC機(jī)與控制器之間通過數(shù)據(jù)無損的BLC通信協(xié)議進(jìn)行數(shù)據(jù)傳輸。
本設(shè)計方法在鏈接文件中對Bootloader和用戶應(yīng)用程序的內(nèi)存進(jìn)行劃分,共劃分出了2個用戶應(yīng)用程序區(qū),兩者根據(jù)實際情況分別作為代碼運(yùn)行區(qū)和備份區(qū)而存在,實現(xiàn)了數(shù)據(jù)無損的用戶程序備份機(jī)制。
此外,為了防止Bootloader代碼區(qū)和用戶程序區(qū)被意外修改,本設(shè)計方法設(shè)置了保護(hù)Flash配置域,將整個Bootloader代碼區(qū)進(jìn)行保護(hù),同時還采用MCU加密機(jī)制將用戶程序區(qū)加密,只允許用戶通過Bootloader進(jìn)行后臺密鑰驗證的方式進(jìn)行固件更新。
2 上位機(jī)端通信軟件設(shè)計
2.1 上位機(jī)端與控制芯片端通信幀格式定義
上位機(jī)通信軟件可逐行遍歷.HEX格式的MCU機(jī)器碼文件。對于每一條HEX記錄,通信軟件解析出有效數(shù)據(jù)并進(jìn)行組幀,幀格式符合CAN總線協(xié)議的標(biāo)準(zhǔn)數(shù)據(jù)幀。
由于CAN協(xié)議標(biāo)準(zhǔn)數(shù)據(jù)幀的數(shù)據(jù)段最大長度為8 B,所以一條HEX記錄可能需要幾個數(shù)據(jù)幀才能發(fā)送完畢。對于超過8 B的數(shù)據(jù),在仲裁段添加1 B的協(xié)議信息,以表示該條記錄的幀數(shù)和待發(fā)送幀的序號,其高4位表示幀數(shù),低4位表示幀的序號。具體通信幀格式如表1所示。幀類型值為0x00~0x07,分別代表發(fā)送的幀為命令幀、應(yīng)答幀、地址幀、代碼幀、校驗幀、更新幀和結(jié)束幀。只有代碼幀中的幀數(shù)和幀序號有效,其他幀的幀數(shù)和幀序號的內(nèi)容無效且均為0xFF。
2.2 數(shù)據(jù)幀鏈表隊列生成方法
為降低代碼更新的復(fù)雜性,并提高Bootloader對HEX文件有效數(shù)據(jù)重組的可靠性,上位機(jī)軟件設(shè)計并實現(xiàn)一種能夠生成更新代碼管理鏈表隊列,用于存儲待發(fā)送的數(shù)據(jù)幀。上位機(jī)軟件首先完成解析HEX文件,并將數(shù)據(jù)進(jìn)行組幀,快速建立一個數(shù)據(jù)幀管理鏈表隊列,如圖3所示。
上位機(jī)軟件通過CAN總線向無刷直流電機(jī)控制器發(fā)送數(shù)據(jù)幀,直到一條記錄發(fā)送完畢。在控制芯片端將接收的數(shù)據(jù)幀進(jìn)行解析,解析出待存的數(shù)據(jù)和存放Flash的地址。在一條記錄接收完畢后,將此記錄寫入用戶Flash相應(yīng)的地址中,從而簡化Bootloader的邏輯。
3 無刷直流電機(jī)控制器Bootloader設(shè)計
3.1 鏈接文件中的內(nèi)存設(shè)計
無刷直流電機(jī)控制器采用的KEA128微控制器的RAM大小為16 KB,F(xiàn)lash大小為128 KB,在intflash.ld文件中對Bootloader和用戶應(yīng)用程序的存儲空間進(jìn)行劃分。
圖4為KEA128無刷直流電機(jī)控制器內(nèi)存劃分示意圖。最左邊為KEA128微控制器的存儲映射表,其中Flash區(qū)又劃分為Bootloader代碼區(qū)、1號用戶代碼區(qū)和2號用戶代碼區(qū)。Bootloader代碼區(qū)包括中斷向量表和Bootloader代碼。同樣的,1號用戶代碼區(qū)和2號用戶代碼區(qū)包括中斷向量表和用戶代碼。本文利用內(nèi)存中劃分的2個用戶代碼區(qū)設(shè)計了一套良好的用戶代碼備份機(jī)制。該機(jī)制輪流采用兩個用戶代碼區(qū)分別用來備份當(dāng)前運(yùn)行的用戶代碼和準(zhǔn)備更新的用戶代碼。配置信息段用于標(biāo)識當(dāng)前運(yùn)行的用戶程序處于哪個用戶代碼區(qū)。假設(shè)當(dāng)前運(yùn)行的用戶程序處于1號用戶代碼區(qū),當(dāng)用戶準(zhǔn)備更新代碼時,Bootloader自動讀取配置信息段,并將待更新的用戶代碼放在2號用戶代碼區(qū)。此時1號用戶代碼區(qū)作為備份存在,2號用戶代碼區(qū)作為運(yùn)行區(qū)存在。當(dāng)下一次更新代碼時,2號用戶代碼區(qū)將自動作為備份存在,1號用戶代碼區(qū)數(shù)據(jù)被擦除并存儲待更新的用戶代碼。該機(jī)制減少了Bootloader對Flash區(qū)的操作,縮短了代碼更新時間,同時也保證當(dāng)更新失敗,系統(tǒng)還可以盡快恢復(fù)到之前的功能。
3.2 中斷向量表重映射
中斷向量表是存放中斷服務(wù)程序入口地址或跳轉(zhuǎn)到中斷服務(wù)程序入口地址的一段存儲區(qū)域。由于程序執(zhí)行的第一條指令地址是以中斷向量的形式給出,因此重映射中斷向量表是設(shè)計Bootloader的第一步。圖4對控制器的內(nèi)存進(jìn)行了劃分,默認(rèn)情況下,Bootloader的中斷向量表處于0x0000_0000~0x0000_000C地址。KEA128微控制器上電啟動后,將運(yùn)行Bootloader代碼并檢測是否需要進(jìn)行代碼更新操作。若檢測到代碼更新命令,Bootloader將接收新的應(yīng)用程序代碼寫入相應(yīng)的用戶代碼區(qū),禁止中斷;然后初始化用戶程序區(qū)堆棧指針,將中斷向量表重新定位到用戶應(yīng)用程序區(qū)中的中斷向量表所在位置,并將此地址值賦給中斷向量表起始地址寄存器SCB->VTOR;最后PC指針跳轉(zhuǎn)到相應(yīng)用戶代碼區(qū)的入口地址處。整個執(zhí)行流程如圖5所示。
3.3 Bootloader代碼區(qū)保護(hù)與MCU加密機(jī)制設(shè)計
為了防止用戶應(yīng)用程序?qū)ootloader代碼區(qū)的意外修改,通過保護(hù)Flash配置域?qū)⒄麄€Bootloader代碼區(qū)進(jìn)行保護(hù)。在Bootloader代碼區(qū)中,F(xiàn)lash配置域地址位于0x00000400~0x00000410。Flash保護(hù)分為低地址域和高地址域,而Bootloader代碼區(qū)中的Flash配置域位于低地址保護(hù)域內(nèi)。配置FPLS[1:0]=11,就可以將整個16 KB大小的Bootloader代碼區(qū)保護(hù)起來。
同時,為了保護(hù)無刷直流電機(jī)控制器能夠正常運(yùn)行,應(yīng)禁止用戶通過寫入器對MCU進(jìn)行二次寫入,只允許用戶通過控制器內(nèi)置Bootloader來更新程序。通過設(shè)置KEA128后門秘鑰(BackdoorKey)對KEA128整個芯片進(jìn)行加密。而Bootloader會內(nèi)置密鑰,可以完成對用戶代碼區(qū)的下載及更新。
Bootloader借助內(nèi)置的后門密鑰與存儲在Flash配置域的8 B后門密鑰的內(nèi)容進(jìn)行比較并匹配,從而獲得對KEA128的訪問權(quán)限并臨時解鎖芯片。
4 數(shù)據(jù)無損的BLC通信協(xié)議
BLC通信協(xié)議是為了保證上位機(jī)下發(fā)的.HEX文件的有效數(shù)據(jù)可被無刷電機(jī)控制器無損地接收和可靠處理。主要通過握手機(jī)制來實現(xiàn),具體的通訊鏈路機(jī)制如圖6所示。
首先,上位機(jī)軟件取得HEX有效數(shù)據(jù)后,循環(huán)向控制器發(fā)送命令幀請求開始發(fā)送數(shù)據(jù),直到控制器向上位機(jī)反饋“同意接收”的應(yīng)答幀時才停止下發(fā)請求命令幀;上位機(jī)在收到應(yīng)答幀后,通過CAN總線將數(shù)據(jù)幀發(fā)送給下位機(jī),在發(fā)送完HEX數(shù)據(jù)后,上位機(jī)將發(fā)送結(jié)束幀通知控制器HEX數(shù)據(jù)已發(fā)送完畢,無刷電機(jī)控制器將回發(fā)應(yīng)答幀通知上位機(jī)數(shù)據(jù)“接收成功”,到此上位機(jī)可以停止HEX數(shù)據(jù)的傳輸。之后控制器通過執(zhí)行Flash寫操作將接收到的HEX數(shù)據(jù)寫到相應(yīng)用戶代碼區(qū)的指定地址,完成寫入后再次向上位機(jī)發(fā)送應(yīng)答幀命令表示已“完成HEX數(shù)據(jù)的寫入”,上位機(jī)收到后將下發(fā)結(jié)束幀請求結(jié)束此次傳輸過程,最后控制器將回發(fā)應(yīng)答幀“關(guān)閉此次通信過程”。
此外,本文還在BLC協(xié)議中設(shè)計了超時重傳機(jī)制,BLC協(xié)議的發(fā)送方在0.5 s內(nèi)沒有收到確認(rèn)就要重傳已發(fā)送的數(shù)據(jù)。在整個傳輸過程中,凡是已經(jīng)發(fā)送過的數(shù)據(jù),在未收到確認(rèn)之前都必須暫時保留,以便超時重傳時使用。如果發(fā)送方一連重傳3次仍無響應(yīng),發(fā)送方就認(rèn)為接收方出了故障,關(guān)閉整個連接。
5 測試結(jié)果分析
對本文設(shè)計的數(shù)據(jù)無損的代碼更新方法進(jìn)行了時間開銷的測試實驗。在控制器端指定引腳PTI2為高電平,當(dāng)Bootloader開始時將其拉低,結(jié)束時再次將其改為高電平,用示波器觀察PTI2引腳低電平持續(xù)的時間即為所需要的時間。以16 KB的HEX文件為例。在一天不同的時間段測試的數(shù)據(jù)如表2所示。每個數(shù)據(jù)均為當(dāng)前時間測試的10次數(shù)據(jù)的平均值。
同時,也對系統(tǒng)的可靠性進(jìn)行了測試,部分測試結(jié)果如表3所示。
綜上所述,所設(shè)計的數(shù)據(jù)無損代碼更新方法運(yùn)行穩(wěn)定,時間開銷短、通信可靠且能夠有效改善代碼更新過程中下載失敗的問題。
6 結(jié)論
本文設(shè)計的數(shù)據(jù)無損代碼更新方法提供了高可靠性的代碼更新機(jī)制,極大地方便了研發(fā)人員對設(shè)備的測試及產(chǎn)品升級。目前,此系統(tǒng)已成功應(yīng)用于蘇州華祥信息科技有限公司的無刷直流電機(jī)控制系統(tǒng)中,經(jīng)實際生產(chǎn)測試表明,本系統(tǒng)穩(wěn)定可靠,可成功實現(xiàn)20 Hz以下數(shù)據(jù)無損的代碼更新。同時,本設(shè)計方法也為圖2中其他CAN節(jié)點的代碼更新提供了一種新的思路。
參考文獻(xiàn)
[1] 蔣建春,王正樹.基于軟件觸發(fā)的在應(yīng)用編程在線升級技術(shù)的設(shè)計與實現(xiàn)[J].計算機(jī)應(yīng)用,2012,32(3):121-123.
[2] 王亞剛.嵌入式Bootloader機(jī)制的分析與移植[J].計算機(jī)工程,2010,36(6):267-269.
[3] 陳曦,鄭貴林.基于自編程功能的MCU Bootloader設(shè)計[J].電子設(shè)計工程,2010(18):65-68.
[4] 劉矗,羅峰.基于飛思卡爾微控制器的CAN Bootloader的實現(xiàn)與應(yīng)用[J].蘇州大學(xué)學(xué)報:工學(xué)版,2010,30(2):57-61.
[5] 司寶豐,孟鵬花.基于CAN總線的Bootloader設(shè)計[J].儀表技術(shù),2010(3):30-33.
[6] Freescale.KEA128 Sub-Family Reference Manual Rev 2[DB/OL].2014.http://www.freescale.com.
[7] Freescale.MC33901:High Speed CAN Transceiver Rev 1[DB/OL].2013.http://www.freescale.com.