基于自編程功能的MCU Bootloader設計
Bootloader是在單片機上電啟動時執行的一小段程序。也稱作固件,通過這段程序,可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用應用程序準備好正確的環境。
Boot代碼由MCU啟動時執行的指令組成。這里的loader指向MCU的Flash中寫入新的應用程序。因此,Bootloader是依賴于特定的硬件而實現的,因此,在眾多嵌入式產品中目前還不可能實現通用Bootloader。
Bootloader的最大優點是:在不需要外部編程器的情況下,對嵌入式產品的應用代碼進行更新升級。它使得通過局域網或者Intemet遠程更新程序成為可能。例如,如果有5 000個基于MCU的電能表應用程序需要更新,電能表制造商的技術人員就可以避免從事對每一個電能表重新編程的巨大工作量,通過使用Bootloader的功能,由控制中心通過電能表抄表系統網絡,遠程對5 000個電表重新編程。可見,Bootloader功能對于嵌入式系統的廣泛應用具有十分重要的意義。
1 78K0/Fx2系列單片機簡介
78K0/Fx2系列是帶CAN控制器的8位單片機,該系列單片機廣泛應用于汽車電子,智能儀表等領域。其內置POC(可編程上電清零電路)/LVI(可編程低電壓指示器),單電壓自編程閃存,引導交換功能(閃存安全保護),具有低功耗、寬電壓范圍、超高抗干擾等性能。
78K0系列單片機支持自編程(Self-programming)。所謂自編程,是指用Flash存儲器中的駐留的軟件或程序對Flash存儲器進行擦除/編程的方法。通過單片機的自編程功能,可以設計Bootloader程序,通過串口等通信接口實現對產品重新編程、在線升級的功能。
以μPD78F0881為例。μPD78F0881為78KO/Fx2系列中的一款44管腳單片機,內置32 KB Flash ROM,2 KB RAM,自帶2個串行通信接口。其內部Flash結構如圖1所示。為了方便實現擦除和編程,人為地將整個Flash分成若干個block,每個block大小為1 KB。block為自編程庫函數中空白檢測、擦除、校驗的最小單位。blockO從地址0000H開始,程序都從0000H開始執行。block0~block3共4 KB存儲空間為Bootloader程序存儲區域。block4~block31為應用程序存儲區域。
為了防止Bootloader自身的升級失敗,設計了引導交換功能。該功能定義2個簇,即Boot cluster0和Boot cluster1。Boot clustee0為block0~block3的4 KB存儲空間,Boot cluster1為block4~block7的4 KB存儲空間。因此,實際運用過程中,一般把應用程序的開始定義在2000H,也就是從block8開始。
Flash地址為0000H~FFFFH。7FFFFH~FFFFH存儲空間為保留區域以及特殊功能寄存器區域等,用戶無法對其進行編程。
2 自編程
2.1 自編程環境
2.1.1 硬件環境
FLMDO引腳是78KO/Fx2系列單片機為Flash編程模式設置的,用于控制MCU進入編程模式。在通常操作情況下,FLMDO引腳下拉到地。要進入自編程模式,必須使FLMDO引腳置成高電平。因此,通過一個普通I/O接口控制FLMD0引腳的電平。如圖2所示。
2.1.2 軟件環境
1)使用通用寄存器bank3,自編程庫函數,需要調用通用寄存器bank3。因此,在自編程時,不能對通用寄存器bank3操作。
2)使用100 B RAM(入口RAM)作為隱藏ROM中函數的工作區,入口RAM,是Flash存儲器自編程樣例庫所使用的RAM區域。用戶程序需要保留著塊區域,當調用庫時,需要指定這片區域的起始地址。入口RAM地址可以指定在FB00h~FE20h之間。
3)4~256 B RAM作為數據緩沖區,必須是FE20H~FE83H以外的內部高速RAM區域。
4)最大39 B RAM作為隱藏ROM函數的堆棧。
5)隱藏ROM中的函數被0000H~7FFFH中的應用程序調用。
2.2 自編程流程
自編程功能利用自編程軟件庫完成用戶程序對Flash內容的重新編程。如果在自編程的過程中有中斷發生,那么自編程將暫停來響應中斷。中斷結束,自編程模式恢復后,自編程過程將繼續進行。采用匯編語言編寫78K0/Fx2自編程軟件庫,如表1所示。
評論