相信很多人都希望,不開蓋就可以對韌體進行公升級吧,就像手機那些。下文中的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。這些工作怎麼完成呢?按照功能分為兩個部分比較合適...