Bootloader設計 YModem協議

2021-07-14 20:36:57 字數 2836 閱讀 8960

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

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

首先奉上乙個精簡的bootloader工程。

支援協議:ymodem, ymodem-g。

所支援的pc軟體:超級終端,securecrt。

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協議的基本操作流程。

筆者一開始軟體的基本思想,串列埠接收資料,和寫資料到rom中,兩者可以同步進行。這樣可以讓cpu得到最大程度的有效利用。

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

也是就是,在接收的這90ms左右的時間裡,在接收下一幀結束這一期間內,可以把上一幀的資料寫入到rom中。 串列埠接收資料是中斷的方式,所以收寫操作基本上算同步執行。程式流程如下

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

準備工作:

硬體:有串列埠目標板1,串列埠連線線。

軟體:pc工具:超級終端 或securecrt,stm32目標板程式.bin,stm32 bootloader。

2)         開啟超級終端 或securecrt,設定波特特115200,停止位1,資料位8,效驗無。

3)         先按下『c』再給目標板上電;(注意先後順序)

4)         選擇1,然後使用ymodem, ymodem-g協議傳送"stm32目標板程式.bin"檔案。

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

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

stm32 bootloader修改:

找到工程下的common.h檔案:

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

#define stm32f10x_hd                         //目標板晶元型別

stm32目標板程式.bin偏移位址修改:

有兩個地方:

1找到system_stm32f10x.c

bootloader架構設計

2440 arm 處理器啟動流程 從nand flash 方式啟動,處理器將前端的4k的內容複製到sram stepping stone 裡,大於4k的內容複製到記憶體中。bootloader被分成兩部分 bl1 核心初始化設定異常向量表 設定處理器為svc模式 關閉看門狗 關閉所有中斷 關閉mmu...

嵌入式入門 BootLoader設計 2

boot loader 的啟動過程分為單階段 single stage 和多階段 multi stage 兩種,其中,多階段的 boot loader能提供更為複雜的功能,以及具有更好的可移植性。boot loader的生命週期如下 初始化硬體,如設定uart 至少設定乙個 檢測儲存器等 設定啟動引...

bootloader如何固化?

關於bootloader,先簡要地總結一下。經過了第乙個階段的學習,對bootloader有了乙個整體的認識,其實把它當作乙個功能單元就可以了,職責就是完成從硬體加電到作業系統核心執行之前的所有工作,這些工作包括硬體檢測 硬體初始化 載入kernel。這些工作怎麼完成呢?按照功能分為兩個部分比較合適...