田洪杰 孔微
【摘 ?要】飛思卡爾MC9S12XS128控制器刷寫程序按照常規(guī)做法需要使用BDM下載器通過專用接口進(jìn)行刷寫,在車載控制器的開發(fā)過程中需要頻繁的進(jìn)行程序刷寫操作,傳統(tǒng)的刷寫方式操作十分不便。Bootloader技術(shù)能夠使用通用接口對單片機(jī)程序進(jìn)行刷寫,本文基于MC9S12XS128對Bootloader技術(shù)進(jìn)行了應(yīng)用和驗(yàn)證,并成功的實(shí)現(xiàn)了通過CAN接口對程序的刷寫操作。
【關(guān)鍵詞】Bootloader;單片機(jī);CAN總線
1. 技術(shù)背景
車載控制器的開發(fā)周期長,程序控制邏輯復(fù)雜,在開發(fā)過程中會(huì)經(jīng)常對控制器的程序進(jìn)行升級、更改。傳統(tǒng)的程序下載接口需要使用專用下載器進(jìn)行程序的刷寫、修改,當(dāng)控制器裝車后,如果需要修改程序,就需要重新拆卸控制器,操作極為不便。bootloader技術(shù)是預(yù)先在單片機(jī)中刷入一個(gè)底層服務(wù)程序,實(shí)現(xiàn)通過通用接口(如串口或者CAN接口)對單片機(jī)中的程序進(jìn)行刷寫,無需對控制器進(jìn)行重復(fù)拆裝,極大的方便了控制器的開發(fā)過程。也為后續(xù)產(chǎn)品程序的更新升級提供了更便捷的途徑。
MC9S12XS128簡介:
MC9S12XS128單片機(jī)是Freescale的一款成熟的16位經(jīng)型通用控制器,滿足車載環(huán)境要求,在汽車電子、工業(yè)控制等領(lǐng)域具有廣泛的應(yīng)用。本文將使用MC9S12XS128單片機(jī)并通過其CAN接口實(shí)現(xiàn)bootloader功能。
2. CANBootloader 總體設(shè)計(jì)
Bootloader使用CAN接口進(jìn)行數(shù)據(jù)通信,因此在單片機(jī)上電后需要對CAN接口進(jìn)行必要的初始化設(shè)置,當(dāng)初始化完成后,bootloader會(huì)監(jiān)聽通信接口的指令,如果收到bootloader刷寫命令,bootloader程序會(huì)跳轉(zhuǎn)到程序刷寫模式。接收上位機(jī)發(fā)送的程序數(shù)據(jù)并寫入到單片機(jī)的P-Flash中,即完成用戶程序的刷寫。在控制器實(shí)際使用時(shí),大多數(shù)情況下是為了執(zhí)行控制功能,因此在沒有刷寫任務(wù)時(shí)應(yīng)當(dāng)自動(dòng)跳轉(zhuǎn)到用戶程序執(zhí)行。在Bootloader的監(jiān)聽邏輯中,加入了一個(gè)延時(shí)判定條件,當(dāng)端口上長時(shí)間(2s)沒有收到來自上位機(jī)的連接指令,Bootloader將會(huì)跳轉(zhuǎn)到用戶程序的起始地址,并執(zhí)行用戶程序。
3. 自定義協(xié)議
Bootloader使用的是通用數(shù)據(jù)接口,在CAN總線上同時(shí)還會(huì)有其他數(shù)據(jù)的交互。因此需要給bootloader程序和上位機(jī)規(guī)定一套通信協(xié)議,來區(qū)分?jǐn)?shù)據(jù)指令和bootloader刷寫指令。本次設(shè)計(jì)中,將上位機(jī)的ID設(shè)置為02即只有報(bào)文的ID為02時(shí)才判定為執(zhí)行bootloader相關(guān)的指令,另外還規(guī)定了進(jìn)行flash操作的口令以及進(jìn)行flash擦除、flash寫入等指令操作的代碼等,協(xié)議規(guī)則如下。
4. 內(nèi)存劃分
Boot loader程序與用戶程序需要分別存儲在不同的內(nèi)存區(qū)域,這樣在程序執(zhí)行時(shí)才能避免兩個(gè)程序的數(shù)據(jù)相互干擾。因?yàn)锽oot loader程序在程序啟動(dòng)時(shí)就需要執(zhí)行,所以把bootloader劃分到存儲區(qū)域的起始區(qū)塊,剩余區(qū)域劃分為用戶區(qū)域,用于存儲用戶程序,用戶程序存儲區(qū)域的起始劃分為向量表地址。地址的劃分可以在程序工程的prm文件中進(jìn)行,具體的地址劃分如下。
0x4000 TO ? 0x43FF ;//1kB ?用于 bootloader
0x4400 TO ? 0x47FF RELOCATE_TO 0x3C00;//映射到RAM
0xC000 TO ? 0xDEFF ;//用戶程序中斷向量表
0xE100 TO ? 0xFEFF ;//用戶程序
劃分完成后在編寫程序時(shí)將程序按照劃分的地址進(jìn)行分配即可。
5. Bootloader 運(yùn)行實(shí)現(xiàn)
在Bootloader執(zhí)行flash刷寫操作時(shí),因?yàn)樗懙氖浅绦虼鎯^(qū)域,需要將程序(bootloader程序)復(fù)制到單片機(jī)RAM中運(yùn)行。在bootloader的通信程序中用到了CAN接收中斷,在RAM中運(yùn)行程序時(shí),需要將Bootloader 的中斷向量表映射到內(nèi)存中的相應(yīng)區(qū)域,程序復(fù)制到RAM和中斷向量偏移代碼如下。
MoveCodeIntoRam((byte *)0x4400, (byte *)0x3C00,0x400); //代碼復(fù)制到RAM
IVBR= 0x3F; ?//偏移中斷向量表
*(UINT16*)(0x3F00+0xB2)=(UINT16)CAN_receive; //中斷向量重定向
Bootloader程序復(fù)制到RAM中運(yùn)行后,就可以進(jìn)行P-Flash的刷寫操作。通過CAN接口接收上位機(jī)發(fā)送的數(shù)據(jù)并將數(shù)據(jù)寫入到對應(yīng)的地址。需要注意的是MC9S12XS128單片機(jī)在執(zhí)行Flash擦除操作時(shí)最小擦除單位是1扇區(qū),寫入時(shí)是一次寫入8個(gè)字節(jié)。當(dāng)bootloader完成Flash刷寫后,需要將程序的運(yùn)行位置跳轉(zhuǎn)到用戶程序,程序代碼如下。
asm LDX ?startaddr;
asm JMP ? 0,X ;
上位機(jī)發(fā)送的跳轉(zhuǎn)指令和啟動(dòng)后的超時(shí)跳轉(zhuǎn)判斷條件都能激活上述的跳轉(zhuǎn)語句。
6. S19文件解析及上位機(jī)通信實(shí)現(xiàn)
控制程序在CodeWarrior軟件中編譯完成后會(huì)自動(dòng)生成S19格式的文件,文件記錄了刷寫到MCU中的數(shù)據(jù)和對應(yīng)的地址。S19文件中的數(shù)據(jù)由很多行(又稱為記錄)組成,根據(jù)每行的起始標(biāo)注了記錄的類型、數(shù)據(jù)長度、存儲區(qū)的起始地址、數(shù)據(jù)以及數(shù)據(jù)校驗(yàn)。根據(jù)S19文件的規(guī)則,上位機(jī)可以解析出程序要刷寫的地址和要寫入的數(shù)據(jù)。上位機(jī)解析完數(shù)據(jù)后按照通信協(xié)議將刷寫指令和刷寫數(shù)據(jù)通過CAN接口傳送給單片機(jī),bootloader對相應(yīng)的存儲區(qū)域進(jìn)行刷寫操作,上位機(jī)的編寫過程本文不再贅述。
7. 結(jié)束語(功能、不足等)
本次設(shè)計(jì)通過實(shí)際驗(yàn)證,可以進(jìn)行控制器程序的刷寫,用戶程序正確運(yùn)行,并在某型控制器的開發(fā)過程中進(jìn)行了成功應(yīng)用。較傳統(tǒng)的程序刷寫方式節(jié)省了大量的時(shí)間。當(dāng)然,本次設(shè)計(jì)的bootloader通信指令較為簡單,僅對flash的基本讀寫操作做了規(guī)定,并沒有對接收到的S19文件數(shù)據(jù)進(jìn)行校驗(yàn),后續(xù)會(huì)繼續(xù)完善這部分的功能。
參考文獻(xiàn)
[1] 發(fā)動(dòng)機(jī)控制器在線升級系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 稅靜,吳長水. ?農(nóng)業(yè)裝備與車輛工程. 2020(06).
[2] 混合動(dòng)力汽車電機(jī)控制器硬件設(shè)計(jì)與CAN通信[J]. 彭朝亮,馮國勝,袁新華. ?農(nóng)業(yè)裝備與車輛工程. 2017(03).
[3]王宜懷,曹金華. 嵌入式系統(tǒng)設(shè)計(jì)實(shí)戰(zhàn)——基于飛思卡爾S12微控制器 [M]. 北京:北京航空航天大學(xué)出版社,2011:289-313.
[4]王亞剛.嵌入式 Bootloader 機(jī)制的分析和移植[J].計(jì)算機(jī)工程,2010,36(6):267-269.