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