陳彤,黃立梅
(陜西法士特汽車傳動工程研究院,陜西 西安 710119)
汽車電子
一種用于汽車電控單元CAN Bootloader的設(shè)計與實現(xiàn)
陳彤,黃立梅
(陜西法士特汽車傳動工程研究院,陜西 西安 710119)
∶傳統(tǒng)汽車電控單元對程序的燒寫一般采用BDM調(diào)試接口實現(xiàn),該方法不僅影響電控單元應(yīng)用程序的開發(fā)效率,而且會給汽車電控單元后期的升級維護帶來不便。使用嵌入式啟動引導(dǎo)程序(即Bootloader),能夠較好的解決上述問題。本文設(shè)計并實現(xiàn)了一種應(yīng)用于汽車電控單元的基于CAN通信的 Bootloader。通過實際應(yīng)用和測試,結(jié)果表明該Bootloader能夠正確引導(dǎo)程序運行,準確、方便地為控制器下載應(yīng)用程序。
∶汽車電控單元;Bootloader;CAN總線;Labview
10.16638/j.cnki.1671-7988.2016.09.055
CLC NO.: U463.61Document Code: AArticle ID: 1671-7988 (2016)09-156-05
在汽車電控單元的開發(fā)過程中需要頻繁地進行程序燒寫工作,傳統(tǒng)的燒寫方式一般是利用芯片專用下載器通過BDM調(diào)試接口下載程序,該方式的下載速度較慢,而且在汽車電控單元的后期維護中,如果需要升級應(yīng)用程序,就需要從整車上將電控單元拆卸下來,為電控單元的維護和調(diào)試帶來極大的不便。對于已經(jīng)投入使用的汽車電控單元來說,急需一種方便快捷的程序升級方法,從而提高維護人員的工作效率。Bootloader作為應(yīng)用程序運行之前的一段程序,主要完成應(yīng)用程序的啟動引導(dǎo)和更新,而CAN總線通信在汽車電子領(lǐng)域的廣泛應(yīng)用,使得Bootloader可以直接通過CAN總線進行程序升級。本文設(shè)計并實現(xiàn)了一種基于CAN總線的Bootloader,通過自定義的數(shù)據(jù)傳輸協(xié)議與上位機進行通信并完成程序下載。
Bootloader是微處理器芯片上電后最先運行的一段代碼,它會首先對硬件設(shè)備進行初始化,包括看門狗、時鐘、串口、CAN接口等,同時會為相關(guān)的寄存器賦值,設(shè)置內(nèi)核啟動參數(shù)。初始化完成后,則進入循環(huán)等待上位機命令,并根據(jù)命令實現(xiàn)相應(yīng)功能。
由于嵌入式系統(tǒng)的資源非常有限,特別是存儲空間,因此,用于汽車電控單元的Bootloader不需要集成太多其他的功能,而是實現(xiàn)兩個最基本的功能:啟動引導(dǎo)功能和程序下載功能。對于CAN Bootloader來說,當系統(tǒng)上電完成一系列初始化工作后,Bootloader進入CAN通信循環(huán)等待接收命令,當接收到啟動命令時,它直接將電控單元FLASH中的應(yīng)用程序代碼加載到系統(tǒng)內(nèi)存RAM中,并跳轉(zhuǎn)到應(yīng)用程序入口開始運行;當Bootloader接收到下載命令時,它會通過CAN總線從上位機下載應(yīng)用程序代碼并燒寫到FLASH中存儲起來。如果在CAN通信循環(huán)中等待命令超時,則直接進入啟動引導(dǎo)模式運行應(yīng)用程序。不同的處理器芯片,其實現(xiàn)Bootloader的方式不同,但基本思路一致。
本文使用英飛凌系列芯片作為汽車電控單元的MCU,屬于典型的汽車級微控制器,滿足Bootloader通過CAN總線更新程序的要求。
3.1Bootloader程序下載方案
通過CAN總線實現(xiàn)程序下載,是CAN Bootloader相對于汽車電控單元傳統(tǒng)程序下載方式的主要優(yōu)勢,本文所使用英飛凌系列芯片對FLASH存儲區(qū)的操作一般以頁為單位,基于這一特性,并結(jié)合CAN總線通信要求,確定了CAN Bootloader的程序下載方案如下:
1)汽車電控單元上電啟動Bootloader并進入CAN通信循環(huán)等待上位機命令,若在等待延時期間收到來自上位機的程序下載命令,則開始與上位機進行握手操作,握手成功后,向上位機發(fā)送下載確認請求并開始等待上位機的數(shù)據(jù)幀。
2)上位機接收到下載確認請求后,開始解析應(yīng)用程序代碼,并以128字節(jié)為單位將目標代碼分頁,每解析完一頁數(shù)據(jù),上位機進入CAN發(fā)送循環(huán),將頁首地址及頁數(shù)據(jù)循環(huán)發(fā)送至下位機。
3)下位機只有接收到一頁完整的數(shù)據(jù)并完成數(shù)據(jù)校驗后,才會將所接收數(shù)據(jù)以頁的形式燒寫進FLASH存儲區(qū),并向上位機發(fā)送下載確認請求提示其繼續(xù)發(fā)送下一頁數(shù)據(jù)。
4)上位機將應(yīng)用程序代碼解析完畢,并收到下位機的確認請求后,向下位機發(fā)送出下載結(jié)束命令,通知其復(fù)位重啟。
3.2自定義CAN通信協(xié)議及數(shù)據(jù)校驗
本文在CAN通信過程中,全部使用擴展ID。為方便測試,自定義了上位機與下位機的通信ID,具體定義如表1所示。
表1 CAN通信ID定義
數(shù)據(jù)傳輸過程中的校驗則通過累加運算實現(xiàn),上位機解析代碼是,將每頁解析出的128字節(jié)的數(shù)據(jù)進行累加,并取運算結(jié)果的低四字節(jié)作為數(shù)據(jù)校驗碼發(fā)送給下位機,下位機在接收數(shù)據(jù)的過程中對接收到的數(shù)據(jù)按字節(jié)進行累加,并將計算結(jié)果的低四字節(jié)與接收到的數(shù)據(jù)校驗碼進行比較,從而判斷程序下載過程中的數(shù)據(jù)傳輸是否可靠。
4.1Bootloader存儲區(qū)空間劃分
由于嵌入式芯片工作模式的限制,上電后,芯片一般都會在FLASH存儲區(qū)首地址處尋找程序代碼并執(zhí)行。因此,我們不得不將應(yīng)用程序按照約定放在芯片F(xiàn)LASH的首位地址處,如果要在Flash中安排了兩個應(yīng)用程序,則無法啟用第二個程序。
Bootloader啟動引導(dǎo)功能的目的就是為了在其完成自身本職工作后,將硬件的管理權(quán)釋放,并且將MCU的各種資源移交給應(yīng)用程序,并為應(yīng)用程序的運行提供必要的支持。
因此,使用Bootloader的嵌入式系統(tǒng),會在FLASH的起始段為Bootloader專門開辟一個較小的存儲空間,Bootloader代碼作為芯片上電后需要最先運行的程序,其中斷向量表首地址會與FLASH存儲區(qū)首地址一致,而應(yīng)用程序作為被引導(dǎo)的代碼,需要配置在剩余空間內(nèi)。本文所使用英飛凌系列芯片的FLASH存儲空間分配如表2所示。
表2 存儲空間分配表
4.2Bootloader存儲區(qū)讀寫、擦除功能實現(xiàn)
對存儲區(qū)的讀取、寫入、擦除功能,是實現(xiàn)Bootloader程序下載功能的基礎(chǔ)。本文所使用英飛凌系列芯片的內(nèi)核中有一個特殊單元IMB,由該單元管理著MCU對Flash存儲區(qū)的擦除和讀寫工作。IMB在MCU中預(yù)先定義好了一些列的控制命令,如表3所示。
表3 IMB控制命令表
Bootloader程序想要實現(xiàn)對FLASH存儲區(qū)的讀寫、擦除等操作,必須嚴格按照IMB預(yù)先定義的控制命令和命令序列來進行。每條控制命令反映到代碼上,就是對特性地址的寄存器賦予特定的值,例如Reset to Read命令的實現(xiàn)就是對F0寄存器賦值A(chǔ)A。
4.3下位機Bootloader流程
下位機CAN Bootloader程序的整體流程圖如圖1所示。
圖1 下位機Bootloader整體流程圖
下位機Bootloader對CAN消息的收發(fā)全部都在CAN中斷中完成,當程序運行至CAN消息接收循環(huán)后,一旦從總線上收到CAN消息,就立即觸發(fā)CAN中斷并進入中斷服務(wù)程序。中斷服務(wù)程序判斷接收ID是否為0x18FF1111,并判斷內(nèi)容是否為程序下載命令,若是,則開始與上位機握手并準備下載應(yīng)用程序。
握手成功后,中斷服務(wù)程序會判斷接收ID是否為0x18FF5555,并對接收到的幀進行數(shù)據(jù)校驗。當一頁的數(shù)據(jù)幀全部接收完成后,則擦除FLASH中相應(yīng)的頁空間并寫入一頁數(shù)據(jù)。通過CAN總線將全部目標文件下載到芯片F(xiàn)LASH后,Bootloader會讓芯片上電復(fù)位,以加載運行新的應(yīng)用程序。
5.1設(shè)計要求
上位機通信界面主要用于配合下位機Bootloader讀取并下載升級程序代碼,對于本文所使用英飛凌系列芯片來說,就是HEX文件。通過英飛凌的集成開發(fā)環(huán)境對應(yīng)用程序進行編譯鏈接后,就能夠生成下載所需的HEX文件。由于Labview在圖形化界面編程方面較為簡便,且在CAN通信上有相應(yīng)的庫函數(shù)作支持,所以本文使用Labview軟件設(shè)計Bootloader的上位機通信界面。
上位機通信界面具體要求如下:
1)可以根據(jù)實際需要設(shè)置波特率、發(fā)送幀類型、發(fā)送ID號等。
2)可以打開并初始化所選的CAN通道;能夠通過文件路徑打開應(yīng)用程序HEX代碼文件,并將HEX文件解析并轉(zhuǎn)換為Bootloader可識別的數(shù)據(jù)格式,循環(huán)發(fā)送給下位機。
3)接收和發(fā)送的CAN數(shù)據(jù)幀及相關(guān)信息能夠顯示在通信界面上,下位機與上位機之間的通信狀態(tài)也能夠以指示燈的形式體現(xiàn)出來。
5.2HEX文件解析模塊設(shè)計
HEX文件可以通過集成開發(fā)環(huán)境直接生成,它以行為單位,每一行具有固定的格式,如表4所示。
表4 HEX格式定義
數(shù)據(jù)記錄類型的具體定義如表5所示。
表5 HEX文件數(shù)據(jù)記錄類型定義
因此,HEX文件解析模塊需要以行為單位對文件進行讀取,并將讀取到的字符串轉(zhuǎn)換為16進制數(shù)據(jù),根據(jù)不同的數(shù)據(jù)記錄類型進行相應(yīng)的處理,最終將每頁數(shù)據(jù)及其頁首地址解析出來,具體流程如圖2所示。
圖2 HEX文件解析流程圖
其中,對于實際數(shù)據(jù)類型的數(shù)據(jù)記錄行的處理較為繁瑣,主要是因為生成的HEX文件其每行的地址偏移量并不一定與128字節(jié)的頁地址匹配,頁首地址有可能出現(xiàn)在兩行地址偏移量之間,因此當判斷出某行數(shù)據(jù)記錄中包含頁首地址是,需要根據(jù)相鄰兩行數(shù)據(jù)記錄的地址偏移量計算出頁首地址,并對該行數(shù)據(jù)進行分割,將其添加到不同的頁數(shù)組中。
5.3CAN通信收發(fā)模塊設(shè)計
利用Labview庫函數(shù),可以較便捷地實現(xiàn)上位機通信界面與下位機間的CAN通信。當上位機通信界面根據(jù)所設(shè)置的通道參數(shù)與下位機建立CAN通信連接后,軟件會進入兩個并列的循環(huán):CAN接收循環(huán)和CAN發(fā)送循環(huán),兩個循環(huán)并發(fā)運行,從而實現(xiàn)上位機與下位機之間的實時通信。CAN接收循環(huán)流程圖如圖3所示。
圖3 上位機CAN接收循環(huán)流程圖
CAN接收循環(huán)在收到下位機的下載確認信息后會通過局部變量的方式通知CAN發(fā)送循環(huán)開始發(fā)送下一頁數(shù)據(jù)。CAN發(fā)送循環(huán)流程圖如圖4所示。
CAN發(fā)送循環(huán)一開始會直接向下位機發(fā)送程序下載命令,在和下位機成功握手后,進入真正的數(shù)據(jù)發(fā)送循環(huán),以頁為單位不斷向下位機發(fā)送數(shù)據(jù)幀,直到目標HEX文件全部解析并被下位機下載完成。
圖4 上位機CAN發(fā)送循環(huán)流程圖
5.4運行界面
通過Labview軟件開發(fā)出來的上位機通信界面如圖5所示。
圖5 上位機運行界面
設(shè)置好CAN通道號、波特率、ID類型、發(fā)送ID號等參數(shù),并在文件路徑下選擇目標HEX文件,點擊get on bus讓上位機與下位機建立通信連接,通過CAN總線不斷向下位機發(fā)送程序下載命令,并等待來自下位機的消息,同時可以在顯示框中觀察到上位機接收到的CAN數(shù)據(jù)。如果上位機與下位機握手成功,則逐頁發(fā)送解析好的數(shù)據(jù),發(fā)完后自動停止,也可以手動通過get on bus強制通信中斷。如果通信過程中出現(xiàn)錯誤,則會在錯誤對話框中顯示出錯誤信息。
通過上位機通信界面程序可以對下位機內(nèi)的Bootloader進行功能測試,具體測試方法如下:
1)準備安裝有上位機通信界面的電腦一臺,已刷寫號Bootloader的汽車電控單元一塊,兩者通過CAN總線建立通信,并在上位機監(jiān)測CAN通信內(nèi)容。
2)下位機電控單元上電的同時,上位機啟動通信界面并登上CAN總線向下位機發(fā)送握手請求。
3)上位機與下位機建立連接后,將預(yù)先編寫好的能夠發(fā)出特定報文的簡單例程添加的通信界面上。
4)開始向下位機下載例程,下載成功后,下位機重新上電并等待延時,啟動引導(dǎo)例程運行。
5)在上位機監(jiān)測CAN總線報文,判斷下載到下位機的例程是否正確。
6)重啟下位機電控單元,并下載一個與之前不同的例程。
7)例程下載完成后,下位機重新上電,在上位機監(jiān)測CAN總線報文,判斷下載到下位機的例程是否已被更換。
8)若上述工作全部成功,則證明Bootloader功能正常。
將本文所設(shè)計的CAN Bootloader編譯鏈接生成HEX文件并下載至汽車電控單元中,打開上位機通信界面選擇應(yīng)用程序HEX文件進行測試。經(jīng)測試,目標文件能夠順利地下載到下位機FLASH中,重新上電后也能夠通過Bootloader自動加載運行。
一個設(shè)計良好的Bootloader能夠加快汽車電控單元應(yīng)用程序的開發(fā),更能夠為后期的維護和升級工作提供便捷。本文設(shè)計并實現(xiàn)了一種用于汽車電控單元的CAN Bootloader,根據(jù)自定義的通信協(xié)議,通過CAN總線實現(xiàn)應(yīng)用程序從上位機到汽車電控單元的下載。經(jīng)過測試,該Bootloader能夠正確、可靠地幫助芯片下載應(yīng)用程序,穩(wěn)定地擦寫FLASH存儲區(qū),快速、準確地實現(xiàn)對汽車電控單元的軟件更新。
[1] 王亞剛.嵌入式Bootloader機制的分析和移植[J].計算機工程,2010,36(6):267-269.
[2] 游侃民.嵌入式系統(tǒng)網(wǎng)絡(luò)化BOOTLOADER的設(shè)計與實現(xiàn)[D].廣州:華南理工大學,2010.
[3] 羅峰,孫澤昌.汽車CAN總線原理.設(shè)計與應(yīng)用 [M].北京:電子工業(yè)出版社.2010: 242-265.
[3] 鄒東升,佘龍華. 一種基于CAN總線的程序調(diào)試技術(shù)研究 [J].計算機技術(shù)與應(yīng)用, 2008,26(5):116-117.
[4] 羅勝耘,路安江. 串行Flash啟動Bootloader的設(shè)計與實現(xiàn) [J].化工自動化及儀表, 2010,37(8):90-93.
The Design and Implementation of a CAN Bootloader in Automotive ECU
Chen Tong, Huang Limei
(Shaanxi Fast Gear Co., Ltd, Shaanxi Xi'an 710119)
The traditional automotive ECU usually uses BDM debug interface for programming, This method influences the efficiency of developing the ECU, and also makes it difficult for update and maintenance. Using the bootloader for ECU will solve these problems. This paper, presents the design and implementation of a bootloader for automotive ECU, which based on CAN communication. This bootloader is proved that it can boot correctly and program the ECU quickly, through the test and practical application.
ECU; Bootloader; CAN; Labview
∶U463.61
∶A
∶1671-7988 (2016)09-156-05
陳彤(1988-),男,工程師,就職于陜西法士特汽車傳動工程研究院,從事汽車電器。