基于自編程功能的MCU Bootloader設(shè)計
1)舊的Boot程序首先將新的Boot程序編程到交換引導簇1(Boot cluster 1),然后設(shè)置啟動交換標志位,并強迫看門狗復位。
2)復位啟動后,MCU看到交換標志位,便從交換引導簇1處開始啟動。交換引導簇1處的新Boot程序?qū)z查交換標志位。如果交換標志位被置1,則新的Boot程序?qū)⒉脸粨Q引導簇0(Boot cluster 0)區(qū)域,并將自身復制到交換引導簇O,然后將交換標志位清零,強迫看門狗復位。
3)復位啟動后,MCU看到交換標志位被清零。又從交換引導簇0處開始執(zhí)行。這樣就完成了boot程序自身的升級。即使在升級過程中遇到斷電等異常情況,在重新上電后也能重新完成Boot程序升級。有效地防止在升級過程中出現(xiàn)斷電等等異常情況而導致升級失敗,MCU無法啟動的問題,使Boot程序的升級變得安全可靠。
4 Bootloadler設(shè)計
4.1 簡單的Bootloader
一個簡單的Bootload包括5個元素。
1)啟動 Bootloader的信號 Bootloader程序是在執(zhí)行應用程序之前所執(zhí)行的一小段程序,當Bootloader程序把控制權(quán)轉(zhuǎn)交給應用程序后,在MCU復位前,Bootloader程序?qū)⒉辉賵?zhí)行。因此,需要產(chǎn)生一個信號觸發(fā)MCU開始Bootloader程序。該信號可以是中斷,也可以通過串口傳送的一條指令,或者是別的程序觸發(fā)的信號。
2)執(zhí)行 Bootloader的信號 單片機程序啟動時,MCU是裝載新的應用程序還是執(zhí)行已經(jīng)存在的程序取決于外部信號。該信號可以是上電時的一個端口信號,用來控制MCU裝載新程序還是執(zhí)行舊程序,也可以是從串口接收到的指令等。
3)將新的代碼傳送給MCU 通過RS485、I2C、CAN或者USB傳送新的應用程序數(shù)據(jù)。因為要傳送的代碼一般會超過MCU的RAM容量,因此需要一些控制數(shù)據(jù)流量的措施。一般使用XON/XOFF軟件握手協(xié)議,傳送代碼的格式一般選擇Intel hex格式。
4)Flash新代碼的自動編程 每次MCU接收到一批新的數(shù)據(jù),就要將其編程到正確的Flash地址。如果該地址非空白,MCU在編程前必須先擦除。一般在編程中或者編程后還需要檢查存儲器的內(nèi)容。
5)將控制權(quán)轉(zhuǎn)移給有效的應用程序 在接收和編程了新的代碼后,Bootloader寫一個校驗和或者其他唯一字節(jié)序列到一個固定的存儲單元。Bootloader檢測該值,如果該值存在,Bootloader就將控制權(quán)傳給應用程序。
4.2 Intelhex格式
在線升級的程序代碼采用編譯器輸出的Intel hex格式文件。Intel hex文件常用來保存單片機或其他微處理器的程序代碼。它保存物理程序存儲區(qū)中的目標代碼映象。一般的編程器都支持這種格式。Intel hex文件記錄中的數(shù)字都是十六進制格式。在InteI hex文件中,每一行包含一個HEX記錄。Intel hex文件通常用于傳輸將被存于Flash或者EEPROM中的程序和數(shù)據(jù)。Intel hex由任意數(shù)量的十六進制記錄組成。每個記錄包含5個域,它們按照圖5所示格式排列。
每一個部分至少由2個十六進制編碼字符組成。它們構(gòu)成1個字節(jié)。每一個部分的意義如下所述:
1)每個Intel hex記錄都由冒號開頭,自編程的過程中以此判斷一個Intel hex記錄的開始。
2)數(shù)據(jù)長度代表當前記錄中數(shù)據(jù)字節(jié)的數(shù)量。
3)地址代表當前記錄中數(shù)據(jù)在存儲區(qū)域中的起始地址。
4)HEX記錄類型有如下4種:00-數(shù)據(jù)記錄;01-文件結(jié)束記錄;02-擴展段地址記錄;03-轉(zhuǎn)移地址記錄。NEC編譯器輸出的Intel hex文件中。只包含數(shù)據(jù)類型00和01。其中O1作為自編程過程中數(shù)據(jù)結(jié)束的判定標志。
5)數(shù)據(jù)域分用于存儲需要寫入Flash中的內(nèi)容,一個記錄可以有許多數(shù)據(jù)字節(jié)。記錄中的數(shù)據(jù)字節(jié)數(shù)量必須與數(shù)據(jù)長度中的值相符。
6)校驗和是取記錄中從數(shù)據(jù)長度到數(shù)據(jù)域最后一個字節(jié)的所有字節(jié)總和的2的補碼。
根據(jù)以上說明,必須在程序中對接收到的Inter hex文件進行解碼,獲取數(shù)據(jù)以及數(shù)據(jù)地址,并對收到的數(shù)據(jù)進行校驗,然后將接收正確的數(shù)據(jù)編程到Flash相應的地址上。
4.3 Bootloader設(shè)計思路
單片機收到啟動信號后,重新啟動程序。啟動的時候首先執(zhí)行Boot代碼,Boot代碼檢查是否收到執(zhí)行升級信號。如果需要升級程序,則通過串口或者其他通信接口接收新的應用程序,loader程序向單片機Flash中寫入新的應用程序代碼。最后通過檢查校驗位檢測程序是否有效。如果有效,則Bootloader將CPUMCU控制權(quán)交給應用程序。整個升級過程完成。Bootloader執(zhí)行過程如圖6所示。
需要注意的是Bootloader自身的更新和應用程序的更新還需區(qū)別處理。通過辨別接收到數(shù)據(jù)的編程地址來判斷是Bootloader更新還是應用程序更新。若編程地址從0000H開始,則為Bootloader更新。Bootloader更新則需要執(zhí)行引導交換(boot swap)功能;若為應用程序更新,自編程結(jié)束后,直接將CPU交給應用程序。
5 結(jié)束語
本文探討了78KO/FC2系列μPD78F0881單片機的自編程功能以及Bootloader的設(shè)計方法。具體描述了通過單片機串口對相應的應用程序通過Bootloader進行升級。此版本的Bootloader使用晶振20 MHz,通過串口Uart60,設(shè)置波特率為115 200,在μPD78F0881單片機上成功實現(xiàn)了用戶應用程序的升級更新。在接下來的工作中,Bootloader的設(shè)計應當面向更多的通信接口。例如,通過CAN總線接口升級,通過USB接口升級等等。Bootloader技術(shù)的開發(fā)和廣泛應用,必將成為嵌入式產(chǎn)品開發(fā)的重要部分,為網(wǎng)絡化產(chǎn)品的應用和開發(fā),特別是后期維護、升級帶來極大的便利。
評論