摘 要: 介紹了一種在Silicon Labs公司的C8051F34x系列單片機上實現(xiàn)USB Bootloader的設(shè)計方法,,使應(yīng)用程序可以通過USB或COM通信實現(xiàn)遠程在線升級。首先,,簡述了USB Bootloader,;然后,詳細闡述了USB Bootloader程序的設(shè)計和APP固件程序的設(shè)計,,以及設(shè)計中需要注意的問題,;最后,用VC++開發(fā)上位機軟件來完成該Bootloader的遠程在線下載功能,。該Bootloader可以很方便地在其他類似單片機上移植,,通用性強。
關(guān)鍵詞: C8051F34x,;USB Bootloader,;遠程升級
Bootloader(以下簡稱BL)是一段引導(dǎo)程序,在單片機上電或復(fù)位后在應(yīng)用程序(以下簡稱APP)之前先運行,,來判斷當前是否需要進入升級狀態(tài),。如果不需要升級,就直接跳轉(zhuǎn)到APP運行,;如果需要升級,,首先擦除舊的APP,然后通過某種通信接收APP固件程序,,同時寫入Flash中,。
BL固件程序能以多種方式獲取數(shù)據(jù),,包括串口、并口,、I2C,、SPI、USB等,,但是從實際使用和成熟度來看,,使用串口無疑是最方便的。如今,,USB總線憑借其方便,、快速、靈活,、穩(wěn)定,、應(yīng)用范圍廣等優(yōu)點被廣泛地應(yīng)用、發(fā)展和普及,,使用USB進行數(shù)據(jù)傳輸是一種趨勢,。本文設(shè)計的BL主要基于USB通信,同時考慮到模塊兼容,,保留了串口通信,。
一般來說,,一個BL應(yīng)該能夠完成以下功能:(1)通過某種通信收發(fā)數(shù)據(jù),;(2)擦除并升級APP應(yīng)用固件程序;(3)判斷APP固件的完整性,;(4)APP與BL的中斷跳轉(zhuǎn)問題,。而基于USB通信的BL,除了要完成一般BL的功能,,還需要考慮BL與APP共用除USB中斷外的USB一般處理函數(shù)等問題,。下面對BL固件程序設(shè)計、APP固件程序設(shè)計以及上層軟件設(shè)計進行詳細介紹,。
1 USB Bootloader設(shè)計
1.1 硬件平臺
本文設(shè)計的USB BL是基于Silicon Labs公司C8051F34x系列單片機實現(xiàn)的,;C8051F34x器件是完全集成的混合信號片上系統(tǒng)型MCU,具有片內(nèi)上電復(fù)位,、VDD監(jiān)視器,、電壓調(diào)整器、看門狗定時器,、時鐘丟失檢測器,、時鐘振蕩器、USB,、SMBus/I2C,、UART,、SPI、定時器,、I/O,、多達4 352 B片內(nèi)RAM和64 KB的片內(nèi)Flash存儲器,F(xiàn)lash存儲器還具有在系統(tǒng)重新編程的能力,,可用于非易失性數(shù)據(jù)存儲,,并允許現(xiàn)場更新8051固件。
C8051F34x器件集成了一個完整的全速/低速USB功能控制器,,剛開始設(shè)計時采用C8051F34x自帶的USB,,但是靜電測試不符合要求,最終選用了C8051F34x和PDIUSBD12組合,,解決了靜電問題,。
PDIUSBD12是一款性價比很高的USB器件,它符合USB1.1版規(guī)范,,可與任何外部微控制器實現(xiàn)高速并行接口(2 Mb/s),,具有良好的EMI特性,高于8 kV的在片靜電防護電路等,,詳細資料請查詢參考文獻[3],。
1.2 BL和APP固件的地址分配
USB BL預(yù)計將占用8 KB的地址空間,從0x0000h到0x1FFFh,,包括USB BL固件程序本身和用來判斷程序是運行APP還是BL的一段簽名程序,。BL與APP地址空間分配如圖1所示,APP固件程序存放的地址空間從0x2000h開始,。
1.3 BL和APP的自動跳轉(zhuǎn)
在程序中,,設(shè)置一個設(shè)備模式標志位,用來判斷程序是應(yīng)該運行在BL中還是在APP中,,此標志位存儲在RAM的一個固定地址2F7h處,。本文設(shè)計的BL,DEVICE_MODE為設(shè)備模式標志位,,其值等于1時為BL_MODE(BL模式),,其值等于0為APP_MODE(APP模式)。
有兩種情況設(shè)備模式為BL模式,,可以下載更新APP固件程序:一是在指定的簽名地址處沒有指定的兩字節(jié)的簽名,;二是Flash寫錯誤,在C8051F34x單片機中,, Flash讀地址超出了用戶代碼空間,,即MOVC操作的地址大于0xFBFF,發(fā)生Flash錯誤復(fù)位后,,F(xiàn)ERROR位(RSTSRC.6)被置位,。
上電后是否運行APP固件程序通過第一種情況判斷,。當需要更新APP固件程序時,造成Flash寫錯誤,,通過第二種情況進入BL模式,,開始更新程序,如圖2所示,。
1.4 中斷重定位
一般情況下,,MCU中斷向量分布在復(fù)位(0x0000)以后,位于低地址空間,。由于BL程序占據(jù)了此段空間,,因此,除了USB0中斷(中斷序列表第8號中斷)和串口中斷(中斷序列表第5號中斷),,其他所有的中斷(C8051F34x共有16個通用中斷)都需要做中斷二次映射,。也就是說,需要在原中斷向量入口地址處手動添加二次跳轉(zhuǎn)函數(shù),,使新的中斷向量指向用戶的中斷程序,,這樣才能保證正常運行APP固件程序的中斷程序。具體的跳轉(zhuǎn)地址由APP固件程序起始地址決定,,這一部分在START51.A51中通過編寫函數(shù)來完成,。假設(shè)固件的起始地址設(shè)置為0x2000H,則中斷跳轉(zhuǎn)的實現(xiàn)過程如下,。
首先定義幾個常量:
HW_INTVEC_TABLE EQU 0003h
HW_INTVEC_SEPARATION EQU 8
INTVEC_TABLE EQU START_APPLICATION+3
INTVEC_SEPARATION EQU8
START_APPLICATION EQU2000h
中斷向量重映射:
CSEG AT HW_INTVEC_TABLE +
(HW_INTVEC_SEPARATION*INT_NUM)LJMP
INTVEC_TABLE+(INTVEC_SEPARATION
*INT_NUM)
//以定時器2中斷為例(第5號中斷)
CSEG AT0003h+8h*5h=002Bh
LJMP 2000h+0003h+8h*5h=202Bh
1.5 中斷處理函數(shù)
8號USB中斷由于同時要被BL固件和APP固件調(diào)用,,因此不能對其進行二次跳轉(zhuǎn),而通過共享的USB庫文件中的USB_ISR主中斷處理函數(shù)進行處理,,通過DEVICE_MODE判斷當前設(shè)備處于BL模式或APP模式來自動地二次跳轉(zhuǎn)到BL固件或APP固件的USB中斷處理函數(shù)處,,如圖3所示,。
需要注意的是,,4號串口中斷同樣要被兩者所調(diào)用,因此對4號中斷的處理與8號中斷相同,。先由4號中斷入口地址跳轉(zhuǎn)到原地址處,,然后在此地址處根據(jù)設(shè)備模式進行中斷分流,決定是到BL還是到APP的中斷處理函數(shù)處,。
1.6 USB BL命令函數(shù)
BL固件程序中的命令函數(shù)如表1所示,。
(1)Erase Page:擦除APP固件程序和簽名;
(2)Write Page:將APP固件程序的HEX文件寫入Flash,;
(3)Write Signature:APP固件程序?qū)慒lash成功后,,將簽名寫入指定的地址處,表示APP固件已經(jīng)存在于Flash中,;
(4)Get Version:取BL程序的版本號,。
2 APP固件程序設(shè)計
使用USB BL,,需要對APP固件程序進行一些添加和修改。
(1) 由于BL占用了0x0000~0x1FFF的空間,,APP固件程序是以0x2000h作為起始地址的,,這樣就需要修改APP程序的偏移量。
?、傩薷腟TARTUP.A51文件,,把“CSEG AT 0”變?yōu)?ldquo;CSEG AT 2000h”;
?、邳c擊Porject->Options for Target‘Target1’,,點擊C51項目欄,把Interrupt vectors address欄選中,,內(nèi)容改為0x2000,,點擊BL51 Locate項目欄,將code項改為0x2000,。
(2)APP固件程序應(yīng)該具備從APP轉(zhuǎn)到BL的功能,,需要增下以下代碼:
①main()主函數(shù)中增加接收更新APP固件程序的命令字以及對此命令的處理代碼,,使用BOOTLOAD_REQ()命令來觸發(fā)一次Flash讀復(fù)位,,使器件進入BL模式;
?、谠赟TARTUP.A51文件增加以下代碼:
//造成Flash寫錯誤地址定義
PUBLICBOOTLOAD_REQ
BOOTLOAD_REQ EQU 0FFFFh
?、墼陬^文件中添加函數(shù)聲明:
void BOOTLOAD_REQ(void)
(3)去掉與BL重復(fù)的USB通信函數(shù)部分,特別是要去掉Control_USB()函數(shù)(該函數(shù)主要完成設(shè)備請求處理函數(shù)),,因為此函數(shù)在BL中已經(jīng)實現(xiàn),,并且用絕對地址固定,應(yīng)用程序只需跳轉(zhuǎn)到固定的絕對地址處即可,,修改如下:
?、僭赟TARTUP.A51文件增加以下代碼:
//control_usb地址定義
PUBLIC Control_USB
//USB通信產(chǎn)生的外部中斷1在APP固件的入口地址
Control_USB EQU 1300h
②注意需要在BL中先定義Control_USB的入口地址,,方法如下:在BL工程下,,Porject->Options for Target ‘Target1’,點擊BL51 Locate項目欄,,將code項修改為
,?PR?VCONTROL_USB,?BOOTLOADER_F340(0x1300),;
(4)修改USB中斷處理函數(shù):由于USB控制器采用PDIUSBD12,其中斷引腳INT_N接C8051F34x的P0.7引腳,且該引腳被配置為外部中斷1,,電平觸發(fā)方式,,低電平有效。因此應(yīng)在外部中斷1中斷處理函數(shù)中獲取USB中斷源并進入相應(yīng)的子程序進行處理,。
(5)USB設(shè)備的枚舉過程在BL中完成,,因此PID、VID是BL程序所決定的,,需要在BL中改變此處的值以適應(yīng)自己的模塊,。
(6)保護被BL使用的位,DEVICE_MODE的位地址,,在STARTUP.A51文件中,,在宏定義和代碼段開始之前增加以下的代碼:
//Last bit in bit-addressable space(2F.7h)
MEM_DEVICE_MODE BIT 07Fh
PUBLIC DEVICE_MODE
BSEGATMEM_DEVICE_MODE
DEVICE_MODE: DBIT 1
3 遠程在線下載
3.1下載步驟
(1)從APP切換到BL。此時,,程序正常運行在APP模式,,發(fā)送更新程序命令,致使Flash寫錯誤進入BL模式,。
(2)擦除Flash,。在BL模式下,發(fā)送擦除Flash命令,,擦除簽名和APP固件程序,,返回成功ERASE_OK。
(3)寫Flash,。擦除Flash成功后,,可以將新的APP固件程序的HEX文件寫進Flash。校驗失敗,,返回WRITE_FAILED,,成功返回WRITE_OK。
(4)寫簽名,。寫Flash成功后,,將2 B的簽名寫到指定的地址處,表示APP固件已經(jīng)存在于Flash中,。
(5)從BL切換到APP,。寫簽名成功后,,使程序跳轉(zhuǎn)到APP固件程序處執(zhí)行,。
3.2 上層軟件設(shè)計
本文使用VC++6.0開發(fā)了BL上層軟件,如圖4所示,。
在線下載時,,有兩種方式:(1)正常下載,這是常用的一種方式,這種下載方式在下載前和下載后會進行APP固件程序版本比較,,如果是不同版本的程序,,可以進行升級,如果是同一版本的程序,,直接返回成功,;(2)強制下載,這種下載方式不進行APP固件程序版本比較,,點擊即可進行升級,,一般在APP固件程序調(diào)試時多次下載使用。
在線下載使用方法:首先點擊“瀏覽”按鈕,,查找到用于升級的新版本的HEX文件,;再點擊“正常下載”或“強制下載”進行程序升級;然后在右邊查看返回結(jié)果,,看升級是否成功,。
3.3 設(shè)計注意點
在APP轉(zhuǎn)BL以及BL轉(zhuǎn)APP時,需要考慮USB枚舉時間,,枚舉成功后才能正常地發(fā)送和接收,。遠程下載過程中,需要考慮一些異常情況,,如PC主機死機,、模塊CPU死機、死循環(huán)或復(fù)位等,,針對這些情況,,本設(shè)計均作了冗錯處理。
一個良好的BootLoader程序應(yīng)該具有良好的可維護性并可以正確處理異常情況,,不會因為意外情況引起系統(tǒng)的損壞和崩潰,。本文結(jié)合實際應(yīng)用,設(shè)計了一個實用的USB Bootloader,。經(jīng)大量測試和實際應(yīng)用,,可滿足開發(fā)和維護人員的要求。
參考文獻
[1] Silicon Labs. USB Bootloader with shared USB[DB/OL].Xpress Library,, 2008.2.
[2] 潘琢金,,譯.C8051F340/1/2/3/4/5/6/7全速USB FLASH 微控制器數(shù)據(jù)手冊[Z].新華龍電子有限公司,2006.01.
[3] 周立功.PDIUSBD12 USB固件編程與驅(qū)動開發(fā)[M].北京:北京航空航天大學(xué)出版社,,2002.
[4] 王朔,,李剛.USB接口器件PDIUSBD12的接口應(yīng)用設(shè)計[J].單片機與嵌入式系統(tǒng)應(yīng)用,2002(1).
[5] 繆德芳,,李紹勝.單片機Bootloader設(shè)計與實現(xiàn)[J].中國科技論文在線.
[6] 虹信公司.在PIC18單片機中使用BootLoader[J].單片機與嵌入式系統(tǒng)應(yīng)用,,2005(12).