Ymode協議(STM32)

轉自:http://www.cnblogs.com/hiker-blogs/archive/2013/03/17/stm32.html

相信很多人都希望,不開蓋就可以對固件進行升級吧,就像手機那些。下文中的bootload就來實現這樣的功能。

         前段時間有項目關於Bootload設計。所以就仔細的去了研究了一翻。以前都是用的stm32官方的,沒有去深入瞭解。這次做完了過後,發現官方的版本存在一些問題。比如說YModem傳送過程中,完全沒有對數據區進行效驗,只是覈對了下編號,就進行燒寫。整個程序完全爲阻塞式,浪費了大量的cpu做無用功。當然這在升級程序方面也用不了多少時間。有一個重要的問題,官方代碼只可以用超級終端進行傳輸。這樣如果你用的是64位的win7,那就沒有辦法升級。因爲只有xp或32位的win7纔可以使用 超級終端。64位的win7下超級終端沒辦法使用。 不過SecureCRT工具到是可以在64位win7使用,但是官方代碼不對其支持。SecureCRT下支持的是最原始的YModem協議,第一幀數據包中不包含總字節數。超級終端下的YModem應該是改進版的,所以官方的dome只可以在超級終端下傳輸。下面會對YModem進行詳細說明。就會知道其中的原因。

         首先奉上一個精簡的Bootloader工程。

         http://pan.baidu.com/share/link?shareid=373630&uk=118334538

         支持協議:YModem, YModem-G。

         所支持的PC軟件:超級終端,SecureCRT。

         http://pan.baidu.com/share/link?shareid=373637&uk=118334538

 

YModem協議:

         YModem協議是由XModem協議演變而來的,每包數據可以達到1024字節,是一個非常高效的文件傳輸協議。下面有一些相關的文檔。這裏要感謝關注我微博的一些朋友提供的資料。省去了不少時間。

         下面先看下YModem協議傳輸的完整的握手過程:先看下圖

SENDER:發送方。

RECEIVER:接收方。

第一步先由接收方,發送一個字符'C'

發送方收到'C'後,發送第一幀數據包,內容如下:

SOH 00 FF Foo.c NUL[123] CRC CRC

第1字節SOH:表示本包數據區大小有128字節。如果頭爲STX表示本包數據區大小爲1024

第2字節00: 編號,第一包爲00,第二包爲01,第三包爲02依次累加。到FF後繼續從0循環遞增。

第3字節FF: 編號的反碼。 編號爲00 對應FF,爲01對應FE,以此類推。

 

第4字節到最後兩字節:若第1字節爲SOH時有128字節,爲STX時有1024字節,這部分爲數據區。“Foo.c” 文件名, 超級終端下,在文件名後還有文件大小。官方dome也是因爲使用了這個文件大小進行比對。這就是爲什麼用SecureCRT中的YMODEM協議而無法正確傳輸的原因。

         在文件名和文件大小之後,如果不滿128字節,以0補滿。

最後兩字節:這裏需要注意,只有數據部分參與了效CRC驗,不包括頭和編碼部分。

16位CRC效驗,高字節在前,低字節在後。

 

接收方收到第一幀數據包後,發送ACK正確應答。

然後再發送一個字符'C'。

發送方收到'C'後,開始發送第二幀,第二幀中的數據存放的是第一包數據。

接收方收到數據後,發送一個ACK然後等待下一包數據傳送完畢,繼續ACK應答。直到所有數據傳輸完畢。

數據傳輸完畢後,發送方發EOT,第一次接收方以NAK應答,進行二次確認。

發送方收到NAK後,重發EOT,接收方第二次收到結束符,就以ACK應答。

最後接收方再發送一個'C',發送方在沒有第二個文件要傳輸的情況下,

發送如下數據

SOH 00 FF 00~00(共128個) CRCH CRCL

接收方應答ACK後,正式結束數據傳輸。

 

以上部分,爲YMODEM協議的基本操作流程。

 

STM32 Bootloader軟件設計

         筆者一開始軟件的基本思想,串口接收數據,和寫數據到ROM中,兩者可以同步進行。這樣可以讓cpu得到最大程度的有效利用。

         比如說接收一幀1024的數據,所用的時間= 當前波特率單字符所用時間 * (1024 + 1頭 + 2編碼 + 2CRC)= (1/115200 * 10) * (1024 + 1 + 2 + 2) = 89.323ms

也是就是,在接收的這90ms左右的時間裏,在接收下一幀結束這一期間內,可以把上一幀的數據寫入到ROM中。 串口接收數據是中斷的方式,所以收寫操作基本上算同步運行。程序流程如下

        

STM32 Bootloader使用方法:

         這個STM32 Bootloader程序使用起來很簡單,如果你以前沒有用過IAP升級方式,也沒關係下面會詳細說明。

 

準備工作:

         硬件:有串口目標板1,串口連接線。

         軟件:PC工具:超級終端 或SecureCRT,stm32目標板程序.bin,stm32 Bootloader。

 

1)         先把上面的工程stm32 Bootloader下載到目標板中;

2)         打開超級終端 或SecureCRT,設置波特特115200,停止位1,數據位8,效驗無。

3)         先按下‘C’再給目標板上電;(注意先後順序)

 

4)         選擇1,然後使用YModem, YModem-G協議發送"stm32目標板程序.bin"文件。

5)         傳輸完畢後,會自動運行。

 

注意:以下兩處根據自己的需求調整

stm32 Bootloader修改:

找到工程下的common.h文件:

以下三個宏定義根據自己目標板的需求來定:

#define ApplicationAddress      0x8002000        //程序首地址

#define ApplicationSize         120000           //目標程序預留空間

#define STM32F10X_HD                         //目標板芯片類型

 

stm32目標板程序.bin偏移地址修改:

有兩個地方:

1找到system_stm32f10x.c

#define VECT_TAB_OFFSET  0x2000 /*!< Vector Table base offset field.

 

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