国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

在PIC18單片機(jī)中使用BootLoader

發(fā)布時(shí)間:2010-9-16 10:20    發(fā)布者:techshare
關(guān)鍵詞: bootloader , PIC18 , 單片機(jī)
PIC單片機(jī)的BootLoader屬于需要自己寫程序的那種,可以根據(jù)自己的需要寫出各種功能的BootLoader程序來(lái)。目前,比較常見(jiàn)的BootLoader程序有Microchip公司的C18版本和著名的PICC編譯器廠商HI-TECH公司(以下簡(jiǎn)稱HI-TECH)的PICC18版本。它們的相似之處在于都占用了系統(tǒng)的0x00~0x1FF的程序空間。Microchip的版本是用純匯編寫的,而HI-TECH的版本是用C語(yǔ)言編寫的。

在PIC系列單片機(jī)中,只有PIC18系列和PIC16F87X系列的單片機(jī)才有IAP功能,才能夠使用BootLoader功能。下面只介紹PIC18的BootLoader,PIC16F87X的BootLoader與它類似。

1 BootLoader程序的工作原理

BootLoader是一段引導(dǎo)程序,在單片機(jī)上電/復(fù)位后在用戶程序之前先運(yùn)行。運(yùn)行后判斷當(dāng)前是否需要進(jìn)入升級(jí)狀態(tài)。如果不需要升級(jí),就直接運(yùn)行Flash中原有的程序;如果需要升級(jí),首先擦除舊的程序,然后從串口接收用戶程序,同時(shí)寫入Flash中。接收數(shù)據(jù)時(shí),需要進(jìn)行校驗(yàn),保證接收到的數(shù)據(jù)是正確的,避免將錯(cuò)誤的程序?qū)懭氲叫酒小?

PIC18單片機(jī)只有一塊Flash,可以在Flash的任何位置擦寫(甚至可以將BootLoader自身擦除);而51單片機(jī)一般都是兩塊Flash,只能夠從一塊Flash上擦寫另一塊Flash,而不能擦寫自身。

BootLoader程序原則上是可以放在整個(gè)程序空間中的任何位置的,但是為了簡(jiǎn)單方便、具有通用性和盡量減少對(duì)用戶程序的影響,使用了從0x00開(kāi)始的一段程序空間。

BootLoader程序可以多種方式獲取數(shù)據(jù),包括串口、并口、I2C、SPI、USB等;但是從實(shí)際使用來(lái)看,使用串口無(wú)疑是最方便的。

為了使得用戶程序可以獲得最大的程序空間,就需要BootLoader程序盡可能的簡(jiǎn)短。在這里,Microchip和HI-TECH都將BootLoader程序設(shè)計(jì)為小于200H個(gè)字節(jié)(100H個(gè)字)。使用0x00~0x1FF這個(gè)區(qū)域還有一個(gè)重要原因是,這個(gè)地址的空間有特殊的寫保護(hù)特性。

PIC18單片機(jī)雖然有多個(gè)中斷源,但只支持兩級(jí)中斷,有兩個(gè)中斷向量,分別位于0x08和0x18;而BootLoader程序占用了0x00~0x1FF的空間,這意味著需要重新定位中斷向量,使新的中斷向量指向用戶的中斷程序,這樣才能保證正常運(yùn)行用戶程序的中斷程序。

2 程序的使用方法

(1) HI-TECH的BootLoader程序

在HI-TECH的PICC18編譯器的examples文件夾下,有一個(gè)Bootldr子文件夾,里面就是HI-TECH的BootLoader程序。這是一個(gè)完整的程序,可以直接進(jìn)行編譯,編譯后的HEX可以用編程器下載到芯片中。

(2) 用戶系統(tǒng)的要求

如果需要使用BootLoader,要求用戶系統(tǒng)中有一個(gè)RS232串口可以和計(jì)算機(jī)進(jìn)行通信。

(3) 程序的配置

下面是程序的主要參數(shù),如果它們?cè)O(shè)置得不正確,會(huì)影響程序的使用。

