<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 在PIC18單片機中使用BootLoader

在PIC18單片機中使用BootLoader

——
作者: 時(shí)間:2007-04-09 來(lái)源: 收藏
 PIC的BootLoader屬于需要自己寫(xiě)程序的那種,可以根據自己的需要寫(xiě)出各種功能的BootLoader程序來(lái)。目前,比較常見(jiàn)的BootLoader程序有Microchip公司的C18版本和著(zhù)名的PICC編譯器廠(chǎng)商HI-TECH公司(以下簡(jiǎn)稱(chēng)HI-TECH)的PICC18版本。它們的相似之處在于都占用了系統的0x00~0x1FF的程序空間。Microchip的版本是用純匯編寫(xiě)的,而HI-TECH的版本是用C語(yǔ)言編寫(xiě)的。
 
    引 言  
 
    在PIC系列中,只有系列和PIC16F87X系列的才有IAP功能,才能夠使用BootLoader功能。下面只介紹的BootLoader,PIC16F87X的BootLoader與它類(lèi)似。
  
    1 BootLoader程序的工作原理
  
    BootLoader是一段引導程序,在單片機上電/復位后在用戶(hù)程序之前先運行。運行后判斷當前是否需要進(jìn)入升級狀態(tài)。如果不需要升級,就直接運行Flash中原有的程序;如果需要升級,首先擦除舊的程序,然后從串口接收用戶(hù)程序,同時(shí)寫(xiě)入Flash中。接收數據時(shí),需要進(jìn)行校驗,保證接收到的數據是正確的,避免將錯誤的程序寫(xiě)入到芯片中。
  
    單片機只有一塊Flash,可以在Flash的任何位置擦寫(xiě)(甚至可以將BootLoader自身擦除);而51單片機一般都是兩塊Flash,只能夠從一塊Flash上擦寫(xiě)另一塊Flash,而不能擦寫(xiě)自身。
  
    BootLoader程序原則上是可以放在整個(gè)程序空間中的任何位置的,但是為了簡(jiǎn)單方便、具有通用性和盡量減少對用戶(hù)程序的影響,使用了從0x00開(kāi)始的一段程序空間。
  
    BootLoader程序可以多種方式獲取數據,包括串口、并口、I2C、SPI、USB等;但是從實(shí)際使用來(lái)看,使用串口無(wú)疑是最方便的。
  
    為了使得用戶(hù)程序可以獲得最大的程序空間,就需要BootLoader程序盡可能的簡(jiǎn)短。在這里,Microchip和HI-TECH都將BootLoader程序設計為小于200H個(gè)字節(100H個(gè)字)。使用0x00~0x1FF這個(gè)區域還有一個(gè)重要原因是,這個(gè)地址的空間有特殊的寫(xiě)保護特性。
  
    PIC18單片機雖然有多個(gè)中斷源,但只支持兩級中斷,有兩個(gè)中斷向量,分別位于0x08和0x18;而B(niǎo)ootLoader程序占用了0x00~0x1FF的空間,這意味著(zhù)需要重新定位中斷向量,使新的中斷向量指向用戶(hù)的中斷程序,這樣才能保證正常運行用戶(hù)程序的中斷程序。
  
    2 程序的使用方法
  
    (1) HI-TECH的BootLoader程序
  
    在HI-TECH的PICC18編譯器的examples文件夾下,有一個(gè)Bootldr子文件夾,里面就是HI-TECH的BootLoader程序。這是一個(gè)完整的程序,可以直接進(jìn)行編譯,編譯后的HEX可以用編程器下載到芯片中。
  
    (2) 用戶(hù)系統的要求
  
    如果需要使用BootLoader,要求用戶(hù)系統中有一個(gè)RS232串口可以和計算機進(jìn)行通信。
  
    (3) 程序的配置
  
    下面是程序的主要參數,如果它們設置得不正確,會(huì )影響程序的使用。
  
    VERB0:冗余模式,有更多的提示,但是會(huì )占用更多的程序空間,建議不用。
  
    BOOT_TIMEOUT:等待超時(shí)的時(shí)間,0~9s(再長(cháng)了也沒(méi)有意義),默認為5s。
  
    BAUD:串口通信的波特率,默認是9 600。
  
    FOSC:用戶(hù)系統的時(shí)鐘頻率,默認是4 MHz。
  
    NINE:通信是否使用第9位數據位,默認不使用。
  
    FILL_BYTE:程序空間擦除時(shí)使用的填充數據,默認值是0xFF。
  
    PROG_START:用戶(hù)程序的起始位置,默認是0x200。
  
    其他的參數可以先不用管,在需要時(shí)再修改,它們不影響通信和下載。
  
    (4) 程序的編譯
  
    有兩種方法對BootLoader程序進(jìn)行編譯:
  
    ① 命令行方式。使用命令行時(shí),典型的用法是:
  
    picc18 -8f452 bootldr.c -o -zg -noerrata
  
    上面的最后一個(gè)參數 -noerrata是PIC18Fxx2系列單片機需要的,若是其他型號,就不用加入;而參數 -18f452是指定單片機的型號,如果是其他型號,就修改為實(shí)際使用的型號。
  
    ② 使用MPLAB IDE。使用MPLAB IDE時(shí),首先按照正常方式建立一個(gè)新的工程文件,選擇工程文件目錄,然后加入HI-TECH的SamplesBootldr目錄下文件bootldr.c和bootldr.h。建立工程文件時(shí),選擇MCU的型號為實(shí)際使用的型號,選擇C編譯器為HI-TECH的PICC18編譯器。
 
    (5) 用戶(hù)程序的配置
  
    使用HI-TECH版本的BootLoader,對用戶(hù)程序的修改是非常少和簡(jiǎn)單的,只需要修改用戶(hù)程序的偏移量就可以了,而不需要修改任何程序代碼或進(jìn)行任何特殊的配置。因為BootLoader程序需要占用0~1FFH的空間,所以用戶(hù)程序需要從200H處開(kāi)始運行,即設置程序的偏移量為200H。方法是在MPLAB IDE中,從菜單中選擇Project→Build Options...→Project,在PICC-18 Linker頁(yè)標下的Specify offset for ROM(ROM代碼偏移量)中輸入偏移量200(注意這里輸入的已經(jīng)是十六進(jìn)制了,不用再轉換),如圖1所示。

