Xmodem Bootloader

         瞭解更多關於bootloader 的C語言實現,請加我QQ: 1273623966 (驗證信息請填 bootloader),歡迎諮詢或定製bootloader(在線升級程序)。

  多年前玩Cisco交換機時,更新交換機操作系統就是使用超級終端的XMODEM傳送功能發送BIN文件到交換機。當時感覺使用XMODEM發送BIN文件更新系統,簡單可靠又實用,雖然沒有TFTP速度快,但TFTP需要設置IP,子網掩碼,需組網,甚至需關閉防火牆。XMODEM簡單方便不少,只需接上PC的串口就可以。一直想給我的單片機學習板寫個XMODEM BOOTLOADER程序,然後也像Cisco交換機那樣通過XMODEM發送BIN文件來升級應用程序。直到半個月前纔開始動手,最近才完成。我發現XMODEM BOOTLOADER實現簡單,非常適合給單片機這種存儲空間有限的系統在線升級。雖然XMODEM不快,但由於單片機系統的BIN文件也不太大,所以速度也不是問題。在介紹我的XMODEM BOOTLOADER前先簡單介紹下XMODEM協議。

  XMODEM協議

  XMODEM協議是一種串口通信中廣泛用到的異步文件傳輸協議。XMODEM傳輸是由XMODEM接收方發起的,通過發送NAK 信號或‘C’ (這裏NAK不是報錯,我叫它發起幀)來發起XMODEM傳輸(注意,NAK或‘C’決定之後XMODEM發送方是採用垂直累加和校驗checksum,還是採用CRC-16校驗)。發送方收到後,開始發送數據幀和其他控制幀。發送數據幀時,XMODEM文件發送方將文件分解成128字節的定長數據塊,每發送一個數據塊,等待對方應答後(ACK信號)才發送下一個數據塊,數據校驗採用垂直累加和校驗(checksum),也可以採用CRC-16校驗。屬於簡單ARQ(自動請求重發)協議,所以也適合於2線制的半雙工的RS485網絡中使用。

  XMODEM發送的每個幀都有控制字符,並且只有以SOH開頭的幀後面有數據,可以稱爲數據幀,其他幀都是單字符幀,每個幀都只有一個除SOH外的控制字符,包括應答幀(ACK),報錯幀(NAK),結束幀(EOT),以及取消幀(CAN)。控制字符符合 ASICII 標準定義,長度均爲 1 字節

  SOH 0x01

  EOT 0x04

  ACK 0x06

  NAK 0x15

  CAN 0x18

   這裏介紹標準XMODEM數據幀的格式(數據校驗爲checksum校驗): 

      | SOH | 信息包序號 | 信息包序號的反碼 | 數據區段 | 算術校驗和 |

      |_____|________ |______________|________|__________|

     說明:

  SOH: 幀的開頭字節,代表數據幀中的第一個字節                                                                                                                                           

     信息包序號: 對 256 取模所得到當前包號,第一個信息包的序號爲 1,而信息包序號範圍0~255。

     信息包序號的反碼: 當前信息包號的發碼

     數據區段: 數據區段的長度固定爲 128 字節,其內容沒有任何限制,可以是文本數據或二進制數據。如果最後一幀數據不滿128字節,則使用0x1A填充剩餘的空間                   

     算術校驗和: 1字節的算術校驗和,只對數據區段計算後對 256 取模而得。

  XMODEM BOOTLOADER

  我的XMODEM BOOTLOADER是用C語言寫給我的PIC學習板用的,上電後,XMODEM BOOTLOADER首先傳送發起幀(NAK信號)給PC端超級終端,如果10秒後對方還沒有發送第一個數據幀,則重複發送“NAK”,這種重複次數最多允許10次,仍然沒有收到第一個數據幀,則退出本次通信,直接跳轉到應用程序。如果收到數據塊,則確認數據塊序號及其反碼,接收數據,確認校驗和,如果有問題就返回報錯幀,都沒問題就燒寫數據到對應的地址上,再返回應答幀(ACK)。接着接收下一個數據塊,直到接收到結束幀,最後返回應答幀後,跳轉到新的應用程序中去。之間如果收到取消幀,也會發送應答幀,然後退出本次通信。

     XMODEM BOOTLOADER接收到的數據都是BIN數據,但是PIC 編譯完成後生成的是Hex文件,所以我用C#寫了個程序運行在PC上,將Hex文件轉換成BIN文件。界面如下:

  XMODEM SEND

      XMODEM SEND 發送BIN文件,我用的是超級終端。其實我之前寫過也用超級終端傳送數據來升級程序的PIC bootloader, 有四款分別是寫給PIC16F, PIC18F, dsPIC33, PIC32MZ的。但是那是用的SEND ASCII的方式,沒有任何協議,沒有應答機制,所以顯的不是很可靠,但用來學習還是很不錯的。下面是這四款PIC bootloader的鏈接。

PIC16F:http://www.cnblogs.com/geekygeek/p/hyperbootloader_pic16.html                                                                                                                

PIC18F:http://www.cnblogs.com/geekygeek/p/hyperbootloader_pic18.html                                                                                                          

dsPIC33:http://www.cnblogs.com/geekygeek/p/hyperbootloader_dspic.html 

PIC32MZ:http://www.cnblogs.com/geekygeek/p/hyperbootloader_pic32.html

  現在我將這四款PIC bootloader都改良爲XMODEM bootloader,升級PIC target時使用超級終端的XMODEM SEND傳送BIN文件。首先在超級終端“發送”菜單欄裏選擇“發送文件”,然後選擇BIN文件,選擇Xmodem協議。最後點擊發送。重啓帶有XMODEM bootloader的單片機系統,XMODEM bootloader就會發起傳輸,然後超級終端開始傳送數據,很快就完成在線升級程序,就像復現了當初升級Cisco交換機時的場景。我試了用SecureCRT的XMDOEM SEND發送BIN文件,同樣可以和我的XMODEM BOOTLOADER協同工作,完成PIC單片機系統在線升級。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章