PIC18系列單片機中使用BootLoader

摘要:介紹在PIC18系列單片機中使用BootLoader的原理、方法及優點;介紹HI-TECH公司使用C語言實現BootLoader的程序,給出詳細的使用方法和參數配置方法;針對程序中存在的問題進行探討和修改,使修改後的程序實用、可靠。另外,探討對程序數據進行加密、加快下載速度、在RS485/RS422中使用BootLoader的方法和思路。根據此方法,讀者可以編寫出適合自己使用的BootLoader程序。


關鍵詞:BootLoader PIC18 IAP 在線升級
引 言


  PIC單片機的BootLoader屬於需要自己寫程序的那種,可以根據自己的需要寫出各種功能的BootLoader程序來。目前,比較常見的BootLoader程序有Microchip公司的C18版本和着名的PICC編譯器廠商HI-TECH公司(以下簡稱HI-TECH)的PICC18版本。它們的相似之處在於都佔用了系統的0x00~0x1FF的程序空間。Microchip的版本是用純彙編寫的,而HI-TECH的版本是用C語言編寫的。
  在PIC系列單片機中,只有PIC18系列和PIC16F87X系列的單片機纔有IAP功能,才能夠使用BootLoader功能。下面只介紹PIC18的BootLoader,PIC16F87X的BootLoader與它類似。


1 BootLoader程序的工作原理


  BootLoader是一段引導程序,在單片機上電/複位後在用戶程序之前先運行。運行後判斷當前是否需要進入升級狀態。如果不需要升級,就直接運行Flash中原有的程序;如果需要升級,首先擦除舊的程序,然後從串口接收用戶程序,同時寫入Flash中。接收數據時,需要進行校驗,保證接收到的數據是正確的,避免將錯誤的程序寫入到芯片中。
  PIC18單片機只有一塊Flash,可以在Flash的任何位置擦寫(甚至可以將BootLoader自身擦除);而51單片機一般都是兩塊Flash,只能夠從一塊Flash上擦寫另一塊Flash,而不能擦寫自身。
  BootLoader程序原則上是可以放在整個程序空間中的任何位置的,但是爲了簡單方便、具有通用性和儘量減少對用戶程序的影響,使用了從0x00開始的一段程序空間。
  BootLoader程序可以多種方式獲取數據,包括串口、並口、I2C、SPI、USB等;但是從實際使用來看,使用串口無疑是最方便的。
  爲了使得用戶程序可以獲得最大的程序空間,就需要BootLoader程序儘可能的簡短。在這裏,Microchip和HI-TECH都將BootLoader程序設計爲小於200H個字節(100H個字)。使用0x00~0x1FF這個區域還有一個重要原因是,這個地址的空間有特殊的寫保護特性。
  PIC18單片機雖然有多箇中斷源,但只支持兩級中斷,有兩個中斷向量,分別位於0x08和0x18;而BootLoader程序佔用了0x00~0x1FF的空間,這意味着需要重新定位中斷向量,使新的中斷向量指向用戶的中斷程序,這樣才能保證正常運行用戶程序的中斷程序。