用戶(hù)程序的配置

圖 1
 ?。?) 程序配置字
  
         對于每個(gè)PIC單片機的芯片,都需要設置正確的程序配置字后才能正常運行。雖然在BootLoader中是可以修改配置字的,但是這樣并不安全,也不方便。一般情況下,程序配置字設定后是不需要修改的,所以配置字在燒寫(xiě)BootLoader程序時(shí)就一起寫(xiě)入單片機芯片,以后就只使用BootLoader來(lái)升級(燒寫(xiě))程序,這樣不會(huì )破壞芯片的配置字。
  
       (7) 調試用戶(hù)程序
  
        平時(shí),在編寫(xiě)和調試用戶(hù)程序時(shí),還是和正常方式一樣,單片機中不包含BootLoader程序,也不設置偏移量(或者設置為0),以方便使用ICD2等仿真器進(jìn)行程序仿真。等程序調試好后,再修改程序的偏移量為200H,并重新編譯程序,產(chǎn)生最終的用戶(hù)HEX代碼。這樣編譯好的程序才可以使用BootLoader進(jìn)行下載。
  
        (8) 下載用戶(hù)程序
  
        使用HI-TECH的BootLoader程序,在下載用戶(hù)程序到單片機中時(shí),可以不需要特殊的下載程序,只需要使用Windows自帶的超級終端程序就可以了。超級終端的通信參數需要設置成和BootLoader程序的一樣,包括波特率、校驗、數據位、停止位等。
  
        首先連接好串口線(xiàn),再啟動(dòng)超級終端程序,然后復位單片機(單片機中應當已經(jīng)寫(xiě)入了BootLoader程序)。這時(shí),在超級終端的窗口中會(huì )顯示出一個(gè)倒計時(shí)的計數器,計數器的初始值就是上面的BOOT_TIMEOUT參數。計數器每秒鐘刷新一次。當計數器為0時(shí),就會(huì )運行以前的程序。
 
        如果這期間從超級終端輸入任意數據(就是隨便按一個(gè)鍵,或者說(shuō)單片機從串口上接收任意數據),計數器就會(huì )停止計數,進(jìn)入升級狀態(tài)。這時(shí)BootLoader程序會(huì )首先擦除舊的程序空間,然后屏幕上會(huì )顯示出一個(gè)冒號“:”,提示等待下載用戶(hù)程序。這時(shí)就可以從超級終端的菜單中選取傳送→發(fā)送文本文件,選擇編譯好的HEX文件即可。如果下載成功,超級終端的窗口中會(huì )顯示出一個(gè)小括號“)”,提示下載已經(jīng)完成,同時(shí)用戶(hù)程序會(huì )自動(dòng)開(kāi)始運行。使用BootLoader下載時(shí),因為串口的速度相對比較慢(與編程器相比),所以需要等待一會(huì )兒。具體時(shí)間與用戶(hù)程序的大小有關(guān)。如果下載中出現錯誤,單片機會(huì )自動(dòng)復位,進(jìn)入倒計數狀態(tài),重復上面的過(guò)程。使用超級終端比較簡(jiǎn)單,不需要特殊的下載軟件;但是缺乏交互性,沒(méi)有進(jìn)程指示,如果下載過(guò)程中出現錯誤也不能停止下來(lái)。
  
        3 BootLoader程序的改進(jìn)
  
        (1) HI-TECH的BootLoader程序中存在的缺陷
  
        雖然HI-TECH版本的BootLoader程序已經(jīng)很方便了,具備了所有必需的基本要素;但是程序中存在著(zhù)一些缺陷,甚至是很重大的隱患,不太適合于直接使用在實(shí)際工程中。下面是主要存在的幾個(gè)問(wèn)題
  
        ①BootLoader是以從串口上接收任何數據為標志進(jìn)入BootLoader狀態(tài)的。進(jìn)入BootLoader狀態(tài)后,BootLoader程序做的第一件事情就是擦除以前程序的空間。如果在實(shí)際使用中,單片機因為某種意外原因被復位,而且復位后運行BootLoader時(shí)在串口上有任何數據(如干擾信號或者系統正處于串口通信狀態(tài)),就會(huì )造成用戶(hù)程序的丟失。
  
        ② BootLoader程序中沒(méi)有使用看門(mén)狗。如果升級失敗或者升級過(guò)程中程序死機,將不能恢復到初始的升級狀態(tài)。這對于直接串口連接的方式問(wèn)題不大,但是需要使用遠程升級時(shí)是一個(gè)致命的問(wèn)題。
  
        ③ 在寫(xiě)入用戶(hù)程序過(guò)程中如果出現數據錯誤,就會(huì )復位,而這時(shí)用戶(hù)程序已經(jīng)被部分寫(xiě)入了。如果復位后運行BootLoader程序沒(méi)有收到信號時(shí),會(huì )啟動(dòng)用戶(hù)程序。這樣殘缺的用戶(hù)程序就可能會(huì )造成運行故障和不可預料的結果。如果看門(mén)狗是在用戶(hù)程序中打開(kāi)的,這時(shí)就有可能出現看門(mén)狗沒(méi)有被啟動(dòng)而死機的現象,這是遠程升級中一個(gè)嚴重的問(wèn)題。
  
        ④ BootLoader程序中允許寫(xiě)EEPROM和芯片配置字。雖然這樣增加了靈活性,但是這樣是不安全的。如果配置字不小心設置錯了,下載后會(huì )使整個(gè)芯片不能正常運行。這時(shí)需要重新用編程器修改配置字才行。
  
        只有設法克服上面提到的缺陷,才能將BootLoader程序應用到實(shí)際系統中。
 
        (2) 對HI-TECH的BootLoader程序的改進(jìn)
  
        針對上面提到的問(wèn)題,對HI-TECH的BootLoader作了一些修改,刪除了部分很少用到的功能和不安全的功能,同時(shí)修改了進(jìn)入BootLoader狀態(tài)的判斷條件。除了使用增強的串口數據識別方式外,還增加了電平檢測的方式,用來(lái)判斷是否進(jìn)入BootLoader狀態(tài)。
  
        ① 針對上面第一項中的問(wèn)題,修改為識別特定字符串才可以進(jìn)入BootLoader的升級狀態(tài)。特定字符串的內容和長(cháng)度可以由用戶(hù)自己定義(長(cháng)度不能超過(guò)12字節。在一般情況下,12字節的識別字符串應當足夠長(cháng)了)??梢允褂萌魏螖祿ò?)。
  
        ② 增加了特定引腳電平判斷方式,在BootLoader程序運行后,判斷某個(gè)特定的引腳上的電壓是否是預定的電壓,由此決定是否需要進(jìn)入BootLoader升級狀態(tài)。引腳和預定電壓(高/低)可以自由設置。這種方式比較安全,但是不太適合于遠程升級。
  
        ③ 增加了看門(mén)狗選項,可以設置使用/不使用看門(mén)狗。一般設置看門(mén)狗的溢出時(shí)間在0.5~2s比較合適。

 ?、?增加了編程響應。在每成功接收到一行HEX數據后,發(fā)出一個(gè)回應字節,用于編程時(shí)的錯誤檢測。PC端的下載程序可以根據這個(gè)字節來(lái)判斷下載過(guò)程中是否出錯。
  
        ⑤ 針對上面3(1)中③的問(wèn)題,可以這樣解決。將編譯后的HEX文件手工稍作修改,將0x200~0x220(假設用戶(hù)程序是從0x200開(kāi)始的)地址段的數據從文件的開(kāi)頭移動(dòng)到文件的結尾。這樣0x200處的代碼會(huì )在最后才寫(xiě)入單片機中。如果寫(xiě)入過(guò)程中出現故障,復位后即使BootLoader啟動(dòng)了用戶(hù)程序,也會(huì )因為這段區域沒(méi)有代碼而重新復位,而不會(huì )去運行部分被寫(xiě)入的用戶(hù)程序。不過(guò)這種方法需要對HEX文件的結構有一定的了解才行。
       
        一個(gè)簡(jiǎn)單判斷HEX數據地址的方法是,HEX文件的每一行第一個(gè)字符是冒號“:”,冒號后的第3、4、5、6這四個(gè)數字就表示這一行數據的地址,是以十六進(jìn)制表示的。如:“:100200...”就表示地址是0x200。在正常情況下,編譯后的HEX文件數據是地址從低到高的順序排列的。
  
        改進(jìn)后的程序增加了一部分參數,它們是:
  BOOT_SIGNAL——使用單片機引腳電平觸發(fā)方式進(jìn)入BootLoader;
  BOOT_SIGNAL_PORT——定義電平觸發(fā)啟動(dòng)方式檢測用的引腳;
  BOOT_SIGNAL_LEVEL——定義檢測電平1=高電平觸發(fā),0=低電平觸發(fā);
  BOOT_TIME_DELAY——使用超時(shí)方式進(jìn)入BootLoader,這個(gè)參數和上面的BOOT_SIGNAL不能同時(shí)使用;
  USE_EXTEND_HEX——是否接收擴展的HEX代碼,不使用可以節省代碼,建議不用;
  USEWDT——是否在BootLoader中使用看門(mén)狗,建議使用;
  CONFIRM_TIME——聯(lián)機同步字節數,在超時(shí)方式中使用多字節進(jìn)行同步;
  CONFIRM_DATA——用戶(hù)可定義的聯(lián)機數據;
  USE_ECHOBACK——編程時(shí)是否回應,使用可以增加下載時(shí)的安全性,建議使用。
  
        使用了BOOT_SIGNAL方式后,與超時(shí)方式相關(guān)的部分都不再起作用。這時(shí)可以定義使用任意引腳來(lái)判定是否需要進(jìn)入BootLoader。在使用BOOT_TIME_DELAY(超時(shí)方式)時(shí),增加了一些與之相關(guān)的內容,如CONFIRM_DATA,可以使用任何特定的字符串來(lái)確認是否需要進(jìn)入BootLoader狀態(tài),增加了BootLoader程序的安全性,避免受到干擾而誤進(jìn)入程序升級狀態(tài)。
  
        (3) 其他改進(jìn)的建議和方法
  
        ① HI-TECH的BootLoader程序接收的是標準的HEX文件。這在很多時(shí)候是不夠安全的,不利于程序的加密,容易被反匯編和破解??梢詫EX進(jìn)行加密處理,變成不能直接查看的數據。
  
        ② 使用超級終端進(jìn)行程序下載速度比較慢,同時(shí),如果下載中出現錯誤,超級終端程序不能及時(shí)發(fā)現停止下來(lái),而是一直把文件發(fā)送完才能停下來(lái)。這時(shí)BootLoader程序會(huì )反復進(jìn)入BootLoader狀態(tài),對單片機有一定的損傷。最好是自行編寫(xiě)一個(gè)計算機端的專(zhuān)用下載程序,不但可以提高下載的速度,也可以提高下載的成功率。
  
        ③ 使用RS422/485方式。有些時(shí)候,使用的并不是RS232串口,而是RS422/RS485串口。它們實(shí)際是類(lèi)似的,只是在接口方式上有些區別。RS422/RS485需要控制發(fā)送,所以在BootLoader程序中增加一個(gè)發(fā)送控制就可以了。
        ④ 在BootLoader中,將波特率設置得很高并沒(méi)有太大的用處,它并不能夠提高下載整體的速度,而只能加快數據傳輸的速度。因為整個(gè)下載分為數據通信(數據傳輸)和Flash寫(xiě)入/擦除(數據等待)兩個(gè)部分。程序代碼Flash空間的擦除和寫(xiě)入速度是比較慢的(典型值是3~4 ms),太快了反而容易丟失數據,造成下載失敗。
 
        使用9600 bps的波特率時(shí),傳輸1字節的數據大約是1 ms,接收一個(gè)緩沖區8字節大約需要8 ms,大于寫(xiě)入延時(shí),所以不需要延時(shí);當通信速率超過(guò)9600 bps時(shí),接收8字節緩沖區的時(shí)間可能會(huì )小于寫(xiě)入時(shí)間,需要在通信中延時(shí)。實(shí)際使用的測試結果是:使用9600 bps比使用14 400 bps時(shí)慢50%,使用57 600 bps比9600 bps快一倍,而使用115 200 bps時(shí)與57 600 bps幾乎沒(méi)有任何區別。如果使用超級終端下載,就更沒(méi)有必要設置高波特率了。因為在使用最常用的三線(xiàn)方式通信時(shí)(沒(méi)有控制信號),超級終端采用了比較保守的方式發(fā)送數據,本身就比較慢。
  
        結語(yǔ)
  
        一個(gè)良好的BootLoader程序應該具有良好的可維護性并可以正確處理異常情況,不會(huì )因為意外情況引起系統的損壞和崩潰。

51單片機相關(guān)文章:51單片機教程


c語(yǔ)言相關(guān)文章:c語(yǔ)言教程


單片機相關(guān)文章:單片機教程


單片機相關(guān)文章:單片機視頻教程


單片機相關(guān)文章:單片機工作原理


塵埃粒子計數器相關(guān)文章:塵埃粒子計數器原理


關(guān)鍵詞: bootloader PIC18 單片機

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>