基于自編程功能的MCU Bootloader設(shè)計(jì)
Bootloader是在單片機(jī)上電啟動(dòng)時(shí)執(zhí)行的一小段程序。也稱作固件,通過(guò)這段程序,可以初始化硬件設(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中寫(xiě)入新的應(yīng)用程序。因此,Bootloader是依賴于特定的硬件而實(shí)現(xiàn)的,因此,在眾多嵌入式產(chǎn)品中目前還不可能實(shí)現(xiàn)通用Bootloader。
Bootloader的最大優(yōu)點(diǎn)是:在不需要外部編程器的情況下,對(duì)嵌入式產(chǎn)品的應(yīng)用代碼進(jìn)行更新升級(jí)。它使得通過(guò)局域網(wǎng)或者Intemet遠(yuǎn)程更新程序成為可能。例如,如果有5 000個(gè)基于MCU的電能表應(yīng)用程序需要更新,電能表制造商的技術(shù)人員就可以避免從事對(duì)每一個(gè)電能表重新編程的巨大工作量,通過(guò)使用Bootloader的功能,由控制中心通過(guò)電能表抄表系統(tǒng)網(wǎng)絡(luò),遠(yuǎn)程對(duì)5 000個(gè)電表重新編程??梢?jiàn),Bootloader功能對(duì)于嵌入式系統(tǒng)的廣泛應(yīng)用具有十分重要的意義。
1 78K0/Fx2系列單片機(jī)簡(jiǎn)介
78K0/Fx2系列是帶CAN控制器的8位單片機(jī),該系列單片機(jī)廣泛應(yīng)用于汽車電子,智能儀表等領(lǐng)域。其內(nèi)置POC(可編程上電清零電路)/LVI(可編程低電壓指示器),單電壓自編程閃存,引導(dǎo)交換功能(閃存安全保護(hù)),具有低功耗、寬電壓范圍、超高抗干擾等性能。
78K0系列單片機(jī)支持自編程(Self-programming)。所謂自編程,是指用Flash存儲(chǔ)器中的駐留的軟件或程序?qū)lash存儲(chǔ)器進(jìn)行擦除/編程的方法。通過(guò)單片機(jī)的自編程功能,可以設(shè)計(jì)Bootloader程序,通過(guò)串口等通信接口實(shí)現(xiàn)對(duì)產(chǎn)品重新編程、在線升級(jí)的功能。
以μ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為自編程庫(kù)函數(shù)中空白檢測(cè)、擦除、校驗(yàn)的最小單位。blockO從地址0000H開(kāi)始,程序都從0000H開(kāi)始執(zhí)行。block0~block3共4 KB存儲(chǔ)空間為Bootloader程序存儲(chǔ)區(qū)域。block4~block31為應(yīng)用程序存儲(chǔ)區(qū)域。
為了防止Bootloader自身的升級(jí)失敗,設(shè)計(jì)了引導(dǎo)交換功能。該功能定義2個(gè)簇,即Boot cluster0和Boot cluster1。Boot clustee0為block0~block3的4 KB存儲(chǔ)空間,Boot cluster1為block4~block7的4 KB存儲(chǔ)空間。因此,實(shí)際運(yùn)用過(guò)程中,一般把應(yīng)用程序的開(kāi)始定義在2000H,也就是從block8開(kāi)始。
Flash地址為0000H~FFFFH。7FFFFH~FFFFH存儲(chǔ)空間為保留區(qū)域以及特殊功能寄存器區(qū)域等,用戶無(wú)法對(duì)其進(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引腳置成高電平。因此,通過(guò)一個(gè)普通I/O接口控制FLMD0引腳的電平。如圖2所示。
2.1.2 軟件環(huán)境
1)使用通用寄存器bank3,自編程庫(kù)函數(shù),需要調(diào)用通用寄存器bank3。因此,在自編程時(shí),不能對(duì)通用寄存器bank3操作。
2)使用100 B RAM(入口RAM)作為隱藏ROM中函數(shù)的工作區(qū),入口RAM,是Flash存儲(chǔ)器自編程樣例庫(kù)所使用的RAM區(qū)域。用戶程序需要保留著塊區(qū)域,當(dāng)調(diào)用庫(kù)時(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 自編程流程
自編程功能利用自編程軟件庫(kù)完成用戶程序?qū)lash內(nèi)容的重新編程。如果在自編程的過(guò)程中有中斷發(fā)生,那么自編程將暫停來(lái)響應(yīng)中斷。中斷結(jié)束,自編程模式恢復(fù)后,自編程過(guò)程將繼續(xù)進(jìn)行。采用匯編語(yǔ)言編寫(xiě)78K0/Fx2自編程軟件庫(kù),如表1所示。
評(píng)論