VERB0:冗余模式,有更多的提示,但是會(huì)占用更多的程序空間,建議不用。

BOOT_TIMEOUT:等待超時(shí)的時(shí)間,0~9s(再長(zhǎng)了也沒(méi)有意義),默認(rèn)為5s。  

BAUD:串口通信的波特率,默認(rèn)是9 600。

FOSC:用戶系統(tǒng)的時(shí)鐘頻率,默認(rèn)是4 MHz。

NINE:通信是否使用第9位數(shù)據(jù)位,默認(rèn)不使用。?

FILL_BYTE:程序空間擦除時(shí)使用的填充數(shù)據(jù),默認(rèn)值是0xFF。?

PROG_START:用戶程序的起始位置,默認(rèn)是0x200。?

其他的參數(shù)可以先不用管,在需要時(shí)再修改,它們不影響通信和下載。

(4) 程序的編譯

有兩種方法對(duì)BootLoader程序進(jìn)行編譯:

① 命令行方式。使用命令行時(shí),典型的用法是:

picc18 -8f452 bootldr.c -o -zg -noerrata

上面的最后一個(gè)參數(shù) -noerrata是PIC18Fxx2系列單片機(jī)需要的,若是其他型號(hào),就不用加入;而參數(shù) -18f452是指定單片機(jī)的型號(hào),如果是其他型號(hào),就修改為實(shí)際使用的型號(hào)。

② 使用MPLAB IDE。使用MPLAB IDE時(shí),首先按照正常方式建立一個(gè)新的工程文件,選擇工程文件目錄,然后加入HI-TECH的Samples\Bootldr目錄下文件bootldr.c和bootldr.h。建立工程文件時(shí),選擇MCU的型號(hào)為實(shí)際使用的型號(hào),選擇C編譯器為HI-TECH的PICC18編譯器。

(5) 用戶程序的配置

使用HI-TECH版本的BootLoader,對(duì)用戶程序的修改是非常少和簡(jiǎn)單的,只需要修改用戶程序的偏移量就可以了,而不需要修改任何程序代碼或進(jìn)行任何特殊的配置。因?yàn)锽ootLoader程序需要占用0~1FFH的空間,所以用戶程序需要從200H處開(kāi)始運(yùn)行,即設(shè)置程序的偏移量為200H。方法是在MPLAB IDE中,從菜單中選擇Project→Build Options...→Project,在PICC-18 Linker頁(yè)標(biāo)下的Specify offset for ROM(ROM代碼偏移量)中輸入偏移量200(注意這里輸入的已經(jīng)是十六進(jìn)制了,不用再轉(zhuǎn)換),如圖1所示。



圖 1

(6) 程序配置字

對(duì)于每個(gè)PIC單片機(jī)的芯片,都需要設(shè)置正確的程序配置字后才能正常運(yùn)行。雖然在BootLoader中是可以修改配置字的,但是這樣并不安全,也不方便。一般情況下,程序配置字設(shè)定后是不需要修改的,所以配置字在燒寫B(tài)ootLoader程序時(shí)就一起寫入單片機(jī)芯片,以后就只使用BootLoader來(lái)升級(jí)(燒寫)程序,這樣不會(huì)破壞芯片的配置字。

(7) 調(diào)試用戶程序

平時(shí),在編寫和調(diào)試用戶程序時(shí),還是和正常方式一樣,單片機(jī)中不包含BootLoader程序,也不設(shè)置偏移量(或者設(shè)置為0),以方便使用ICD2等仿真器進(jìn)行程序仿真。等程序調(diào)試好后,再修改程序的偏移量為200H,并重新編譯程序,產(chǎn)生最終的用戶HEX代碼。這樣編譯好的程序才可以使用BootLoader進(jìn)行下載。

(8) 下載用戶程序

使用HI-TECH的BootLoader程序,在下載用戶程序到單片機(jī)中時(shí),可以不需要特殊的下載程序,只需要使用Windows自帶的超級(jí)終端程序就可以了。超級(jí)終端的通信參數(shù)需要設(shè)置成和BootLoader程序的一樣,包括波特率、校驗(yàn)、數(shù)據(jù)位、停止位等。

