ATMega48的Bootloader的軟件實(shí)用方法
發(fā)布時(shí)間:2007/4/23 0:00:00 訪問(wèn)次數(shù):1357
AVR是Atmel公司推出的第一款真正意義上的RISC結(jié)構(gòu)8位單片機(jī),具有先進(jìn)的指令集及單時(shí)鐘周期指令執(zhí)行時(shí)間,數(shù)據(jù)吞吐率可高達(dá)1MIPS,其性能明顯優(yōu)于其他類型8位單片機(jī)。
作為AVR主流產(chǎn)品,Mega系列的很多產(chǎn)品(Mega8/Megal6/Mega32/Mega8535等)在硬件上都支持Boot-loader功能。這樣MCU可靈活運(yùn)行BOOT區(qū)程序,實(shí)現(xiàn)在應(yīng)用編程(IAP)及一些高級(jí)應(yīng)用,如系統(tǒng)智能升級(jí),密碼校驗(yàn)自保護(hù),遠(yuǎn)程系統(tǒng)更新等。但有很高性價(jià)比的Mega48在硬件上卻不支持Bootloader功能。因此,本文針對(duì)Mega48首次提出兩種軟件實(shí)現(xiàn)Bootloader的方法:跳轉(zhuǎn)保存法和倒置法。
1 ATMega48 Bootloader的軟件實(shí)現(xiàn)方法
Mega48在硬件上不支持Bootloader功能,不能像其他產(chǎn)品那樣通過(guò)編程來(lái)設(shè)置相應(yīng)的熔絲位以實(shí)現(xiàn)Bootloader,只能通過(guò)軟件來(lái)實(shí)現(xiàn)。在Mega48上實(shí)現(xiàn)Bootloader的關(guān)鍵在于通過(guò)軟件實(shí)現(xiàn)程序存儲(chǔ)器空間劃分。復(fù)位后,BOOT區(qū)獲得MCU控制權(quán),自編程結(jié)束后MCU控制權(quán)返還給APP區(qū).以下將詳細(xì)介紹本文提出的兩種新方法。
1.1 跳轉(zhuǎn)保存法
本方法的核心在于跳轉(zhuǎn)和保存,因此命名為跳轉(zhuǎn)保存法。跳轉(zhuǎn)指上電后MCU跳轉(zhuǎn)至BOOT區(qū),MCU控制權(quán)被BOOT區(qū)獲得。保存指對(duì)APP區(qū)程序復(fù)位地址的保存,只有保存了該地址才能保證MCU控制權(quán)正常返還給APP區(qū)。
跳轉(zhuǎn)保存法采用一般分區(qū)方式,即APP區(qū)位于程序存儲(chǔ)器空間的低地址處,BOOT區(qū)在高地址處。因本文使用的上位機(jī)軟件為AVROSP,BOOT區(qū)需占用1 KB。此外,由于ATMega48不支持通過(guò)熔絲位修改程序的復(fù)位向量,故需多劃分給BOOT區(qū)4個(gè)頁(yè)面大小的空間。
為提高程序的可移植性,可使用預(yù)定義語(yǔ)句來(lái)劃分BOOT區(qū)大小,具體實(shí)現(xiàn)如下:
#define PAGESIZE 64
//每個(gè)頁(yè)面由64個(gè)字節(jié)組成
#define APP_PAGES ((4*1024/PAGESIZE) - ((1*1024+256)/PAGESIZE))
//APP區(qū)的頁(yè)面數(shù)
#define APP_END APP_PAGES*PAGESIZE
//APP區(qū)共占用的字節(jié)數(shù)
在編譯過(guò)程中,由于ICCAVR編譯器只支持標(biāo)準(zhǔn)的BOO了區(qū)大小設(shè)置,即256/512/1024/2048 KB。故使用下面方法定義BOOT區(qū)大小;
#pragma text:mytext
voidboot()...
#pragma text;text
編譯過(guò)程中,在ProjectOptions→Target的Other Options中,添加“-bmytext;0x????”,其中0x????為BOOT區(qū)開(kāi)始的地址。這樣就可以根據(jù)實(shí)際需要設(shè)定BOO了區(qū)大小。這對(duì)于整個(gè)程序空間只有4 KB的ATMcga48來(lái)說(shuō),是非常適合的。程序具體流程如圖1所示。
如圖1所示,BOOT區(qū)程序塊的第一步就是讀取EEPROM中的APP區(qū)原復(fù)位地址,以便單片機(jī)在執(zhí)行BOOT區(qū)程序條件不成立時(shí),跳轉(zhuǎn)到APP區(qū)執(zhí)行程序。
EEPROM_READ(0xfe,AppReset);
當(dāng)執(zhí)行BOOT區(qū)程序條件成立時(shí),單片機(jī)將執(zhí)行BOOT區(qū)程序來(lái)更新APP區(qū)中的內(nèi)容。這里特別要注意對(duì)即將更新到APP區(qū)內(nèi)程序復(fù)位地址的處理:保存該程序中復(fù)位地址到RAM中,并修改該地址為BOOT區(qū)人口地址。這個(gè)工作必須在頁(yè)面填充前完成,否則在更新后,單片機(jī)復(fù)位運(yùn)行不會(huì)首先跳轉(zhuǎn)到BOOT區(qū)。
if(address==o){
AppReset=data;
data=BootReset; //BOOT區(qū)的入口
BootReset=0x1300
}
BOOT區(qū)程序塊最后一步是對(duì)APP區(qū)程序復(fù)位地址的保存。只有通過(guò)上電復(fù)位才能移交MCU控制權(quán)給APP區(qū),這將導(dǎo)致RAM被清零。為了保存RAM中的原APP區(qū)程序復(fù)位地址,需上電復(fù)位前,將這個(gè)地址保存到EEPROM中。
EEPROM_WRITE(Oxfe,APPReset);
值得一提的是,在第一次運(yùn)行時(shí),程序并不能直接跳轉(zhuǎn)到BOOT區(qū)首地址,所以第一次運(yùn)行時(shí),APP區(qū)內(nèi)容應(yīng)為空。這樣,當(dāng)單片機(jī)上電運(yùn)行時(shí),程序指針(PC)會(huì)自增向下運(yùn)行到第一句可執(zhí)行代碼,即BOOT區(qū)中的首行代碼。同樣,第一次運(yùn)行時(shí)也不可能讀取出正確的返回APP區(qū)的入口地址(取出值為0xFF),所以第一次運(yùn)行時(shí)必須保證執(zhí)行BOOT區(qū)程序條件成立,否則將無(wú)法正確跳回到APP區(qū)。只有執(zhí)行了BOOT區(qū)程序,才能寫(xiě)入正確的APP返回地址到EEPROM中,從而為以后的運(yùn)行做好準(zhǔn)備。
跳轉(zhuǎn)保存法遵循了Bootloader的常規(guī)實(shí)現(xiàn)流程,但它的MCU控制權(quán)交接處理比較復(fù)雜,下文將提到的倒置法就很好地解決了這個(gè)問(wèn)題。
1.2 倒置法
一般來(lái)說(shuō),程序存儲(chǔ)區(qū)的上部為NPP區(qū),下部為BOOT區(qū),這也是常規(guī)方法所采取的分區(qū)方法。這種分區(qū)方法由支持Bootloader功能的芯片程序存儲(chǔ)區(qū)中RWW和NRWW的劃分方式所決定的。針對(duì)Mega48,它的程序存儲(chǔ)區(qū)沒(méi)有RWW區(qū)和NRWW區(qū)之分,SPM指令可以在整個(gè)Flash區(qū)中執(zhí)行,所以大可不必拘泥于一般規(guī)律,完全可以把APP區(qū)和BOOT區(qū)倒置,即把程序存儲(chǔ)區(qū)的上部劃分為BOOT區(qū),下部劃分為APP區(qū)。本文中將這種分區(qū)方法稱為倒置分區(qū)方法。
倒置法背棄了常規(guī)分區(qū)形式,創(chuàng)新地采用倒置分區(qū)法對(duì)程序存儲(chǔ)區(qū)進(jìn)行分區(qū)。這樣,在每次上電后,BOOT區(qū)自動(dòng)獲得MCU
AVR是Atmel公司推出的第一款真正意義上的RISC結(jié)構(gòu)8位單片機(jī),具有先進(jìn)的指令集及單時(shí)鐘周期指令執(zhí)行時(shí)間,數(shù)據(jù)吞吐率可高達(dá)1MIPS,其性能明顯優(yōu)于其他類型8位單片機(jī)。
作為AVR主流產(chǎn)品,Mega系列的很多產(chǎn)品(Mega8/Megal6/Mega32/Mega8535等)在硬件上都支持Boot-loader功能。這樣MCU可靈活運(yùn)行BOOT區(qū)程序,實(shí)現(xiàn)在應(yīng)用編程(IAP)及一些高級(jí)應(yīng)用,如系統(tǒng)智能升級(jí),密碼校驗(yàn)自保護(hù),遠(yuǎn)程系統(tǒng)更新等。但有很高性價(jià)比的Mega48在硬件上卻不支持Bootloader功能。因此,本文針對(duì)Mega48首次提出兩種軟件實(shí)現(xiàn)Bootloader的方法:跳轉(zhuǎn)保存法和倒置法。
1 ATMega48 Bootloader的軟件實(shí)現(xiàn)方法
Mega48在硬件上不支持Bootloader功能,不能像其他產(chǎn)品那樣通過(guò)編程來(lái)設(shè)置相應(yīng)的熔絲位以實(shí)現(xiàn)Bootloader,只能通過(guò)軟件來(lái)實(shí)現(xiàn)。在Mega48上實(shí)現(xiàn)Bootloader的關(guān)鍵在于通過(guò)軟件實(shí)現(xiàn)程序存儲(chǔ)器空間劃分。復(fù)位后,BOOT區(qū)獲得MCU控制權(quán),自編程結(jié)束后MCU控制權(quán)返還給APP區(qū).以下將詳細(xì)介紹本文提出的兩種新方法。
1.1 跳轉(zhuǎn)保存法
本方法的核心在于跳轉(zhuǎn)和保存,因此命名為跳轉(zhuǎn)保存法。跳轉(zhuǎn)指上電后MCU跳轉(zhuǎn)至BOOT區(qū),MCU控制權(quán)被BOOT區(qū)獲得。保存指對(duì)APP區(qū)程序復(fù)位地址的保存,只有保存了該地址才能保證MCU控制權(quán)正常返還給APP區(qū)。
跳轉(zhuǎn)保存法采用一般分區(qū)方式,即APP區(qū)位于程序存儲(chǔ)器空間的低地址處,BOOT區(qū)在高地址處。因本文使用的上位機(jī)軟件為AVROSP,BOOT區(qū)需占用1 KB。此外,由于ATMega48不支持通過(guò)熔絲位修改程序的復(fù)位向量,故需多劃分給BOOT區(qū)4個(gè)頁(yè)面大小的空間。
為提高程序的可移植性,可使用預(yù)定義語(yǔ)句來(lái)劃分BOOT區(qū)大小,具體實(shí)現(xiàn)如下:
#define PAGESIZE 64
//每個(gè)頁(yè)面由64個(gè)字節(jié)組成
#define APP_PAGES ((4*1024/PAGESIZE) - ((1*1024+256)/PAGESIZE))
//APP區(qū)的頁(yè)面數(shù)
#define APP_END APP_PAGES*PAGESIZE
//APP區(qū)共占用的字節(jié)數(shù)
在編譯過(guò)程中,由于ICCAVR編譯器只支持標(biāo)準(zhǔn)的BOO了區(qū)大小設(shè)置,即256/512/1024/2048 KB。故使用下面方法定義BOOT區(qū)大;
#pragma text:mytext
voidboot()...
#pragma text;text
編譯過(guò)程中,在ProjectOptions→Target的Other Options中,添加“-bmytext;0x????”,其中0x????為BOOT區(qū)開(kāi)始的地址。這樣就可以根據(jù)實(shí)際需要設(shè)定BOO了區(qū)大小。這對(duì)于整個(gè)程序空間只有4 KB的ATMcga48來(lái)說(shuō),是非常適合的。程序具體流程如圖1所示。
如圖1所示,BOOT區(qū)程序塊的第一步就是讀取EEPROM中的APP區(qū)原復(fù)位地址,以便單片機(jī)在執(zhí)行BOOT區(qū)程序條件不成立時(shí),跳轉(zhuǎn)到APP區(qū)執(zhí)行程序。
EEPROM_READ(0xfe,AppReset);
當(dāng)執(zhí)行BOOT區(qū)程序條件成立時(shí),單片機(jī)將執(zhí)行BOOT區(qū)程序來(lái)更新APP區(qū)中的內(nèi)容。這里特別要注意對(duì)即將更新到APP區(qū)內(nèi)程序復(fù)位地址的處理:保存該程序中復(fù)位地址到RAM中,并修改該地址為BOOT區(qū)人口地址。這個(gè)工作必須在頁(yè)面填充前完成,否則在更新后,單片機(jī)復(fù)位運(yùn)行不會(huì)首先跳轉(zhuǎn)到BOOT區(qū)。
if(address==o){
AppReset=data;
data=BootReset; //BOOT區(qū)的入口
BootReset=0x1300
}
BOOT區(qū)程序塊最后一步是對(duì)APP區(qū)程序復(fù)位地址的保存。只有通過(guò)上電復(fù)位才能移交MCU控制權(quán)給APP區(qū),這將導(dǎo)致RAM被清零。為了保存RAM中的原APP區(qū)程序復(fù)位地址,需上電復(fù)位前,將這個(gè)地址保存到EEPROM中。
EEPROM_WRITE(Oxfe,APPReset);
值得一提的是,在第一次運(yùn)行時(shí),程序并不能直接跳轉(zhuǎn)到BOOT區(qū)首地址,所以第一次運(yùn)行時(shí),APP區(qū)內(nèi)容應(yīng)為空。這樣,當(dāng)單片機(jī)上電運(yùn)行時(shí),程序指針(PC)會(huì)自增向下運(yùn)行到第一句可執(zhí)行代碼,即BOOT區(qū)中的首行代碼。同樣,第一次運(yùn)行時(shí)也不可能讀取出正確的返回APP區(qū)的入口地址(取出值為0xFF),所以第一次運(yùn)行時(shí)必須保證執(zhí)行BOOT區(qū)程序條件成立,否則將無(wú)法正確跳回到APP區(qū)。只有執(zhí)行了BOOT區(qū)程序,才能寫(xiě)入正確的APP返回地址到EEPROM中,從而為以后的運(yùn)行做好準(zhǔn)備。
跳轉(zhuǎn)保存法遵循了Bootloader的常規(guī)實(shí)現(xiàn)流程,但它的MCU控制權(quán)交接處理比較復(fù)雜,下文將提到的倒置法就很好地解決了這個(gè)問(wèn)題。
1.2 倒置法
一般來(lái)說(shuō),程序存儲(chǔ)區(qū)的上部為NPP區(qū),下部為BOOT區(qū),這也是常規(guī)方法所采取的分區(qū)方法。這種分區(qū)方法由支持Bootloader功能的芯片程序存儲(chǔ)區(qū)中RWW和NRWW的劃分方式所決定的。針對(duì)Mega48,它的程序存儲(chǔ)區(qū)沒(méi)有RWW區(qū)和NRWW區(qū)之分,SPM指令可以在整個(gè)Flash區(qū)中執(zhí)行,所以大可不必拘泥于一般規(guī)律,完全可以把APP區(qū)和BOOT區(qū)倒置,即把程序存儲(chǔ)區(qū)的上部劃分為BOOT區(qū),下部劃分為APP區(qū)。本文中將這種分區(qū)方法稱為倒置分區(qū)方法。
倒置法背棄了常規(guī)分區(qū)形式,創(chuàng)新地采用倒置分區(qū)法對(duì)程序存儲(chǔ)區(qū)進(jìn)行分區(qū)。這樣,在每次上電后,BOOT區(qū)自動(dòng)獲得MCU
熱門(mén)點(diǎn)擊
- 8051單片機(jī)家族數(shù)據(jù)手冊(cè)鏈接大全
- dsPIC30F6010單片機(jī)的原理及應(yīng)用
- 一種通用的嵌入式系統(tǒng)ISP方法
- 浮點(diǎn)數(shù)保存代碼
- 基于FPGA/CPLD和USB技術(shù)的無(wú)損圖像
- 數(shù)字顯示器仍需處理模擬信號(hào)
- 常用PIC系列8位單片機(jī)芯片引腳符號(hào)的功能
- PIC系列單片機(jī)的偽指令
- 利用單片機(jī)PWM信號(hào)進(jìn)行舵機(jī)控制
- 產(chǎn)生低失真正弦波的CMOS六角反相器
推薦技術(shù)資料
- 硬盤(pán)式MP3播放器終級(jí)改
- 一次偶然的機(jī)會(huì)我結(jié)識(shí)了NE0 2511,那是一個(gè)遠(yuǎn)方的... [詳細(xì)]
- AMOLED顯示驅(qū)動(dòng)芯片關(guān)鍵技
- CMOS圖像傳感器技術(shù)參數(shù)設(shè)計(jì)
- GB300 超級(jí)芯片應(yīng)用需求分
- 4NP 工藝NVIDIA Bl
- GB300 芯片、NVL72
- 首個(gè)最新高端芯片人工智能服務(wù)器
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動(dòng)IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計(jì)
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究