《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 模擬設(shè)計(jì) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)自編程及Bootloader設(shè)計(jì)
單片機(jī)自編程及Bootloader設(shè)計(jì)
摘要: Bootloader是在單片機(jī)上電啟動(dòng)時(shí)執(zhí)行的一小段程序。也稱作固件,,通過這段程序,可以初始化硬件設(shè)備,、建立內(nèi)存空間的映射圖,,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),,以便為最終調(diào)用應(yīng)用程序準(zhǔn)備好正確的環(huán)境。
Abstract:
Key words :

  Bootloader是在單片機(jī)上電啟動(dòng)時(shí)執(zhí)行的一小段程序,。也稱作固件,,通過這段程序,可以初始化硬件設(shè)備,、建立內(nèi)存空間的映射圖,,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便為最終調(diào)用應(yīng)用程序準(zhǔn)備好正確的環(huán)境,。

  Boot代碼由MCU啟動(dòng)時(shí)執(zhí)行的指令組成,。這里的loader指向MCU的Flash中寫入新的應(yīng)用程序。因此,,Bootloader是依賴于特定的硬件而實(shí)現(xiàn)的,,因此,在眾多嵌入式產(chǎn)品中目前還不可能實(shí)現(xiàn)通用Bootloader,。

  Bootloader的最大優(yōu)點(diǎn)是:在不需要外部編程器的情況下,,對嵌入式產(chǎn)品的應(yīng)用代碼進(jìn)行更新升級。它使得通過局域網(wǎng)或者Intemet遠(yuǎn)程更新程序成為可能,。例如,,如果有5 000個(gè)基于MCU的電能表應(yīng)用程序需要更新,電能表制造商的技術(shù)人員就可以避免從事對每一個(gè)電能表重新編程的巨大工作量,,通過使用Bootloader的功能,,由控制中心通過電能表抄表系統(tǒng)網(wǎng)絡(luò),遠(yuǎn)程對5 000個(gè)電表重新編程,??梢姡珺ootloader功能對于嵌入式系統(tǒng)的廣泛應(yīng)用具有十分重要的意義,。

  1 78K0/Fx2系列單片機(jī)簡介

  78K0/Fx2系列是帶CAN控制器的8位單片機(jī),,該系列單片機(jī)廣泛應(yīng)用于汽車電子,智能儀表等領(lǐng)域,。其內(nèi)置POC(可編程上電清零電路)/LVI(可編程低電壓指示器),,單電壓自編程閃存,引導(dǎo)交換功能(閃存安全保護(hù)),,具有低功耗,、寬電壓范圍、超高抗干擾等性能。

  78K0系列單片機(jī)支持自編程(Self-programming),。所謂自編程,,是指用Flash存儲器中的駐留的軟件或程序?qū)lash存儲器進(jìn)行擦除/編程的方法。通過單片機(jī)的自編程功能,,可以設(shè)計(jì)Bootloader程序,通過串口等通信接口實(shí)現(xiàn)對產(chǎn)品重新編程,、在線升級的功能,。

  以μPD78F0881為例。μPD78F0881為78KO/Fx2系列中的一款44管腳單片機(jī),,內(nèi)置32 KB Flash ROM,,2 KB RAM,自帶2個(gè)串行通信接口,。其內(nèi)部Flash結(jié)構(gòu)如圖1所示,。為了方便實(shí)現(xiàn)擦除和編程,人為地將整個(gè)Flash分成若干個(gè)block,,每個(gè)block大小為1 KB,。block為自編程庫函數(shù)中空白檢測、擦除,、校驗(yàn)的最小單位,。blockO從地址0000H開始,程序都從0000H開始執(zhí)行,。block0~block3共4 KB存儲空間為Bootloader程序存儲區(qū)域,。block4~block31為應(yīng)用程序存儲區(qū)域。

  

  為了防止Bootloader自身的升級失敗,,設(shè)計(jì)了引導(dǎo)交換功能,。該功能定義2個(gè)簇,即Boot cluster0和Boot cluster1,。Boot clustee0為block0~block3的4 KB存儲空間,,Boot cluster1為block4~block7的4 KB存儲空間。因此,,實(shí)際運(yùn)用過程中,,一般把應(yīng)用程序的開始定義在2000H,也就是從block8開始,。

  Flash地址為0000H~FFFFH,。7FFFFH~FFFFH存儲空間為保留區(qū)域以及特殊功能寄存器區(qū)域等,用戶無法對其進(jìn)行編程,。

  2 自編程

  2.1 自編程環(huán)境

  2.1.1 硬件環(huán)境

  FLMDO引腳是78KO/Fx2系列單片機(jī)為Flash編程模式設(shè)置的,,用于控制MCU進(jìn)入編程模式。在通常操作情況下,,F(xiàn)LMDO引腳下拉到地,。要進(jìn)入自編程模式,,必須使FLMDO引腳置成高電平。因此,,通過一個(gè)普通I/O接口控制FLMD0引腳的電平,。如圖2所示。

  

  2.1.2 軟件環(huán)境

  1)使用通用寄存器bank3,,自編程庫函數(shù),,需要調(diào)用通用寄存器bank3。因此,,在自編程時(shí),,不能對通用寄存器bank3操作。

  2)使用100 B RAM(入口RAM)作為隱藏ROM中函數(shù)的工作區(qū),,入口RAM,,是Flash存儲器自編程樣例庫所使用的RAM區(qū)域。用戶程序需要保留著塊區(qū)域,,當(dāng)調(diào)用庫時(shí),,需要指定這片區(qū)域的起始地址。入口RAM地址可以指定在FB00h~FE20h之間,。

  3)4~256 B RAM作為數(shù)據(jù)緩沖區(qū),,必須是FE20H~FE83H以外的內(nèi)部高速RAM區(qū)域。

  4)最大39 B RAM作為隱藏ROM函數(shù)的堆棧,。

  5)隱藏ROM中的函數(shù)被0000H~7FFFH中的應(yīng)用程序調(diào)用,。

  2.2 自編程流程

  自編程功能利用自編程軟件庫完成用戶程序?qū)lash內(nèi)容的重新編程。如果在自編程的過程中有中斷發(fā)生,,那么自編程將暫停來響應(yīng)中斷,。中斷結(jié)束,自編程模式恢復(fù)后,,自編程過程將繼續(xù)進(jìn)行,。采用匯編語言編寫78K0/Fx2自編程軟件庫,如表1所示,。

  

  自編程操作流程如圖3所示,,當(dāng)單片機(jī)收到自編程執(zhí)行信號時(shí),開始進(jìn)入自編程模式,。將FLMDO引腳設(shè)置成高電平,,初始化入口RAM,為自編程庫函數(shù)開辟空間,。當(dāng)確認(rèn)FLMD0為自編程狀態(tài)時(shí),,開始檢查需要編程區(qū)域是否為空白區(qū)域。當(dāng)被編程區(qū)域不是空白區(qū)域時(shí),先將其擦除,,然后在此區(qū)域進(jìn)行編程,。編程結(jié)束后進(jìn)行校驗(yàn)。若校驗(yàn)無誤,,則將FLMDO引腳設(shè)置成低電平,,退出自編程模式。

  

  3 引導(dǎo)交換(boot swap)

  產(chǎn)品程序的升級包括應(yīng)用程序的升級和引導(dǎo)程序(Bootloader自身)的升級,。為了防止引導(dǎo)程序在升級的過程中發(fā)生錯(cuò)誤,,從而導(dǎo)致MCU無法啟動(dòng),設(shè)計(jì)了引導(dǎo)交換功能,。以圖4說明引導(dǎo)交換的實(shí)現(xiàn)過程,。

  

  1)舊的Boot程序首先將新的Boot程序編程到交換引導(dǎo)簇1(Boot cluster 1),,然后設(shè)置啟動(dòng)交換標(biāo)志位,,并強(qiáng)迫看門狗復(fù)位。

  2)復(fù)位啟動(dòng)后,,MCU看到交換標(biāo)志位,,便從交換引導(dǎo)簇1處開始啟動(dòng)。交換引導(dǎo)簇1處的新Boot程序?qū)z查交換標(biāo)志位,。如果交換標(biāo)志位被置1,,則新的Boot程序?qū)⒉脸粨Q引導(dǎo)簇0(Boot cluster 0)區(qū)域,并將自身復(fù)制到交換引導(dǎo)簇O,,然后將交換標(biāo)志位清零,,強(qiáng)迫看門狗復(fù)位。

  3)復(fù)位啟動(dòng)后,,MCU看到交換標(biāo)志位被清零,。又從交換引導(dǎo)簇0處開始執(zhí)行。這樣就完成了boot程序自身的升級,。即使在升級過程中遇到斷電等異常情況,,在重新上電后也能重新完成Boot程序升級。有效地防止在升級過程中出現(xiàn)斷電等等異常情況而導(dǎo)致升級失敗,,MCU無法啟動(dòng)的問題,,使Boot程序的升級變得安全可靠。

  Bootloader是在單片機(jī)上電啟動(dòng)時(shí)執(zhí)行的一小段程序,。也稱作固件,,通過這段程序,可以初始化硬件設(shè)備,、建立內(nèi)存空間的映射圖,,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便為最終調(diào)用應(yīng)用程序準(zhǔn)備好正確的環(huán)境。

  Boot代碼由MCU啟動(dòng)時(shí)執(zhí)行的指令組成,。這里的loader指向MCU的Flash中寫入新的應(yīng)用程序,。因此,Bootloader是依賴于特定的硬件而實(shí)現(xiàn)的,,因此,,在眾多嵌入式產(chǎn)品中目前還不可能實(shí)現(xiàn)通用Bootloader。

  Bootloader的最大優(yōu)點(diǎn)是:在不需要外部編程器的情況下,,對嵌入式產(chǎn)品的應(yīng)用代碼進(jìn)行更新升級,。它使得通過局域網(wǎng)或者Intemet遠(yuǎn)程更新程序成為可能。例如,,如果有5 000個(gè)基于MCU的電能表應(yīng)用程序需要更新,,電能表制造商的技術(shù)人員就可以避免從事對每一個(gè)電能表重新編程的巨大工作量,通過使用Bootloader的功能,,由控制中心通過電能表抄表系統(tǒng)網(wǎng)絡(luò),,遠(yuǎn)程對5 000個(gè)電表重新編程??梢?,Bootloader功能對于嵌入式系統(tǒng)的廣泛應(yīng)用具有十分重要的意義。

  1 78K0/Fx2系列單片機(jī)簡介

  78K0/Fx2系列是帶CAN控制器的8位單片機(jī),,該系列單片機(jī)廣泛應(yīng)用于汽車電子,,智能儀表等領(lǐng)域。其內(nèi)置POC(可編程上電清零電路)/LVI(可編程低電壓指示器),,單電壓自編程閃存,,引導(dǎo)交換功能(閃存安全保護(hù)),具有低功耗,、寬電壓范圍,、超高抗干擾等性能。

  78K0系列單片機(jī)支持自編程(Self-programming),。所謂自編程,,是指用Flash存儲器中的駐留的軟件或程序?qū)lash存儲器進(jìn)行擦除/編程的方法。通過單片機(jī)的自編程功能,,可以設(shè)計(jì)Bootloader程序,,通過串口等通信接口實(shí)現(xiàn)對產(chǎn)品重新編程、在線升級的功能,。

  以μPD78F0881為例,。μPD78F0881為78KO/Fx2系列中的一款44管腳單片機(jī),內(nèi)置32 KB Flash ROM,,2 KB RAM,,自帶2個(gè)串行通信接口,。其內(nèi)部Flash結(jié)構(gòu)如圖1所示。為了方便實(shí)現(xiàn)擦除和編程,,人為地將整個(gè)Flash分成若干個(gè)block,,每個(gè)block大小為1 KB。block為自編程庫函數(shù)中空白檢測,、擦除,、校驗(yàn)的最小單位。blockO從地址0000H開始,,程序都從0000H開始執(zhí)行,。block0~block3共4 KB存儲空間為Bootloader程序存儲區(qū)域。block4~block31為應(yīng)用程序存儲區(qū)域,。

  

  為了防止Bootloader自身的升級失敗,,設(shè)計(jì)了引導(dǎo)交換功能。該功能定義2個(gè)簇,,即Boot cluster0和Boot cluster1,。Boot clustee0為block0~block3的4 KB存儲空間,Boot cluster1為block4~block7的4 KB存儲空間,。因此,,實(shí)際運(yùn)用過程中,,一般把應(yīng)用程序的開始定義在2000H,,也就是從block8開始。

  Flash地址為0000H~FFFFH,。7FFFFH~FFFFH存儲空間為保留區(qū)域以及特殊功能寄存器區(qū)域等,,用戶無法對其進(jìn)行編程。

  2 自編程

  2.1 自編程環(huán)境

  2.1.1 硬件環(huán)境

  FLMDO引腳是78KO/Fx2系列單片機(jī)為Flash編程模式設(shè)置的,,用于控制MCU進(jìn)入編程模式,。在通常操作情況下,F(xiàn)LMDO引腳下拉到地,。要進(jìn)入自編程模式,,必須使FLMDO引腳置成高電平。因此,,通過一個(gè)普通I/O接口控制FLMD0引腳的電平,。如圖2所示。

  

  2.1.2 軟件環(huán)境

  1)使用通用寄存器bank3,,自編程庫函數(shù),,需要調(diào)用通用寄存器bank3。因此,,在自編程時(shí),,不能對通用寄存器bank3操作,。

  2)使用100 B RAM(入口RAM)作為隱藏ROM中函數(shù)的工作區(qū),入口RAM,,是Flash存儲器自編程樣例庫所使用的RAM區(qū)域,。用戶程序需要保留著塊區(qū)域,當(dāng)調(diào)用庫時(shí),,需要指定這片區(qū)域的起始地址,。入口RAM地址可以指定在FB00h~FE20h之間。

  3)4~256 B RAM作為數(shù)據(jù)緩沖區(qū),,必須是FE20H~FE83H以外的內(nèi)部高速RAM區(qū)域,。

  4)最大39 B RAM作為隱藏ROM函數(shù)的堆棧。

  5)隱藏ROM中的函數(shù)被0000H~7FFFH中的應(yīng)用程序調(diào)用,。

  2.2 自編程流程

  自編程功能利用自編程軟件庫完成用戶程序?qū)lash內(nèi)容的重新編程,。如果在自編程的過程中有中斷發(fā)生,那么自編程將暫停來響應(yīng)中斷,。中斷結(jié)束,,自編程模式恢復(fù)后,自編程過程將繼續(xù)進(jìn)行,。采用匯編語言編寫78K0/Fx2自編程軟件庫,,如表1所示。

  

  自編程操作流程如圖3所示,,當(dāng)單片機(jī)收到自編程執(zhí)行信號時(shí),,開始進(jìn)入自編程模式。將FLMDO引腳設(shè)置成高電平,,初始化入口RAM,,為自編程庫函數(shù)開辟空間。當(dāng)確認(rèn)FLMD0為自編程狀態(tài)時(shí),,開始檢查需要編程區(qū)域是否為空白區(qū)域,。當(dāng)被編程區(qū)域不是空白區(qū)域時(shí),先將其擦除,,然后在此區(qū)域進(jìn)行編程,。編程結(jié)束后進(jìn)行校驗(yàn)。若校驗(yàn)無誤,,則將FLMDO引腳設(shè)置成低電平,,退出自編程模式。

  

  3 引導(dǎo)交換(boot swap)

  產(chǎn)品程序的升級包括應(yīng)用程序的升級和引導(dǎo)程序(Bootloader自身)的升級,。為了防止引導(dǎo)程序在升級的過程中發(fā)生錯(cuò)誤,,從而導(dǎo)致MCU無法啟動(dòng),設(shè)計(jì)了引導(dǎo)交換功能,。以圖4說明引導(dǎo)交換的實(shí)現(xiàn)過程,。

  

  1)舊的Boot程序首先將新的Boot程序編程到交換引導(dǎo)簇1(Boot cluster 1),,然后設(shè)置啟動(dòng)交換標(biāo)志位,并強(qiáng)迫看門狗復(fù)位,。

  2)復(fù)位啟動(dòng)后,,MCU看到交換標(biāo)志位,便從交換引導(dǎo)簇1處開始啟動(dòng),。交換引導(dǎo)簇1處的新Boot程序?qū)z查交換標(biāo)志位,。如果交換標(biāo)志位被置1,則新的Boot程序?qū)⒉脸粨Q引導(dǎo)簇0(Boot cluster 0)區(qū)域,,并將自身復(fù)制到交換引導(dǎo)簇O,,然后將交換標(biāo)志位清零,強(qiáng)迫看門狗復(fù)位,。

  3)復(fù)位啟動(dòng)后,,MCU看到交換標(biāo)志位被清零。又從交換引導(dǎo)簇0處開始執(zhí)行,。這樣就完成了boot程序自身的升級,。即使在升級過程中遇到斷電等異常情況,在重新上電后也能重新完成Boot程序升級,。有效地防止在升級過程中出現(xiàn)斷電等等異常情況而導(dǎo)致升級失敗,,MCU無法啟動(dòng)的問題,使Boot程序的升級變得安全可靠,。

  4 Bootloadler設(shè)計(jì)

  4.1 簡單的Bootloader

  一個(gè)簡單的Bootload包括5個(gè)元素,。

  1)啟動(dòng) Bootloader的信號 Bootloader程序是在執(zhí)行應(yīng)用程序之前所執(zhí)行的一小段程序,當(dāng)Bootloader程序把控制權(quán)轉(zhuǎn)交給應(yīng)用程序后,,在MCU復(fù)位前,,Bootloader程序?qū)⒉辉賵?zhí)行,。因此,,需要產(chǎn)生一個(gè)信號觸發(fā)MCU開始Bootloader程序。該信號可以是中斷,,也可以通過串口傳送的一條指令,,或者是別的程序觸發(fā)的信號。

  2)執(zhí)行 Bootloader的信號 單片機(jī)程序啟動(dòng)時(shí),,MCU是裝載新的應(yīng)用程序還是執(zhí)行已經(jīng)存在的程序取決于外部信號,。該信號可以是上電時(shí)的一個(gè)端口信號,用來控制MCU裝載新程序還是執(zhí)行舊程序,,也可以是從串口接收到的指令等,。

  3)將新的代碼傳送給MCU 通過RS485、I2C,、CAN或者USB傳送新的應(yīng)用程序數(shù)據(jù),。因?yàn)橐獋魉偷拇a一般會(huì)超過MCU的RAM容量,,因此需要一些控制數(shù)據(jù)流量的措施。一般使用XON/XOFF軟件握手協(xié)議,,傳送代碼的格式一般選擇Intel hex格式,。

  4)Flash新代碼的自動(dòng)編程 每次MCU接收到一批新的數(shù)據(jù),就要將其編程到正確的Flash地址,。如果該地址非空白,,MCU在編程前必須先擦除。一般在編程中或者編程后還需要檢查存儲器的內(nèi)容,。

  5)將控制權(quán)轉(zhuǎn)移給有效的應(yīng)用程序 在接收和編程了新的代碼后,,Bootloader寫一個(gè)校驗(yàn)和或者其他唯一字節(jié)序列到一個(gè)固定的存儲單元。Bootloader檢測該值,,如果該值存在,,Bootloader就將控制權(quán)傳給應(yīng)用程序。

  4.2 Intelhex格式

  在線升級的程序代碼采用編譯器輸出的Intel hex格式文件,。Intel hex文件常用來保存單片機(jī)或其他微處理器的程序代碼,。它保存物理程序存儲區(qū)中的目標(biāo)代碼映象。一般的編程器都支持這種格式,。Intel hex文件記錄中的數(shù)字都是十六進(jìn)制格式,。在InteI hex文件中,每一行包含一個(gè)HEX記錄,。Intel hex文件通常用于傳輸將被存于Flash或者EEPROM中的程序和數(shù)據(jù),。Intel hex由任意數(shù)量的十六進(jìn)制記錄組成。每個(gè)記錄包含5個(gè)域,,它們按照圖5所示格式排列,。

  

  每一個(gè)部分至少由2個(gè)十六進(jìn)制編碼字符組成。它們構(gòu)成1個(gè)字節(jié),。每一個(gè)部分的意義如下所述:

  1)每個(gè)Intel hex記錄都由冒號開頭,,自編程的過程中以此判斷一個(gè)Intel hex記錄的開始。

  2)數(shù)據(jù)長度代表當(dāng)前記錄中數(shù)據(jù)字節(jié)的數(shù)量,。

  3)地址代表當(dāng)前記錄中數(shù)據(jù)在存儲區(qū)域中的起始地址,。

  4)HEX記錄類型有如下4種:00-數(shù)據(jù)記錄;01-文件結(jié)束記錄;02-擴(kuò)展段地址記錄;03-轉(zhuǎn)移地址記錄。NEC編譯器輸出的Intel hex文件中,。只包含數(shù)據(jù)類型00和01,。其中O1作為自編程過程中數(shù)據(jù)結(jié)束的判定標(biāo)志。

  5)數(shù)據(jù)域分用于存儲需要寫入Flash中的內(nèi)容,,一個(gè)記錄可以有許多數(shù)據(jù)字節(jié),。記錄中的數(shù)據(jù)字節(jié)數(shù)量必須與數(shù)據(jù)長度中的值相符。

  6)校驗(yàn)和是取記錄中從數(shù)據(jù)長度到數(shù)據(jù)域最后一個(gè)字節(jié)的所有字節(jié)總和的2的補(bǔ)碼,。

  根據(jù)以上說明,,必須在程序中對接收到的Inter hex文件進(jìn)行解碼,,獲取數(shù)據(jù)以及數(shù)據(jù)地址,并對收到的數(shù)據(jù)進(jìn)行校驗(yàn),,然后將接收正確的數(shù)據(jù)編程到Flash相應(yīng)的地址上,。

  4.3 Bootloader設(shè)計(jì)思路

  單片機(jī)收到啟動(dòng)信號后,重新啟動(dòng)程序,。啟動(dòng)的時(shí)候首先執(zhí)行Boot代碼,,Boot代碼檢查是否收到執(zhí)行升級信號。如果需要升級程序,,則通過串口或者其他通信接口接收新的應(yīng)用程序,,loader程序向單片機(jī)Flash中寫入新的應(yīng)用程序代碼。最后通過檢查校驗(yàn)位檢測程序是否有效,。如果有效,,則Bootloader將CPUMCU控制權(quán)交給應(yīng)用程序。整個(gè)升級過程完成,。Bootloader執(zhí)行過程如圖6所示,。

  

  需要注意的是Bootloader自身的更新和應(yīng)用程序的更新還需區(qū)別處理。通過辨別接收到數(shù)據(jù)的編程地址來判斷是Bootloader更新還是應(yīng)用程序更新,。若編程地址從0000H開始,,則為Bootloader更新。Bootloader更新則需要執(zhí)行引導(dǎo)交換(boot swap)功能;若為應(yīng)用程序更新,,自編程結(jié)束后,,直接將CPU交給應(yīng)用程序。

  5 結(jié)束語

  本文探討了78KO/FC2系列μPD78F0881單片機(jī)的自編程功能以及Bootloader的設(shè)計(jì)方法,。具體描述了通過單片機(jī)串口對相應(yīng)的應(yīng)用程序通過Bootloader進(jìn)行升級,。此版本的Bootloader使用晶振20 MHz,通過串口Uart60,,設(shè)置波特率為115 200,,在μPD78F0881單片機(jī)上成功實(shí)現(xiàn)了用戶應(yīng)用程序的升級更新。在接下來的工作中,,Bootloader的設(shè)計(jì)應(yīng)當(dāng)面向更多的通信接口,。例如,通過CAN總線接口升級,,通過USB接口升級等等。

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載,。