首先連接好串口線,再啟動(dòng)超級(jí)終端程序,然后復(fù)位單片機(jī)(單片機(jī)中應(yīng)當(dāng)已經(jīng)寫入了BootLoader程序)。這時(shí),在超級(jí)終端的窗口中會(huì)顯示出一個(gè)倒計(jì)時(shí)的計(jì)數(shù)器,計(jì)數(shù)器的初始值就是上面的BOOT_TIMEOUT參數(shù)。計(jì)數(shù)器每秒鐘刷新一次。當(dāng)計(jì)數(shù)器為0時(shí),就會(huì)運(yùn)行以前的程序。如果這期間從超級(jí)終端輸入任意數(shù)據(jù)(就是隨便按一個(gè)鍵,或者說(shuō)單片機(jī)從串口上接收任意數(shù)據(jù)),計(jì)數(shù)器就會(huì)停止計(jì)數(shù),進(jìn)入升級(jí)狀態(tài)。這時(shí)BootLoader程序會(huì)首先擦除舊的程序空間,然后屏幕上會(huì)顯示出一個(gè)冒號(hào)“:”,提示等待下載用戶程序。這時(shí)就可以從超級(jí)終端的菜單中選取傳送→發(fā)送文本文件,選擇編譯好的HEX文件即可。如果下載成功,超級(jí)終端的窗口中會(huì)顯示出一個(gè)小括號(hào)“)”,提示下載已經(jīng)完成,同時(shí)用戶程序會(huì)自動(dòng)開(kāi)始運(yùn)行。使用BootLoader下載時(shí),因?yàn)榇诘乃俣认鄬?duì)比較慢(與編程器相比),所以需要等待一會(huì)兒。具體時(shí)間與用戶程序的大小有關(guān)。如果下載中出現(xiàn)錯(cuò)誤,單片機(jī)會(huì)自動(dòng)復(fù)位,進(jìn)入倒計(jì)數(shù)狀態(tài),重復(fù)上面的過(guò)程。使用超級(jí)終端比較簡(jiǎn)單,不需要特殊的下載軟件;但是缺乏交互性,沒(méi)有進(jìn)程指示,如果下載過(guò)程中出現(xiàn)錯(cuò)誤也不能停止下來(lái)。

3 BootLoader程序的改進(jìn)  

(1) HI-TECH的BootLoader程序中存在的缺陷

雖然HI-TECH版本的BootLoader程序已經(jīng)很方便了,具備了所有必需的基本要素;但是程序中存在著一些缺陷,甚至是很重大的隱患,不太適合于直接使用在實(shí)際工程中。下面是主要存在的幾個(gè)問(wèn)題

①BootLoader是以從串口上接收任何數(shù)據(jù)為標(biāo)志進(jìn)入BootLoader狀態(tài)的。進(jìn)入BootLoader狀態(tài)后,BootLoader程序做的第一件事情就是擦除以前程序的空間。如果在實(shí)際使用中,單片機(jī)因?yàn)槟撤N意外原因被復(fù)位,而且復(fù)位后運(yùn)行BootLoader時(shí)在串口上有任何數(shù)據(jù)(如干擾信號(hào)或者系統(tǒng)正處于串口通信狀態(tài)),就會(huì)造成用戶程序的丟失。

② BootLoader程序中沒(méi)有使用看門狗。如果升級(jí)失敗或者升級(jí)過(guò)程中程序死機(jī),將不能恢復(fù)到初始的升級(jí)狀態(tài)。這對(duì)于直接串口連接的方式問(wèn)題不大,但是需要使用遠(yuǎn)程升級(jí)時(shí)是一個(gè)致命的問(wèn)題。

