孫 瑞, 徐建國(guó), 馬 偉, 楊玉柱
(上海采埃孚轉(zhuǎn)向系統(tǒng)有限公司, 上海 201821)
在某款車(chē)用網(wǎng)關(guān)控制器的開(kāi)發(fā)過(guò)程中,為了方便實(shí)現(xiàn)網(wǎng)關(guān)控制器的實(shí)車(chē)調(diào)試和程序更新,需要設(shè)計(jì)出一種通過(guò)CAN總線即可刷寫(xiě)應(yīng)用程序的軟件.CAN(Controller Area Network)總線是一種主流的車(chē)用現(xiàn)場(chǎng)總線,具備標(biāo)準(zhǔn)化的通信格式,其信號(hào)傳輸?shù)膶?shí)時(shí)性、可靠性和準(zhǔn)確性等優(yōu)點(diǎn)使其獲得汽車(chē)行業(yè)內(nèi)的廣泛認(rèn)可.因此,CAN總線成為本文設(shè)計(jì)BootLoader系統(tǒng)的首選通信介質(zhì).在CAN總線協(xié)議與S19文件協(xié)議的基礎(chǔ)上,本文又引入了一個(gè)自定義的通信協(xié)議,以實(shí)現(xiàn)BootLoader與上位機(jī)之間的命令和狀態(tài)傳遞.該BootLoader系統(tǒng)簡(jiǎn)單、可靠,無(wú)需應(yīng)用程序本身做任何適應(yīng)性更改,因此同樣適用于以XET256為平臺(tái)的其他控制器開(kāi)發(fā)項(xiàng)目.
Bootloader稱(chēng)為系統(tǒng)的引導(dǎo)加載程序,是系統(tǒng)加電或復(fù)位后執(zhí)行的第一段代碼[1],其主要作用是實(shí)現(xiàn)應(yīng)用程序的更新以及引導(dǎo)應(yīng)用程序的執(zhí)行.基于這一基本思路,在設(shè)計(jì)BootLoader時(shí)首先要考慮的問(wèn)題是BootLoader與應(yīng)用程序在Flash中應(yīng)如何劃分,以保證二者所占用的存儲(chǔ)空間不能相互沖突.其次,控制器上電后,應(yīng)該首先執(zhí)行BootLoader,由BootLoader決定是進(jìn)行程序的更新還是進(jìn)入應(yīng)用程序執(zhí)行.然后,在控制器上電后,BootLoader開(kāi)始執(zhí)行時(shí),應(yīng)以操作員即上位機(jī)的指令為判斷依據(jù),來(lái)控制程序執(zhí)行的方向.在應(yīng)用程序刷寫(xiě)過(guò)程中,還應(yīng)對(duì)上位機(jī)的命令及命令執(zhí)行情況進(jìn)行反饋,以使操作員明確應(yīng)用程序是否成功更新.最后,BootLoader應(yīng)能夠根據(jù)規(guī)定好的協(xié)議,將通過(guò)CAN總線接收到的應(yīng)用程序數(shù)據(jù)準(zhǔn)確地寫(xiě)入.
設(shè)計(jì)BootLoader時(shí)需充分考慮對(duì)ECU存儲(chǔ)器的分配[2],在飛思卡爾編譯器CodeWarrior中,程序和數(shù)據(jù)存儲(chǔ)空間的劃分工作是在prm文件中完成的.以關(guān)鍵字SEGMENTS和END為標(biāo)志.Flash存儲(chǔ)空間的關(guān)鍵字為READ_ONLY.
XET256中P-Flash地址范圍為0x4000~0xFFFF[3].其中,0xFF0F~0xFFFF為中斷向量區(qū),0xFF00~0xFF0E為Flash配置區(qū),主要用于P-Flash寫(xiě)保護(hù)等功能.剩下的地址范圍0x4000~0xFEFF開(kāi)放給用戶,用于存儲(chǔ)用戶程序代碼.受限于16位尋址能力,P-Flash被分為非分頁(yè)區(qū)(unpagedFlash)和分頁(yè)區(qū)(paged Flash).非分頁(yè)區(qū)(0x4000~0x7FFF與0xC000~0xFFFF)可直接用16位地址尋址.而分頁(yè)區(qū)(0x8000~0xBFFF)則必須用24位地址尋址.
為了給網(wǎng)關(guān)控制器應(yīng)用程序提供更多的代碼空間,以及便于實(shí)現(xiàn)BootLoader寫(xiě)保護(hù)等目的,將BootLoader程序安排在從0xFEFF開(kāi)始往上數(shù)的一段區(qū)域,其大小可根據(jù)具體代碼量調(diào)整,本文將其定義為3.75K,即地址范圍為0xF000~0xFEFF.
在對(duì)P-Flash擦除與寫(xiě)入操作的時(shí)候,不允許同時(shí)對(duì)其進(jìn)行讀取,否則可能導(dǎo)致Flash的損壞[4].本著這一原則,對(duì)Flash的擦除、寫(xiě)入以及CAN中斷信號(hào)的處理代碼,應(yīng)復(fù)制到RAM中運(yùn)行.這一功能可通過(guò)關(guān)鍵字RELOCATE_TO實(shí)現(xiàn).因此,在劃分Flash的同時(shí)也應(yīng)對(duì)RAM進(jìn)行劃分,以實(shí)現(xiàn)這一功能.定義RAM的關(guān)鍵字為READ_WRITE.P-Flash與RAM的實(shí)際劃分如圖1和圖2所示.
圖1 P-Flash劃分圖
圖2 RAM劃分圖
如前所述,非分頁(yè)區(qū)Flash的地址唯一,可直接采用16位邏輯地址進(jìn)行尋址.但0x8000~0xBFFF這一分頁(yè)區(qū)共由14頁(yè)組成,具體尋址到哪一頁(yè)取決于PPAGE寄存器.其地址變?yōu)榱?位頁(yè)地址加16位具體地址,即24位地址.如PPAGE寄存器的默認(rèn)值為0xFE,則邏輯地址0xFE_8000表示0xFE這一頁(yè)的0x8000地址.
由于存在以上地址表示方式的不同(16位與24位),在對(duì)Flash進(jìn)行擦寫(xiě)時(shí),如果直接采用邏輯地址,不僅關(guān)系復(fù)雜,而且容易出錯(cuò).而采用全局地址,可使表示方式單一,容易尋址.所謂全局地址是由頁(yè)寄存器PPAGE的值以及邏輯地址按一定關(guān)系組成的24位地址.這種表示方式使得Flash存儲(chǔ)單元的地址線性且唯一,便于操作.邏輯地址轉(zhuǎn)換為全局地址的關(guān)系式為
GA=0x400000|((((dword)(PA))<<14)|
(LA&0x3FFF))
(1)
式中,LA表示邏輯地址,PA表示PPAGE寄存器值,GA表示全局地址.當(dāng)邏輯地址位于0x4000~0x7FFF時(shí),PA的值為0xFD;當(dāng)邏輯地址位于0xC000~0xFFFF時(shí),PA的值為0xFF;當(dāng)邏輯地址位于分頁(yè)區(qū)時(shí),PA的值取決于具體頁(yè),默認(rèn)值為0xFE.
采用全局地址后,F(xiàn)lash在全局地址表示方式下的劃分如圖3所示.由于劃分Flash時(shí)只需關(guān)注分界線,因此,在prm文件中,依然采用邏輯地址進(jìn)行劃分.從圖3可以看出,XET256的256K Flash是由不連續(xù)的兩個(gè)Block(0/1)組成的,每一個(gè)Block為128K.
圖3 全局地址表示下的Flash劃分
飛思卡爾16位單片機(jī)在復(fù)位后總是從優(yōu)先級(jí)最高的中斷向量地址0xFFFE處取第一條執(zhí)行指令[4].因此,BootLoader可執(zhí)行代碼的首地址應(yīng)安排在此處,以保證上電后BootLoader的首先執(zhí)行.這可以通過(guò)在prm文件中定義VECTOR 0來(lái)實(shí)現(xiàn),即將VECTOR 0定義為BootLoader程序的入口地址.然而,網(wǎng)關(guān)應(yīng)用程序在編寫(xiě)時(shí)也會(huì)對(duì)VECTOR 0進(jìn)行定義,以實(shí)現(xiàn)在單片機(jī)上電后直接執(zhí)行應(yīng)用程序的目的.由于存在這一中斷資源沖突,因此,BootLoader在刷寫(xiě)時(shí)需要對(duì)網(wǎng)關(guān)應(yīng)用程序的中斷向量表進(jìn)行重新分配.
默認(rèn)情況下,XET256的中斷向量表位于0xFF0F~0xFFFF區(qū)間[3].這一特性是由中斷向量基址寄存器IVBR在上電后總是默認(rèn)為0xFF所確定的.一條可執(zhí)行的中斷向量地址是由基址(IVBR寄存器的值)加偏移組成的.如復(fù)位中斷向量地址0xFFFE,即表示IVBR的值為0xFF,該中斷向量的偏移為0xFE.在一款特定的單片機(jī)中,任一硬件中斷向量相對(duì)于基址的偏移總是確定的.因此,通過(guò)改變IVBR寄存器的值,即可實(shí)現(xiàn)中斷向量表的更改.本文設(shè)計(jì)的BootLoader在引導(dǎo)進(jìn)入應(yīng)用程序之前將應(yīng)用程序中斷向量表基址IVBR更改為0xEF,即經(jīng)過(guò)BootLoader重新分配后,應(yīng)用程序中斷向量表位于0xEF0F~0xEFFF.在刷寫(xiě)應(yīng)用程序時(shí),若BootLoader檢測(cè)到地址為0xFF0F~0xFFFF的代碼數(shù)據(jù),則將其地址更改為0xEF0F~0xEFFF,然后在新的地址上將數(shù)據(jù)寫(xiě)入.由于存在這一安排,應(yīng)用程序非中斷向量代碼的存儲(chǔ)不得位于0xEF0F以下,這也是本文設(shè)計(jì)的BootLoader對(duì)應(yīng)用程序的唯一要求.
在對(duì)P-Flash進(jìn)行擦除與寫(xiě)入的過(guò)程中,所使用的硬件資源CAN通道依然在進(jìn)行正常工作,當(dāng)其接收到有效數(shù)據(jù)后,即可使單片機(jī)自行進(jìn)入中斷處理服務(wù).單片機(jī)將從所選CAN通道的中斷服務(wù)地址處讀取CAN中斷服務(wù)代碼的首地址.如前所述,P-Flash在擦除過(guò)程中不允許對(duì)其進(jìn)行讀取,因此,這種由CAN通道中斷所導(dǎo)致的操作應(yīng)加以避免.本設(shè)計(jì)采取的解決方案是BootLoader進(jìn)入刷寫(xiě)程序后,在擦除與寫(xiě)入P-Flash之前將中斷向量表更改至RAM中.本文將IVBR更改為0x3F,即在BootLoader執(zhí)行刷寫(xiě)程序時(shí),實(shí)際中斷向量表為0x3F00~0x3FF0.
為實(shí)現(xiàn)BootLoader與上位機(jī)之間的命令和狀態(tài)傳輸,本文在標(biāo)準(zhǔn)的CAN協(xié)議基礎(chǔ)上,定義了一套簡(jiǎn)單的通信協(xié)議.該協(xié)議中所使用的命令和狀態(tài)均以報(bào)文ID表示,即每一個(gè)ID代表一個(gè)特定的命令或狀態(tài).根據(jù)本文所涉及項(xiàng)目的相關(guān)要求,刷寫(xiě)過(guò)程中使用的報(bào)文ID不能與整車(chē)網(wǎng)絡(luò)中其他節(jié)點(diǎn)用到的ID相同,因此本協(xié)議報(bào)文ID的選擇范圍為0x500~0x5FF.具體選擇報(bào)文ID及協(xié)議見(jiàn)表1.
表1通信協(xié)議表
在系統(tǒng)上電后,BootLoader將初始化堆棧、配置系統(tǒng)時(shí)鐘,并初始化所選CAN通道.當(dāng)CAN通道正常工作后,BootLoader將等待20ms,如果在這段時(shí)間內(nèi)接收到上位機(jī)進(jìn)入刷寫(xiě)程序的指令或檢測(cè)到應(yīng)用程序不存在,則執(zhí)行應(yīng)用程序更新操作;否則,跳轉(zhuǎn)至應(yīng)用程序執(zhí)行.如直接跳轉(zhuǎn)至應(yīng)用程序執(zhí)行,則應(yīng)首先配置中斷寄存器基址,然后,將單片機(jī)指針更改為應(yīng)用程序復(fù)位向量地址,本文設(shè)計(jì)為0xEFFE.采用這一策略無(wú)需應(yīng)用程序配合,但要求操作員如需更新應(yīng)用程序,則應(yīng)在系統(tǒng)上電前將上位機(jī)啟動(dòng),以保證BootLoader能接收到相應(yīng)指令.BootLoader工作流程如圖4所示.
圖4 BootLoader工作流程圖
若執(zhí)行應(yīng)用程序更新操作,首先應(yīng)配置P-Flash時(shí)鐘,使其工作頻率為用戶手冊(cè)推薦的0.8~1.05MHz[3],這可以通過(guò)設(shè)置FCLKDIV寄存器的值來(lái)實(shí)現(xiàn).P-Flash的時(shí)鐘源為外部晶振,本文所選的外部晶振頻率為16MHz,查用戶手冊(cè)將FCLKDIV寄存器的值設(shè)置為0x0F.然后,將P-Flash中定義好的BootLoader擦/寫(xiě)/中斷處理代碼拷貝至RAM中劃分好的區(qū)間0x3D00~0x3EFF處.接著,將中斷向量表配置到RAM中.當(dāng)所有BootLoader更新應(yīng)用程序所需的環(huán)境都準(zhǔn)備好后,就可以對(duì)P-Flash進(jìn)行擦除與寫(xiě)入操作.應(yīng)用程序更新操作流程圖如圖5所示.
圖5 應(yīng)用程序更新流程圖
應(yīng)用程序擦除代碼存儲(chǔ)在P-Flash中,在執(zhí)行時(shí)拷貝到RAM中執(zhí)行.XET256支持將P-Flash以Sector(每個(gè)Sector的大小為1K)和Block為單位進(jìn)行擦除.對(duì)于Block1(0x78_0000~0x79_FFFF)可按Block為單位整體擦除.而對(duì)于Block0應(yīng)只擦除屬于應(yīng)用程序的部分,即0x7E_0000~0x7F_EFFF的區(qū)間,此處應(yīng)以Sector為單位進(jìn)行擦除.擦除過(guò)程如圖6所示,首先等待其它Flash命令執(zhí)行完畢,然后清除Flash狀態(tài)寄存器中的故障碼,之后即可通過(guò)配置Flash控制寄存器FCCOB的值來(lái)選擇擦除命令與擦除區(qū)域.
圖6 應(yīng)用程序擦除操作
Flash控制寄存器FCCOB由6個(gè)字組成,通過(guò)選擇寄存器FCCOBIX可分別對(duì)6個(gè)字進(jìn)行配置[3].其中,F(xiàn)CCOB第1個(gè)字的高8位代表具體Flash命令,如0x09表示執(zhí)行按Block擦除命令;0x0A表示執(zhí)行按Sector擦除命令;0x06表示寫(xiě)Flash命令.FCCOB第1個(gè)字的低8位代表全局地址的高8位.FCCOB第2個(gè)字表示全局地址的低16位.FCCOB的第3到第6個(gè)字則用于存放需要寫(xiě)入的數(shù)據(jù),擦除操作時(shí)不需要,但執(zhí)行寫(xiě)入操作時(shí)需要.Flash控制寄存器配置好后,即可通過(guò)將Flash狀態(tài)寄存器的最高位寫(xiě)1來(lái)執(zhí)行FCCOB中存儲(chǔ)的命令和數(shù)據(jù).之后,利用Flash狀態(tài)寄存器來(lái)判斷操作是否成功執(zhí)行完畢.
BootLoader成功將P-Flash擦除后,即向上位機(jī)發(fā)送成功擦除信號(hào),通知上位機(jī)發(fā)送新的應(yīng)用程序數(shù)據(jù).上位機(jī)傳輸給BootLoader的數(shù)據(jù)格式采用S19文件協(xié)議,而且每一個(gè)地址或數(shù)據(jù)等信息均以字符的形式發(fā)送.
4.4.1 S19協(xié)議解析
S19文件是飛思卡爾推薦使用的標(biāo)準(zhǔn)程序下載文件,該文件格式由記錄類(lèi)型、記錄長(zhǎng)度、存儲(chǔ)地址、代碼數(shù)據(jù)和校驗(yàn)碼5個(gè)部分組成[5].S19文件的每一行總是以“S”開(kāi)始,其后的一位數(shù)字表示該行記錄的類(lèi)型.如S0表示該行記錄為說(shuō)明性信息,非程序數(shù)據(jù);S1表示該行記錄為程序數(shù)據(jù)且地址為16位地址,S2則表示該行記錄為程序數(shù)據(jù)且地址為24位地址;S9表示該行為整個(gè)S19文件的結(jié)束行.由于本文在擦、寫(xiě)時(shí)采用全局地址,所以經(jīng)式(1)轉(zhuǎn)化后的S19文件只包括S0、S2和S9.記錄類(lèi)型之后的一個(gè)字節(jié)表示其后該行記錄所包含的字節(jié)長(zhǎng)度.緊接著的3個(gè)字節(jié)表示目標(biāo)地址,之后是寫(xiě)入目標(biāo)地址的數(shù)據(jù).最后一個(gè)字節(jié)為該行記錄的校驗(yàn)碼,校驗(yàn)碼加代表信息長(zhǎng)度、目標(biāo)地址、寫(xiě)入目標(biāo)地址數(shù)據(jù)的所有字節(jié)的和為0xFF.
BootLoader通過(guò)CAN中斷接收到ID為0x50F的S19數(shù)據(jù)幀后,會(huì)將數(shù)據(jù)依次存入指定緩存中,然后周期性地對(duì)緩存數(shù)據(jù)進(jìn)行組織和解析.由于上位機(jī)發(fā)過(guò)來(lái)的數(shù)據(jù)全部為字符的形式,因此,首先應(yīng)將字符轉(zhuǎn)化為16進(jìn)制數(shù),然后整理成以字節(jié)為單位的有效數(shù)據(jù).如在解析信息長(zhǎng)度時(shí),應(yīng)連續(xù)讀取兩個(gè)字符,將其分別轉(zhuǎn)化為16進(jìn)制數(shù)后,第1個(gè)數(shù)左移4位加第2個(gè)數(shù),這樣即可整理為一個(gè)有效的字節(jié)數(shù)據(jù).
在對(duì)S19文件進(jìn)行解析時(shí),首先判斷接收到的第一個(gè)字節(jié)是否為'S'以及第二個(gè)字節(jié)是否為'0'、'2'或'9',如果不符合則舍棄該條信息.若符合則開(kāi)始對(duì)信息長(zhǎng)度、地址、數(shù)據(jù)和校驗(yàn)碼的解析,然后按照S19協(xié)議對(duì)校驗(yàn)碼進(jìn)行校驗(yàn),如果校驗(yàn)結(jié)果為有效則將目標(biāo)地址、寫(xiě)入目標(biāo)地址的數(shù)據(jù)放到相應(yīng)的緩存中.至此,一條S19信息被成功解析.
4.4.2 P-Flash數(shù)據(jù)寫(xiě)入
當(dāng)一條有效的S19信息被接收并成功解析后,還應(yīng)對(duì)該信息做進(jìn)一步判斷.如果接收的是S9或接收過(guò)程中有錯(cuò)誤,則直接退出數(shù)據(jù)寫(xiě)入程序;如果是S0,則予以忽略;如果是S2,則按照解析出的目標(biāo)地址,將程序數(shù)據(jù)寫(xiě)入.
在數(shù)據(jù)寫(xiě)入之前,應(yīng)對(duì)目標(biāo)地址進(jìn)行判斷.若目標(biāo)地址位于中斷向量區(qū),則首先按第3節(jié)所述對(duì)其進(jìn)行更改,然后再執(zhí)行數(shù)據(jù)寫(xiě)入程序;若目標(biāo)地址不位于中斷向量區(qū),但超出了第2節(jié)所規(guī)定的應(yīng)用程序區(qū)域,則拒絕執(zhí)行寫(xiě)入程序.
Codewarrior編譯器生成的S19文件連續(xù)地址之差為32的整數(shù)倍,即每一條S19信息涵蓋32個(gè)字節(jié)的P-Flash數(shù)據(jù)信息,即使轉(zhuǎn)化成全局地址后,這一規(guī)則依然不變.FCCOB寄存器中有4個(gè)字,即8個(gè)字節(jié)用于存放程序數(shù)據(jù).因此,每一條S19信息中的數(shù)據(jù)可以分4次寫(xiě)入,每一次的寫(xiě)入方法如4.3所述.
BootLoader系統(tǒng)中的上位機(jī)基于Labview開(kāi)發(fā),其基本工作原理是:首先讀取S19文件,然后按行將S19文件中的十六進(jìn)制數(shù)轉(zhuǎn)換為相應(yīng)的字符串?dāng)?shù)組,并補(bǔ)以行結(jié)束符.整合好的字符串?dāng)?shù)組會(huì)以8個(gè)字符為一組通過(guò)PEAK CAN工具轉(zhuǎn)成CAN信號(hào)發(fā)送給網(wǎng)關(guān)控制器(最后一次不足8個(gè)的字符串發(fā)送實(shí)際字符長(zhǎng)度).
由于本文設(shè)計(jì)的BootLoader系統(tǒng)無(wú)需應(yīng)用程序做適應(yīng)性更改,因此,上位機(jī)必須在跳轉(zhuǎn)到應(yīng)用程序之前啟動(dòng).上位機(jī)啟動(dòng)后即向網(wǎng)關(guān)控制器發(fā)送握手指令,若后者沒(méi)有反饋,上位機(jī)將連續(xù)10s發(fā)送該指令.這一策略要求操作員應(yīng)在啟動(dòng)上位機(jī)后10s內(nèi)將網(wǎng)關(guān)控制器上電或復(fù)位.若BootLoader接收到握手指令,并成功進(jìn)行反饋,上位機(jī)將退出握手環(huán)節(jié),并進(jìn)入等待刷寫(xiě)環(huán)節(jié).握手成功后,BootLoader將自行進(jìn)入環(huán)境配置及擦除P-Flash過(guò)程,擦除成功后將向上位機(jī)發(fā)送擦除成功信號(hào).上位機(jī)接收到該信號(hào)即退出等待,逐條發(fā)送S19文件.BootLoader接收并解析S19文件,寫(xiě)入成功后向上位機(jī)發(fā)送寫(xiě)入成功信號(hào).若上位機(jī)在發(fā)送完最后一條S19信息后一段時(shí)間內(nèi)沒(méi)有接收到寫(xiě)入成功信號(hào),則默認(rèn)為本次程序更新失敗.程序更新成功后,需操作員手動(dòng)復(fù)位網(wǎng)關(guān)控制器,從而執(zhí)行新的應(yīng)用程序.整個(gè)操作過(guò)程及系統(tǒng)狀態(tài)均會(huì)在上位機(jī)中實(shí)時(shí)顯示.BootLoader系統(tǒng)上位機(jī)工作流程如圖7所示.
圖7 BootLoader系統(tǒng)上位機(jī)工作流程
本文設(shè)計(jì)的BootLoader系統(tǒng)幾乎無(wú)需應(yīng)用程序做任何適應(yīng)性更改,因此可直接在其他以XET256為平臺(tái)的產(chǎn)品上運(yùn)行.試驗(yàn)證明,該系統(tǒng)操作方便、實(shí)現(xiàn)簡(jiǎn)單、運(yùn)行可靠,能夠正確地實(shí)現(xiàn)網(wǎng)關(guān)應(yīng)用程序更新,從而大大方便了網(wǎng)關(guān)控制器的實(shí)車(chē)調(diào)試,加快了項(xiàng)目進(jìn)度.
[1] 王伏,張忠能,杭勇.基于CAN總線的電控單元程序引導(dǎo)加載功能開(kāi)發(fā)[J].微型電腦應(yīng)用,2011,27(2):30-32.
[2] 奚英澤,于健楠,徐鳳.基于飛思卡爾MPC5634M單片機(jī)的Bootloader設(shè)計(jì)[C]//中國(guó)汽車(chē)工程學(xué)會(huì).2013中國(guó)汽車(chē)工程學(xué)會(huì)年會(huì)論文集.北京:中國(guó)學(xué)術(shù)期刊電子出版社,2013:566-569.
[3] Freescale.MC9S12XEP100RMV1(1.25)[M/OL].(2013-02)[2014-03-28]. http://www.freescale.com/files/microcontrollers/doc/data sheet/MC9S12XEP100RMV1.pdf.
[4] 羅峰,孫澤昌.汽車(chē)CAN總線系統(tǒng)原理、設(shè)計(jì)與應(yīng)用[M].北京:電子工業(yè)出版社,2010.
[5] 張夕杰,李清政,王喬.MPC5534單片機(jī)在線程序更新系統(tǒng)研制[J].國(guó)外電子測(cè)量技術(shù),2013(12):49-52.