陳曉韋 楊開欣 董海博 郭謹瑋
摘要:智能車載檢測模塊是典型的嵌入式設(shè)備之一。嵌入式設(shè)備的主要特點是同一個硬件采用不同的固件便可以實現(xiàn)不同的功能。為了降低車載檢測模塊的維護成本,該文設(shè)計了一種基于CAN總線的車載檢測模塊固件升級系統(tǒng)。固件升級系統(tǒng)包括上位機和車載設(shè)備固件兩部分。車載設(shè)備固件將微控制器內(nèi)部flash區(qū)域劃分成Bootloader引導(dǎo)區(qū)和APP用戶程序區(qū)。升級采用被動模式,車載設(shè)備收到上位機發(fā)送的升級命令后,跳轉(zhuǎn)到Bootloader區(qū)域并執(zhí)行對應(yīng)的操作完成固件燒寫。實驗證明,此方法在很大程度上提高了車載設(shè)備的可維護性,方便穩(wěn)定可靠。
關(guān)鍵詞:嵌入式設(shè)備;CAN總線;Bootloader;固件升級
中圖分類號:TP311? ? ? ? 文獻標識碼:A? ? ? ? 文章編號:1009-3044(2018)35-0252-02
隨著科學技術(shù)的進步,車聯(lián)網(wǎng)技術(shù)的發(fā)展,汽車保有量的持續(xù)增加,各種各樣的車載設(shè)備需求量增加,新能源車輛的出現(xiàn)對智能車載設(shè)備需求量進一步增加。智能車載檢測模塊是典型的車載設(shè)備之一,主要用途是借用車輛的OBD診斷接口通過CAN總線實時獲取車輛的各種信息,如新能源汽車的電瓶電壓,電池溫度、電機轉(zhuǎn)速、剩余電池電量、行駛里程等。智能車載檢測模塊是典型的嵌入式設(shè)備之一,模塊可以實現(xiàn)的具體功能和模塊內(nèi)部使用的微控制器燒寫的固件有關(guān),不同車型可以使用同一個車載檢測模塊硬件。車載檢測模塊一旦批量出廠到達客戶手中,客戶如果想更改模塊的功能或是更換使用車型,供應(yīng)商需要派出大量的技術(shù)支持人員前往支持,成本高,效率低。為了解決這一問題,充分利用車載檢測模塊的外部接口,本文設(shè)計了一款基于CAN總線的車載檢測模塊固件升級系統(tǒng),車載檢測模塊通過CAN總線實現(xiàn)固件的升級方法,方便可靠,操作簡單,客戶只需要簡單幾步便能夠完成對固件的升級,對于模塊供應(yīng)商,在很大程度上節(jié)約了工程師差旅成本。對于客戶,提高了工作效率。
1 微控制器固件升級方法介紹
微控制器固件升級通常有兩種方法,方法一是在系統(tǒng)編程(In-system programming, ISP),利用JTAG等專用工具和特定的協(xié)議將固件燒寫到內(nèi)部flash中,通常在產(chǎn)品測試調(diào)試階段使用。由于此方法需要設(shè)備留有專用的外部接口和JTAG或ST-LINK下載器,通常成熟的設(shè)備部對外不會留有下載接口,所以此方法不適合已經(jīng)出廠設(shè)備的固件升級燒寫。另一種方法是在應(yīng)用編程(in-application programming,IAP),顧名思義就是在應(yīng)用程序的運行過程中實現(xiàn)對應(yīng)用程序的固件升級,此方法主要是借用微控制器支持的總線如:SPI,I2C,USART,CAN等實現(xiàn)對內(nèi)部固件的升級,實現(xiàn)相對靈活、不比用專用的下載器等。使用在應(yīng)用編程方法燒寫固件,工程師通常需要將微控制器的固件分成兩個部分,一是引導(dǎo)加載程序Bootloader,另一個是實現(xiàn)具體功能的用戶程序[1]。引導(dǎo)加載程序Bootloader通常包含啟動加載模式和下載模式兩種功能,啟動加載模式是引導(dǎo)用戶程序APP的正常執(zhí)行,下載模式可以實現(xiàn)對用戶程序APP的更新。初次使用微控制器時,Bootloader部分的固件要通過在系統(tǒng)編程ISP方式燒寫到微控制器內(nèi),而APP固件部分既可以通過ISP也可以通過IAP方式燒寫到微控制器內(nèi)。基于CAN總線的固件升級方法連接圖如圖1。PC通過USB線纜連接CAN主機,CAN主機和要升級固件的微控制器之間通過CAN總線進行通訊,根據(jù)CAN總線的特點[2]可知CAN主機和微控制器之間要有一個120歐姆的終端電阻。
2 基于CAN總線固件升級系統(tǒng)設(shè)計實現(xiàn)
基于CAN總線的固件升級系統(tǒng)包括上位機軟件和硬件兩個部分。軟件是實現(xiàn)發(fā)送升級命令和固件文件的上位機,硬件是智能車載檢測模塊。
2.1 智能車載檢測模塊
智能車載檢測模塊使用的微控制器是ST公司的STM32F105RC,此芯片有兩路CAN 接口,兩路ADC,256KB的Flash。車載模塊一路CAN通過OBD診斷接口和車輛通訊,獲取車輛的實時信息,第二路CAN將獲取的車輛實時信息傳到PC端或是用于接收固件實現(xiàn)對固件的更新。CAN遵循ISO/OSI參考模型,分數(shù)據(jù)鏈路層和物理層。根據(jù)ISO88002-2和ISO8802-3,數(shù)據(jù)鏈路層進一步細分為邏輯鏈路控制(LLC)和介質(zhì)訪問控制(MAC);物理層進一步細分為物理信令(PLS,位編碼、定時、同步),物理介質(zhì)附件(PMA,驅(qū)動器/接收器特性)和介質(zhì)附屬接口(MDI,連接器)[2]。數(shù)據(jù)鏈路層和物理信令層之間的鏈接是通過CAN 控制器實現(xiàn)的。物理介質(zhì)附件是協(xié)議控制器和物理線路之間的接口。在車載檢測模塊中,CAN 收發(fā)器選擇的是車規(guī)級別的恩智浦公司生產(chǎn)的TJA1043,車載檢測模塊硬件架構(gòu)如圖2所示。主要包括維持MCU 運行的最小外圍系統(tǒng),兩路CAN電路,電源轉(zhuǎn)換等其他電路。
2.2 MCU固件升級內(nèi)部Flash區(qū)間劃分
STM32F105是基于Cortex-M3內(nèi)核的互聯(lián)型微控制器,完成STM32固件升級首先要分析STM32的啟動流程,STM32的啟動流程封裝在啟動文件中。Cortex-M3內(nèi)核[3]通過設(shè)置BOOT[1:0]兩個管腳的電平定位啟動模式[4],啟動模式有三種,分別是Main Flash、System memory、內(nèi)嵌的SRAM。表1顯示了BOOT[1:0]管腳和啟動模式之間的關(guān)系。不同的啟動模式有不同的功能,通常我們的用戶固件程序是燒寫在Main Flash中的。System memory內(nèi)部存放了內(nèi)嵌的Bootloader[5]程序,這部分程序在芯片出廠時由ST廠商已經(jīng)固化在芯片內(nèi)部,工程師沒法修改只能使用。通過芯片廠商提供的此部分Bootloader可以更新芯片固件,可以選擇幾種外圍總線分別是兩個通用串行接口USART1、USART2,一個CAN總線接口CAN2和一個USB 接口DFU[6]。由于固件是燒寫在Main Flash中的,由表1可知選擇System memory啟動需要更換BOOT[1:0]管腳的電平,因此選擇芯片自帶的Bootloader的方法不適合對批量出廠設(shè)備的固件更新。因此本文參考芯片自帶的Bootloader啟動邏輯,通過CAN總線接口,編寫自己的Bootloader程序?qū)崿F(xiàn)對固件的更新。主要方法是在Main Flash區(qū)域中劃分出一段區(qū)域存放自己編寫的Bootloader程序引導(dǎo)固件加載和固件升級,而不需要重新設(shè)定BOOT[1:0]管腳電平,簡單方便實用。
STM32F105內(nèi)部有256KB的Main Flash ,起始地址是0x0800 0000, 結(jié)束地址是0x0803 FFFF,分成了128頁,每頁2KB。在此升級系統(tǒng)中將整個Flash劃分成三個區(qū)域,分別是bootloader區(qū)域,升級標志flag存放區(qū)域,和用戶應(yīng)用程序APP區(qū)域。Bootloader區(qū)域的起始地址是0x0800 0000, 結(jié)束地址是0x0800 FFFF,共64KB,在這64KB中劃分出2KB用于存放升級標志,起始地址是0x0800 F800,結(jié)束地址是0x0800 FFFF。用戶應(yīng)用程序APP區(qū)域的起始地址是0x0801 0000, 結(jié)束地址是0x0803 FFFF,共192KB。Main Flash區(qū)域劃分如圖3所示。
2.3 Bootloader程序設(shè)計
Bootloader部分的程序沒有實際的用戶功能,只是引導(dǎo)用戶程序APP的啟動和固件的更新。MCU上電后首先執(zhí)行Bootloader部分的代碼,先判斷升級標志位是不是有效,在此程序中如果升級標志位的值為0xEEEE,則表示需要升級用戶程序固件,否則直接運行用戶應(yīng)用程序。當需要升級用戶程序固件時,Bootloader接收到上位機發(fā)送的固件二進制文件后寫入到APP區(qū)域,升級過程中開啟錯誤檢查機制,一旦檢測到錯誤就重新啟動,整個固件程序成功寫入后才擦除升級標志位,MCU重啟,這樣防止將MCU刷成板磚。
2.4 APP用戶程序設(shè)計
APP用戶應(yīng)用程序主要有三個功能,功能一是實現(xiàn)車輛實時信息的獲取和上傳,功能二是接收上位機發(fā)送的升級固件命令,將升級標志區(qū)域置位,功能三是接收上位機其他命令完成固件版本檢查,Bootloader程序和APP用戶應(yīng)用程序跳轉(zhuǎn),CAN總線波特率設(shè)置等。APP用戶應(yīng)用程序在運行過程中,如果接收到上位機發(fā)送的升級固件命令,則直接將升級標志區(qū)域?qū)懭?xEEEE,然后重啟整個系統(tǒng)。MCU 重啟后FLASH內(nèi)數(shù)據(jù)不會被擦除,所以重啟后進如Bootloader區(qū)域后便可以接收固件程序進行升級。
2.5 固件升級系統(tǒng)上位機設(shè)計
上位機用MFC編寫,運行上位機后首先掃描CAN設(shè)備節(jié)點,檢查是否有CAN 設(shè)備節(jié)點存在,如果設(shè)備節(jié)點存在則發(fā)送查詢設(shè)備運行固件類型(Bootloader還是APP)和固件版本的命令,將節(jié)點的當前運行固件類型和版本顯示出來,之后便可以發(fā)送各種命令對車載設(shè)備進行控制,如設(shè)置CAN總線波特率、運行APP固件、運行Bootloader固件、擦除APPflash區(qū)域的數(shù)據(jù)、對APP固件升級等。上位機發(fā)送的命令,見表2。固件升級步驟見圖4。
3 結(jié)束語
本文設(shè)計了一款基于CAN總線的車載檢測模塊固件升級系統(tǒng),包括上位機和固件兩個部分,固件分成引導(dǎo)加載程序Bootloader部分和用戶應(yīng)用程序APP部分,避免了由于使用芯片自帶的Bootloader對固件進行升級時改變BOOT[1:0]管腳電平的操作,操作簡單、方便。此系統(tǒng)可以用于STM32任何一款支持CAN總線接口的微控制器的固件升級,對采用STM32做微控制器的嵌入式產(chǎn)品有一定的指導(dǎo)意義。
參考文獻:
[1] 陳程杰.基于CAN總線的ECU在線刷新和遠程服務(wù)系統(tǒng)的開發(fā)[D].天津大學,2017.
[2] 羅峰,孫澤昌.汽車CAN總線系統(tǒng)原理、設(shè)計與應(yīng)用[M].北京:電子工業(yè)出版社,2017.
[3] Yiu J. ARM Cortex-M3權(quán)威指南[M].北京:北京航空航天大學出版社,2009.
[通聯(lián)編輯:朱寶貴]