③ 在寫入用戶程序過(guò)程中如果出現(xiàn)數(shù)據(jù)錯(cuò)誤,就會(huì)復(fù)位,而這時(shí)用戶程序已經(jīng)被部分寫入了。如果復(fù)位后運(yùn)行BootLoader程序沒(méi)有收到信號(hào)時(shí),會(huì)啟動(dòng)用戶程序。這樣殘缺的用戶程序就可能會(huì)造成運(yùn)行故障和不可預(yù)料的結(jié)果。如果看門狗是在用戶程序中打開(kāi)的,這時(shí)就有可能出現(xiàn)看門狗沒(méi)有被啟動(dòng)而死機(jī)的現(xiàn)象,這是遠(yuǎn)程升級(jí)中一個(gè)嚴(yán)重的問(wèn)題。

④ BootLoader程序中允許寫EEPROM和芯片配置字。雖然這樣增加了靈活性,但是這樣是不安全的。如果配置字不小心設(shè)置錯(cuò)了,下載后會(huì)使整個(gè)芯片不能正常運(yùn)行。這時(shí)需要重新用編程器修改配置字才行。

只有設(shè)法克服上面提到的缺陷,才能將BootLoader程序應(yīng)用到實(shí)際系統(tǒng)中。

(2) 對(duì)HI-TECH的BootLoader程序的改進(jìn)

針對(duì)上面提到的問(wèn)題,對(duì)HI-TECH的BootLoader作了一些修改,刪除了部分很少用到的功能和不安全的功能,同時(shí)修改了進(jìn)入BootLoader狀態(tài)的判斷條件。除了使用增強(qiáng)的串口數(shù)據(jù)識(shí)別方式外,還增加了電平檢測(cè)的方式,用來(lái)判斷是否進(jìn)入BootLoader狀態(tài)。

① 針對(duì)上面第一項(xiàng)中的問(wèn)題,修改為識(shí)別特定字符串才可以進(jìn)入BootLoader的升級(jí)狀態(tài)。特定字符串的內(nèi)容和長(zhǎng)度可以由用戶自己定義(長(zhǎng)度不能超過(guò)12字節(jié)。在一般情況下,12字節(jié)的識(shí)別字符串應(yīng)當(dāng)足夠長(zhǎng)了)?梢允褂萌魏螖(shù)據(jù)(包括0)。

② 增加了特定引腳電平判斷方式,在BootLoader程序運(yùn)行后,判斷某個(gè)特定的引腳上的電壓是否是預(yù)定的電壓,由此決定是否需要進(jìn)入BootLoader升級(jí)狀態(tài)。引腳和預(yù)定電壓(高/低)可以自由設(shè)置。這種方式比較安全,但是不太適合于遠(yuǎn)程升級(jí)。

③ 增加了看門狗選項(xiàng),可以設(shè)置使用/不使用看門狗。一般設(shè)置看門狗的溢出時(shí)間在0.5~2s比較合適。

④ 增加了編程響應(yīng)。在每成功接收到一行HEX數(shù)據(jù)后,發(fā)出一個(gè)回應(yīng)字節(jié),用于編程時(shí)的錯(cuò)誤檢測(cè)。PC端的下載程序可以根據(jù)這個(gè)字節(jié)來(lái)判斷下載過(guò)程中是否出錯(cuò)。

⑤ 針對(duì)上面3(1)中③的問(wèn)題,可以這樣解決。將編譯后的HEX文件手工稍作修改,將0x200~0x220(假設(shè)用戶程序是從0x200開(kāi)始的)地址段的數(shù)據(jù)從文件的開(kāi)頭移動(dòng)到文件的結(jié)尾。這樣0x200處的代碼會(huì)在最后才寫入單片機(jī)中。如果寫入過(guò)程中出現(xiàn)故障,復(fù)位后即使BootLoader啟動(dòng)了用戶程序,也會(huì)因?yàn)檫@段區(qū)域沒(méi)有代碼而重新復(fù)位,而不會(huì)去運(yùn)行部分被寫入的用戶程序。不過(guò)這種方法需要對(duì)HEX文件的結(jié)構(gòu)有一定的了解才行。一個(gè)簡(jiǎn)單判斷HEX數(shù)據(jù)地址的方法是,HEX文件的每一行第一個(gè)字符是冒號(hào)“:”,冒號(hào)后的第3、4、5、6這四個(gè)數(shù)字就表示這一行數(shù)據(jù)的地址,是以十六進(jìn)制表示的。如:“:100200...”就表示地址是0x200。在正常情況下,編譯后的HEX文件數(shù)據(jù)是地址從低到高的順序排列的。