2 程序的使用方法


  (1) HI-TECH的BootLoader程序
  在HI-TECH的PICC18編譯器的examples文件夾下,有一個Bootldr子文件夾,裏麵就是HI-TECH的BootLoader程序。這是一個完整的程序,可以直接進行編譯,編譯後的HEX可以用編程器下載到芯片中。
  (2) 用戶系統的要求
  如果需要使用BootLoader,要求用戶系統中有一個RS232串口可以和計算機進行通信。
  (3) 程序的配置
  下麵是程序的主要參數,如果它們設置得不正確,會影響程序的使用。
  VERB0:冗餘模式,有更多的提示,但是會佔用更多的程序空間,建議不用。
  BOOT_TIMEOUT:等待超時的時間,0~9s(再長了也沒有意義),默認爲5s。 
  BAUD:串口通信的波特率,默認是9 600。
  FOSC:用戶系統的時鍾頻率,默認是4 MHz。
  NINE:通信是否使用第9位數據位,默認不使用。?
  FILL_BYTE:程序空間擦除時使用的填充數據,默認值是0xFF。?
  PROG_START:用戶程序的起始位置,默認是0x200。?
  其他的參數可以先不用管,在需要時再修改,它們不影響通信和下載。


  (4) 程序的編譯


  有兩種方法對BootLoader程序進行編譯:


  ① 命令行方式。使用命令行時,典型的用法是:
  picc18 -8f452 bootldr.c -o -zg -noerrata?
  上麵的最後一個參數 -noerrata是PIC18Fxx2系列單片機需要的,若是其他型號,就不用加入;而參數 -18f452是指定單片機的型號,如果是其他型號,就修改爲實際使用的型號。
  ② 使用MPLAB IDE。使用MPLAB IDE時,首先按照正常方式建立一個新的工程文件,選擇工程文件目錄,然後加入HI-TECH的Samples/Bootldr目錄下文件bootldr.c和bootldr.h。建立工程文件時,選擇MCU的型號爲實際使用的型號,選擇C編譯器爲HI-TECH的PICC18編譯器。


  (5) 用戶程序的配置
  使用HI-TECH版本的BootLoader,對用戶程序的修改是非常少和簡單的,只需要修改用戶程序的偏移量就可以了,而不需要修改任何程序代碼或進行任何特殊的配置。因爲BootLoader程序需要佔用0~1FFH的空間,所以用戶程序需要從200H處開始運行,即設置程序的偏移量爲200H。方法是在MPLAB IDE中,從菜單中選擇Project→Build Options...→Project,在PICC-18 Linker頁標下的Specify offset for ROM(ROM代碼偏移量)中輸入偏移量200(注意這裏輸入的已經是十六進制了,不用再轉換),如圖1所示。

    
                     圖 1


  (6) 程序配置字
  對於每個PIC單片機的芯片,都需要設置正確的程序配置字後才能正常運行。雖然在BootLoader中是可以修改配置字的,但是這樣並不安全,也不方便。一般情況下,程序配置字設定後是不需要修改的,所以配置字在燒寫BootLoader程序時就一起寫入單片機芯片,以後就只使用BootLoader來升級(燒寫)程序,這樣不會破壞芯片的配置字。


  (7) 調試用戶程序
  平時,在編寫和調試用戶程序時,還是和正常方式一樣,單片機中不包含BootLoader程序,也不設置偏移量(或者設置爲0),以方便使用ICD2等仿真器進行程序仿真。等程序調試好後,再修改程序的偏移量爲200H,並重新編譯程序,產生最終的用戶HEX代碼。這樣編譯好的程序纔可以使用BootLoader進行下載。


  (8) 下載用戶程序    
  使用HI-TECH的BootLoader程序,在下載用戶程序到單片機中時,可以不需要特殊的下載程序,只需要使用Windows自帶的超級終端程序就可以了。超級終端的通信參數需要設置成和BootLoader程序的一樣,包括波特率、校驗、數據位、停止位等。
  首先連接好串口線,再啓動超級終端程序,然後複位單片機(單片機中應當已經寫入了BootLoader程序)。這時,在超級終端的窗口中會顯示出一個倒計時的計數器,計數器的初始值就是上麵的BOOT_TIMEOUT參數。計數器每秒鍾刷新一次。當計數器爲0時,就會運行以前的程序。如果這期間從超級終端輸入任意數據(就是隨便按一個鍵,或者說單片機從串口上接收任意數據),計數器就會停止計數,進入升級狀態。這時BootLoader程序會首先擦除舊的程序空間,然後屏幕上會顯示出一個冒號“:”,提示等待下載用戶程序。這時就可以從超級終端的菜單中選取傳送→發送文本文件,選擇編譯好的HEX文件即可。如果下載成功,超級終端的窗口中會顯示出一個小括號“)”,提示下載已經完成,同時用戶程序會自動開始運行。使用BootLoader下載時,因爲串口的速度相對比較慢(與編程器相比),所以需要等待一會兒。具體時間與用戶程序的大小有關。如果下載中出現錯誤,單片機會自動複位,進入倒計數狀態,重複上麵的過程。使用超級終端比較簡單,不需要特殊的下載軟件;但是缺乏交互性,沒有進程指示,如果下載過程中出現錯誤也不能停止下來。


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


  雖然HI-TECH版本的BootLoader程序已經很方便了,具備了所有必需的基本要素;但是程序中存在着一些缺陷,甚至是很重大的隱患,不太適合於直接使用在實際工程中。下麵是主要存在的幾個問題
  ①BootLoader是以從串口上接收任何數據爲標誌進入BootLoader狀態的。進入BootLoader狀態後,BootLoader程序做的第一件事情就是擦除以前程序的空間。如果在實際使用中,單片機因爲某種意外原因被複位,而且複位後運行BootLoader時在串口上有任何數據(如干擾信號或者系統正處於串口通信狀態),就會造成用戶程序的丟失。
  ② BootLoader程序中沒有使用看門狗。如果升級失敗或者升級過程中程序死機,將不能恢複到初始的升級狀態。這對於直接串口連接的方式問題不大,但是需要使用遠程升級時是一個致命的問題。
  ③ 在寫入用戶程序過程中如果出現數據錯誤,就會複位,而這時用戶程序已經被部分寫入了。如果複位後運行BootLoader程序沒有收到信號時,會啓動用戶程序。這樣殘缺的用戶程序就可能會造成運行故障和不可預料的結果。如果看門狗是在用戶程序中打開的,這時就有可能出現看門狗沒有被啓動而死機的現象,這是遠程升級中一個嚴重的問題。?
  
   ④ BootLoader程序中允許寫EEPROM和芯片配置字。雖然這樣增加了靈活性,但是這樣是不安全的。如果配置字不小心設置錯了,下載後會使整個芯片不能正常運行。這時需要重新用編程器修改配置字才行。
  只有設法克服上麵提到的缺陷,才能將BootLoader程序應用到實際系統中。


  (2) 對HI-TECH的BootLoader程序的改進
  針對上麵提到的問題,對HI-TECH的BootLoader作了一些修改,刪除了部分很少用到的功能和不安全的功能,同時修改了進入BootLoader狀態的判斷條件。除了使用增強的串口數據識別方式外,還增加了電平檢測的方式,用來判斷是否進入BootLoader狀態。
   ① 針對上麵第一項中的問題,修改爲識別特定字符串纔可以進入BootLoader的升級狀態。特定字符串的內容和長度可以由用戶自己定義(長度不能超過12字節。在一般情況下,12字節的識別字符串應當足夠長了)。可以使用任何數據(包括0)。
   ② 增加了特定引腳電平判斷方式,在BootLoader程序運行後,判斷某個特定的引腳上的電壓是否是預定的電壓,由此決定是否需要進入BootLoader升級狀態。引腳和預定電壓(高/低)可以自由設置。這種方式比較安全,但是不太適合於遠程升級。
   ③ 增加了看門狗選項,可以設置使用/不使用看門狗。一般設置看門狗的溢出時間在0.5~2s比較合適。
   ④ 增加了編程響應。在每成功接收到一行HEX數據後,發出一個迴應字節,用於編程時的錯誤檢測。PC端的下載程序可以根據這個字節來判斷下載過程中是否出錯。
   ⑤ 針對上麵3(1)中③的問題,可以這樣解決。將編譯後的HEX文件手工稍作修改,將0x200~0x220(假設用戶程序是從0x200開始的)地址段的數據從文件的開頭移動到文件的結尾。這樣0x200處的代碼會在最後才寫入單片機中。如果寫入過程中出現故障,複位後即使BootLoader啓動了用戶程序,也會因爲這段區域沒有代碼而重新複位,而不會去運行部分被寫入的用戶程序。不過這種方法需要對HEX文件的結構有一定的瞭解才行。一個簡單判斷HEX數據地址的方法是,HEX文件的每一行第一個字符是冒號“:”,冒號後的第3、4、5、6這四個數字就表示這一行數據的地址,是以十六進制表示的。如:“:100200...”就表示地址是0x200。在正常情況下,編譯後的HEX文件數據是地址從低到高的順序排列的。
  改進後的程序增加了一部分參數,它們是:
  BOOT_SIGNAL——使用單片機引腳電平觸發方式進入BootLoader;
  BOOT_SIGNAL_PORT——定義電平觸發啓動方式檢測用的引腳;
  BOOT_SIGNAL_LEVEL——定義檢測電平1=高電平觸發,0=低電平觸發;
  BOOT_TIME_DELAY——使用超時方式進入BootLoader,這個參數和上麵的BOOT_SIGNAL不能同時?使用;
  USE_EXTEND_HEX——是否接收擴展的HEX代碼,不使用可以節省代碼,建議不用;
  USEWDT——是否在BootLoader中使用看門狗,建議使用;
  CONFIRM_TIME——聯機同步字節數,在超時方式中使用多字節進行同步;
  CONFIRM_DATA——用戶可定義的聯機數據;
  USE_ECHOBACK——編程時是否迴應,使用可以增加下載時的安全性,建議使用。
  使用了BOOT_SIGNAL方式後,與超時方式相關的部分都不再起作用。這時可以定義使用任意引腳來判定是否需要進入BootLoader。在使用BOOT_TIME_DELAY(超時方式)時,增加了一些與之相關的內容,如CONFIRM_DATA,可以使用任何特定的字符串來確認是否需要進入BootLoader狀態,增加了BootLoader程序的安全性,避免受到干擾而誤進入程序升級狀態。


  (3) 其他改進的建議和方法
   ① HI-TECH的BootLoader程序接收的是標準的HEX文件。這在很多時候是不夠安全的,不利於程序的加密,容易被反彙編和破解。可以對HEX進行加密處理,變成不能直接查看的數據。
   ② 使用超級終端進行程序下載速度比較慢,同時,如果下載中出現錯誤,超級終端程序不能及時發現停止下來,而是一直把文件發送完才能停下來。這時BootLoader程序會反複進入BootLoader狀態,對單片機有一定的損傷。最好是自行編寫一個計算機端的專用下載程序,不但可以提高下載的速度,也可以提高下載的成功率。
   ③ 使用RS422/485方式。有些時候,使用的並不是RS232串口,而是RS422/RS485串口。它們實際是類似的,只是在接口方式上有些區別。RS422/RS485需要控制發送,所以在BootLoader程序中增加一個發送控制就可以了。
   ④ 在BootLoader中,將波特率設置得很高並沒有太大的用處,它並不能夠提高下載整體的速度,而只能加快數據傳輸的速度。因爲整個下載分爲數據通信(數據傳輸)和Flash寫入/擦除(數據等待)兩個部分。程序代碼Flash空間的擦除和寫入速度是比較慢的(典型值是3~?4 ms),太快了反而容易丟失數據,造成下載失敗。使用9600 bps的波特率時,傳輸1字節的數據大約是1 ms,接收一個緩衝區8字節大約需要8 ms,大於寫入延時,所以不需要延時;當通信速率超過9600 bps時,接收8字節緩衝區的時間可能會小於寫入時間,需要在通信中延時。實際使用的測試結果是:使用9600 bps比使用14 400 bps時慢50%,使用57 600 bps比9600 bps快一倍,而使用115 200 bps時與57 600 bps幾乎沒有任何區別。如果使用超級終端下載,就更沒有必要設置高波特率了。因爲在使用最常用的三線方式通信時(沒有控制信號),超級終端採用了比較保守的方式發送數據,本身就比較慢。
 
結語
  一個良好的BootLoader程序應該具有良好的可維護性並可以正確處理異常情況,不會因爲意外情況引起系統的損壞和崩潰。
  可以在http://shaoziyang.logchina.com/blog/article_156363.936124.html處下載改進後的BootLoader程序(這個程序已經在實際工程中使用了較長時間,很穩定),以及一個替換超級終端的PIC18專用下載程序(這個程序的下載速度比超級終端快很多,可以自行定義波特率和聯機的字符串,具有BootLoader區代碼保護功能和下載錯誤檢測功能)。


  (編者注:本文爲期刊縮寫版,全文請見本刊網站www.dpj.com.cn。)


                 參考文獻


1 Microchip.PIC18F1220/1320/2320/6620/6621數據手冊
2 Microchip應用說明AN851:A Flash Bootloader for PIC16 and PIC18 Devices
3 HI-TECH的PICC18(ver8.35pl2)軟件的BootLoader程序代碼和程序說明
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章