雒拓,程威,陳博凱,杜浪東
?
基于dsPIC30F的BootLoader設(shè)計(jì)
雒拓,程威,陳博凱,杜浪東
(陜西重型汽車有限公司,陜西 西安 710200)
控制單元采用專用調(diào)試接口更新程序時(shí),過程繁瑣且一般需要拆開殼體從而破壞產(chǎn)品的可靠性。文章介紹了一種基于dsPIC30F的BootLoader設(shè)計(jì)方法,可通過車輛預(yù)留的OBD接口,利用CAN總線實(shí)現(xiàn)控制單元軟件的更新。該設(shè)計(jì)方法主要包含啟動(dòng)管理、通信管理和底層驅(qū)動(dòng)管理等模塊。通過試驗(yàn)驗(yàn)證,該BootLoader能夠?qū)崿F(xiàn)控制單元程序的更新,且具有占用存儲(chǔ)空間小、下載速度快和工作可靠的特點(diǎn)。
CAN總線;BootLoader;dsPIC30F
隨著汽車電子技術(shù)的飛速發(fā)展,車載控制器已經(jīng)在商用車上廣泛應(yīng)用,而在控制器調(diào)試時(shí),經(jīng)常需在車輛的使用現(xiàn)場(chǎng)對(duì)控制器程序進(jìn)行升級(jí)和維護(hù)。采用基于CAN總線的BootLoader技術(shù)是實(shí)現(xiàn)程序更新的有效的解決方案,它避免了拆除硬件設(shè)備時(shí)造成的破壞,僅通過車輛預(yù)留的OBD接口,利用車輛自身的CAN總線網(wǎng)絡(luò)即可實(shí)現(xiàn)對(duì)車輛控制單元的程序更新,并支持對(duì)多個(gè)控制單元進(jìn)行程序更新。本文所設(shè)計(jì)的BootLoader基于dsPIC30F5011芯片,采用模塊化結(jié)構(gòu)設(shè)計(jì),根據(jù)器件手冊(cè)適當(dāng)調(diào)整即可適用于dsPIC30F系列其它規(guī)格的芯片。
BootLoader是獨(dú)立于用戶程序的功能代碼,通過CAN總線與上位機(jī)進(jìn)行通訊,實(shí)現(xiàn)控制單元程序的下載和運(yùn)行控制。主要包含啟動(dòng)管理模塊、通信協(xié)議處理模塊和硬件驅(qū)動(dòng)模塊[1],系統(tǒng)組成圖如圖1所示。
進(jìn)入BootLoader一般有三種方式:1、復(fù)位后設(shè)置一段延遲時(shí)間,需在延遲時(shí)間內(nèi)確認(rèn);2、通過讀取某個(gè)引腳的電平進(jìn)行判斷;3、通過設(shè)置啟動(dòng)標(biāo)志進(jìn)行判斷。方法1的延時(shí)存在不確定性,不易控制。方法2需要引出單獨(dú)的引腳,并手動(dòng)控制高低電平,不便于操作。方法3可通過CAN總線和上位機(jī)配合即可完成,在控制單元程序運(yùn)行中可隨時(shí)進(jìn)入BootLoader。本文采用第三種方式。
圖1 BootLoader結(jié)構(gòu)圖
控制器上電后首先進(jìn)入啟動(dòng)管理模塊,可通過修改鏈接器描述文件使控制器上電后跳轉(zhuǎn)至啟動(dòng)管理模塊的處理函數(shù)。該模塊通過“應(yīng)用程序有效標(biāo)志”(AppValid)和“BootLoader請(qǐng)求標(biāo)志”(BootReq)引導(dǎo)程序進(jìn)入用戶程序或是BootLoader程序。其中,AppValid存儲(chǔ)于flash中,而BootReq存儲(chǔ)于RAM中,變量的定義如下所示。
int __attribute__((address(0x880))) BootReq;
char __attribute__((space(prog),aligned(64))) BootInfo[64] = {0};
考慮到Flash的擦寫限制,定義了BootInfo[]變量,AppValid相當(dāng)于BootInfo[0]。當(dāng)Appvalid=0時(shí),應(yīng)用程序無效,此時(shí)始終進(jìn)入BootLoader;當(dāng)Appvalid=1時(shí),應(yīng)用程序有效,此時(shí)若BootReq=1,表示接收到上位機(jī)的BootLoader請(qǐng)求,則進(jìn)入BootLoader程序,否則進(jìn)入用戶程序。為了能夠在應(yīng)用程序運(yùn)行時(shí)隨時(shí)進(jìn)入BootLoader,可設(shè)置當(dāng)收到上位機(jī)的BootLoader請(qǐng)求信號(hào)后,將BootReq置為1然后通過軟件復(fù)位,復(fù)位后RAM中的數(shù)據(jù)保持不變??刂破魃想姀?fù)位時(shí),無需等待,直接進(jìn)入應(yīng)用程序。程序引導(dǎo)流程圖如圖2所示。
圖2 啟動(dòng)管理流程
通信協(xié)議處理模塊通過預(yù)定義的服務(wù)實(shí)現(xiàn)上、下位機(jī)之間的數(shù)據(jù)通信,包括BootLoader請(qǐng)求等服務(wù)[2],具體見表1。
表1 通信協(xié)議處理模塊
下載程序時(shí),上位機(jī)首先定時(shí)發(fā)送BootLoader請(qǐng)求指令,下位機(jī)收到BootLoader請(qǐng)求后進(jìn)入BootLoader,當(dāng)下位機(jī)進(jìn)入BootLoader后,上位機(jī)根據(jù)hex文件的地址信息向下位機(jī)發(fā)送擦除指令,擦除待編程的Flash和EEPROM區(qū)域;然后,上位機(jī)通過數(shù)據(jù)包傳輸服務(wù)將待下載的數(shù)據(jù)傳送給下位機(jī),上位機(jī)每次發(fā)送的字節(jié)數(shù)可根據(jù)上、下位機(jī)的內(nèi)存、hex文件大小、編程的字節(jié)數(shù)等確定;最后,上位機(jī)利用編程指令對(duì)下位機(jī)進(jìn)行編程,并在編程結(jié)束后對(duì)編程區(qū)域進(jìn)行數(shù)據(jù)校驗(yàn),并依此循環(huán)下載,直至所有數(shù)據(jù)下載完成。上下位機(jī)的通信流程圖如圖3所示。
1.3.1存儲(chǔ)地址分配
dsPIC30F5011單片機(jī)的存儲(chǔ)空間分配如下圖所示,包含22K指令字的Flash存儲(chǔ)空間和1KB的EEPROM存儲(chǔ)空間[3]。一般將用戶程序存儲(chǔ)于緊隨中斷向量表的存儲(chǔ)空間,而將BootLoader放在程序存儲(chǔ)器區(qū)域的最高地址區(qū)域,存儲(chǔ)空間分配見圖4。
圖4 存儲(chǔ)空間分配
1.3.2 CAN驅(qū)動(dòng)模塊
dsPIC30F5011 的CAN模塊擁有3個(gè)發(fā)送緩沖區(qū)、2個(gè)接收緩沖區(qū),每個(gè)接收緩沖區(qū)有硬件過濾器。為了降低CPU負(fù)載,在進(jìn)入BootLoader后使用硬件過濾器過濾掉與BootLoader功能無關(guān)的CAN報(bào)文。同時(shí),為了防止緩沖區(qū)溢出而導(dǎo)致的丟幀,在接收中斷中將報(bào)文放于軟件緩沖區(qū),在處理報(bào)文時(shí)從軟件緩沖區(qū)依次取出。緩沖區(qū)被設(shè)計(jì)成循環(huán)隊(duì)列,通過隊(duì)列長(zhǎng)度、當(dāng)前位置索引、尾部索引等變量控制隊(duì)列。緩沖機(jī)制如圖5所示。
圖5 CAN緩沖機(jī)制
1.3.3 NVM驅(qū)動(dòng)模塊
NVM即非易失性存儲(chǔ)器,下位機(jī)包含的NVM包括Flash和EEPROM,可通過TBLRD(讀表)、TBLWT(寫表)和NVM控制寄存器實(shí)現(xiàn)運(yùn)行時(shí)自編程。驅(qū)動(dòng)模塊提供統(tǒng)一的接口函數(shù) NVM_ Read、NVM_ Write和NVM_ Erase??紤]不同類型存儲(chǔ)單元的可編程數(shù)據(jù)大小不同,在接口函數(shù)中根據(jù)編程地址判斷編程區(qū)域,調(diào)用不同的接口函數(shù)實(shí)現(xiàn)不同類型存儲(chǔ)區(qū)域的編程。
以Flash編程為例,驅(qū)動(dòng)模塊提供Flash_CoreRead、Flash_CoreErase和Flash_CoreWrite函數(shù),由于讀寫操作應(yīng)遵循嚴(yán)格的時(shí)序要求,因此使用匯編語言編寫,部分代碼如下所示。
_Flash_CoreRead:
sub w3,#0,[w15]
bra z,2f
mov w1,_TBLPAG
1:
tblrdl [w0],[w2++]
tblrdh [w0++],[w2++]
dec w3,w3
bra nz,1b
2:
return
_Flash_CoreErase:
mov w1,_TBLPAG
tblwtl w1,[w0]
…,此處代碼為標(biāo)準(zhǔn)序列,可參考器件的數(shù)據(jù)手冊(cè)
return
_Flash_CoreWrite:
mov w1,_TBLPAG
mov #32,w3
tblwtl [w2++],[w0]
tblwth [w2++],[w0++]
dec w3,w3
bra nz,1b
…,此處代碼為標(biāo)準(zhǔn)序列,可參考器件的數(shù)據(jù)手冊(cè)
return
上位機(jī)程序使用MFC開發(fā),主要包含文件加載模塊、數(shù)據(jù)解析模塊、通信模塊和CAN驅(qū)動(dòng)模塊。文件加載模塊用于解析hex文件,將字符信息轉(zhuǎn)換為二進(jìn)制代碼信息;數(shù)據(jù)解析模塊按hex文件的格式解析程序信息,并將程序按地址存儲(chǔ)于緩沖區(qū)中;通信模塊用于實(shí)現(xiàn)上位機(jī)和下位機(jī)的之間的預(yù)定服務(wù), CAN驅(qū)動(dòng)模塊實(shí)現(xiàn)CAN報(bào)文的收發(fā)。上位機(jī)刷寫界面如圖6所示。
圖6 上位機(jī)軟件
本文介紹了dsPIC30F芯片基于CAN總線的BootLoader設(shè)計(jì)方法,該方法采用模塊化設(shè)計(jì),具有較好的移植性,理論上可適用于dsPIC30F系列的各型號(hào)產(chǎn)品。該BootLoader功能全面,既包含了啟動(dòng)管理、底層驅(qū)動(dòng)、通信服務(wù)等基本的功能模塊,實(shí)現(xiàn)了穩(wěn)定、可靠的程序下載功能;同時(shí),又通過自定義的通信服務(wù),簡(jiǎn)化了上、下位機(jī)的信息交互,適用于單片機(jī)資源緊張和要求快速移植的場(chǎng)合。本文設(shè)計(jì)的BootLoader占用空間小,代碼量約5KB,且已經(jīng)在某型號(hào)重型車輛的車身控制器中使用,通過實(shí)驗(yàn)驗(yàn)證,證明該BootLoader能夠可靠,正確的下載更新控制單元程序。
[1] 王志強(qiáng).基于MC9S12XEP100的BootLoader設(shè)計(jì)與實(shí)現(xiàn),汽車實(shí)用技術(shù),2018,(17).
[2] 張成雨,楊朝陽,單志文.基于CAN總線的車載應(yīng)用Bootloader設(shè)計(jì),湖北汽車工業(yè)學(xué)院學(xué)報(bào),2017,(12).
[3] dsPIC30F5011/5013數(shù)據(jù)手冊(cè).文檔號(hào):DS70116G_CN.
Design of BootLoader base on dsPIC30F
Luo Tuo, Cheng Wei, Chen Bokai, Du Langdong
( Shaanxi Heavy Automobile Co., Ltd., Shaanxi Xi’an 710200 )
Updating software in electronic controller by dedicated debug port is complicated,and always need to disassemble electronic controller which lower the stability.This paper introduce a design of BootLoader base on dsPIC30F,which uses the OBD connector to update software in electronic controller by CAN bus.The BootLoader mainly includes boot module design,communication module design and driver module design. Experimental results show that the BootLoader can update software successfully,occupys little flash rom,downloads quickly and works stably.
CAN BUS; BootLoader; dsPIC30F
10.16638/j.cnki.1671-7988.2019.10.027
U462
A
1671-7988(2019)10-76-03
U462
A
1671-7988(2019)10-76-03
雒拓 (1983),男,就職于陜西重型汽車有限公司 汽車工程研究院,從事汽車電子電器研究工作。