改進(jìn)后的程序增加了一部分參數(shù),它們是:

BOOT_SIGNAL——使用單片機(jī)引腳電平觸發(fā)方式進(jìn)入BootLoader;

BOOT_SIGNAL_PORT——定義電平觸發(fā)啟動(dòng)方式檢測(cè)用的引腳;

BOOT_SIGNAL_LEVEL——定義檢測(cè)電平1=高電平觸發(fā),0=低電平觸發(fā);

BOOT_TIME_DELAY——使用超時(shí)方式進(jìn)入BootLoader,這個(gè)參數(shù)和上面的BOOT_SIGNAL不能同時(shí)使用;

USE_EXTEND_HEX——是否接收擴(kuò)展的HEX代碼,不使用可以節(jié)省代碼,建議不用;

USEWDT——是否在BootLoader中使用看門狗,建議使用;

CONFIRM_TIME——聯(lián)機(jī)同步字節(jié)數(shù),在超時(shí)方式中使用多字節(jié)進(jìn)行同步;

CONFIRM_DATA——用戶可定義的聯(lián)機(jī)數(shù)據(jù);

USE_ECHOBACK——編程時(shí)是否回應(yīng),使用可以增加下載時(shí)的安全性,建議使用。

使用了BOOT_SIGNAL方式后,與超時(shí)方式相關(guān)的部分都不再起作用。這時(shí)可以定義使用任意引腳來(lái)判定是否需要進(jìn)入BootLoader。在使用BOOT_TIME_DELAY(超時(shí)方式)時(shí),增加了一些與之相關(guān)的內(nèi)容,如CONFIRM_DATA,可以使用任何特定的字符串來(lái)確認(rèn)是否需要進(jìn)入BootLoader狀態(tài),增加了BootLoader程序的安全性,避免受到干擾而誤進(jìn)入程序升級(jí)狀態(tài)。

(3) 其他改進(jìn)的建議和方法

① HI-TECH的BootLoader程序接收的是標(biāo)準(zhǔn)的HEX文件。這在很多時(shí)候是不夠安全的,不利于程序的加密,容易被反匯編和破解?梢詫(duì)HEX進(jìn)行加密處理,變成不能直接查看的數(shù)據(jù)。

② 使用超級(jí)終端進(jìn)行程序下載速度比較慢,同時(shí),如果下載中出現(xiàn)錯(cuò)誤,超級(jí)終端程序不能及時(shí)發(fā)現(xiàn)停止下來(lái),而是一直把文件發(fā)送完才能停下來(lái)。這時(shí)BootLoader程序會(huì)反復(fù)進(jìn)入BootLoader狀態(tài),對(duì)單片機(jī)有一定的損傷。最好是自行編寫一個(gè)計(jì)算機(jī)端的專用下載程序,不但可以提高下載的速度,也可以提高下載的成功率。

③ 使用RS422/485方式。有些時(shí)候,使用的并不是RS232串口,而是RS422/RS485串口。它們實(shí)際是類似的,只是在接口方式上有些區(qū)別。RS422/RS485需要控制發(fā)送,所以在BootLoader程序中增加一個(gè)發(fā)送控制就可以了。

④ 在BootLoader中,將波特率設(shè)置得很高并沒(méi)有太大的用處,它并不能夠提高下載整體的速度,而只能加快數(shù)據(jù)傳輸?shù)乃俣。因(yàn)檎麄(gè)下載分為數(shù)據(jù)通信(數(shù)據(jù)傳輸)和Flash寫入/擦除(數(shù)據(jù)等待)兩個(gè)部分。程序代碼Flash空間的擦除和寫入速度是比較慢的(典型值是3~?4 ms),太快了反而容易丟失數(shù)據(jù),造成下載失敗。使用9600 bps的波特率時(shí),傳輸1字節(jié)的數(shù)據(jù)大約是1 ms,接收一個(gè)緩沖區(qū)8字節(jié)大約需要8 ms,大于寫入延時(shí),所以不需要延時(shí);當(dāng)通信速率超過(guò)9600 bps時(shí),接收8字節(jié)緩沖區(qū)的時(shí)間可能會(huì)小于寫入時(shí)間,需要在通信中延時(shí)。實(shí)際使用的測(cè)試結(jié)果是:使用9600 bps比使用14 400 bps時(shí)慢50%,使用57 600 bps比9600 bps快一倍,而使用115 200 bps時(shí)與57 600 bps幾乎沒(méi)有任何區(qū)別。如果使用超級(jí)終端下載,就更沒(méi)有必要設(shè)置高波特率了。因?yàn)樵谑褂米畛S玫娜方式通信時(shí)(沒(méi)有控制信號(hào)),超級(jí)終端采用了比較保守的方式發(fā)送數(shù)據(jù),本身就比較慢。

結(jié)語(yǔ)

一個(gè)良好的BootLoader程序應(yīng)該具有良好的可維護(hù)性并可以正確處理異常情況,不會(huì)因?yàn)橐馔馇闆r引起系統(tǒng)的損壞和崩潰。

可以在http://shaoziyang.logchina.com/blog/article_156363.936124.html處下載改進(jìn)后的BootLoader程序(這個(gè)程序已經(jīng)在實(shí)際工程中使用了較長(zhǎng)時(shí)間,很穩(wěn)定),以及一個(gè)替換超級(jí)終端的PIC18專用下載程序(這個(gè)程序的下載速度比超級(jí)終端快很多,可以自行定義波特率和聯(lián)機(jī)的字符串,具有BootLoader區(qū)代碼保護(hù)功能和下載錯(cuò)誤檢測(cè)功能)。
本文地址:http://m.qingdxww.cn/thread-27036-1-1.html     【打印本頁(yè)】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
hszx 發(fā)表于 2011-3-7 11:22:12
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • PIC32CK SG單片機(jī)——輕松滿足新型網(wǎng)絡(luò)安全要求
  • 實(shí)時(shí)控制解決方案的正確選擇——數(shù)字信號(hào)控制器(DSC)或通用MCU
  • 探索PIC16F13145 MCU系列——快速概覽
  • dsPIC® DSC集成電機(jī)驅(qū)動(dòng)器:非常適合在緊湊空間內(nèi)進(jìn)行實(shí)時(shí)控制
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)在線工具

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 全免费午夜一级毛片真人| 日本成人a视频| 欧美一级视| 日本亚洲a| 日韩欧美一区二区三区中文精品| 日韩欧美中文字幕一区| 亚洲二区在线| 欧美成视频无需播放器| 日韩视| 奇米影视国产精品四色| 欧美成人午夜片一一在线观看| 亚洲国产欧美精品| 欧美一级精品高清在线观看| 日本免费一区二区三区a区| 日韩高清在线播放不卡| 亚洲黄色毛片| 亚洲视频中文字幕在线| 欧美另美人妖| 午夜精品在线免费观看| 亚洲精品乱无伦码| 三级黄色网络| 亚洲综合一区二区不卡| 欧美日韩国产综合在线| 日韩伊人网| 亚洲狠狠97婷婷综合久久久久 | 午夜毛片视频高清不卡免费| 午夜视频啪啪| 亚洲精品美女在线观看播放| 香蕉久久久久久狠狠色| 亚洲日本中文字幕天天更新| 亚洲精品免费观看| 欧美亚洲国产精品久久第一页| 四虎社区| 欧美第一页在线| 亚洲综合18p| 欧美国产91| 性感一级毛片| 亚洲精品在线视频观看| 思思99热在线观看精品| 午夜在线不卡| 色视频在线观看完整免费版|