stm32 Bootloader设计(YModem协议)
相信很多人都希望,不開蓋就可以對固件進(jìn)行升級吧,就像手機(jī)那些。下文中的bootload就來實(shí)現(xiàn)這樣的功能。
???????? 前段時(shí)間有項(xiàng)目關(guān)于Bootload設(shè)計(jì)。所以就仔細(xì)的去了研究了一翻。以前都是用的stm32官方的,沒有去深入了解。這次做完了過后,發(fā)現(xiàn)官方的版本存在一些問題。比如說YModem傳送過程中,完全沒有對數(shù)據(jù)區(qū)進(jìn)行效驗(yàn),只是核對了下編號,就進(jìn)行燒寫。整個(gè)程序完全為阻塞式,浪費(fèi)了大量的cpu做無用功。當(dāng)然這在升級程序方面也用不了多少時(shí)間。有一個(gè)重要的問題,官方代碼只可以用超級終端進(jìn)行傳輸。這樣如果你用的是64位的win7,那就沒有辦法升級。因?yàn)橹挥衳p或32位的win7才可以使用 超級終端。64位的win7下超級終端沒辦法使用。 不過SecureCRT工具到是可以在64位win7使用,但是官方代碼不對其支持。SecureCRT下支持的是最原始的YModem協(xié)議,第一幀數(shù)據(jù)包中不包含總字節(jié)數(shù)。超級終端下的YModem應(yīng)該是改進(jìn)版的,所以官方的dome只可以在超級終端下傳輸。下面會對YModem進(jìn)行詳細(xì)說明。就會知道其中的原因。
???????? 首先奉上一個(gè)精簡的Bootloader工程。
?????????http://pan.baidu.com/share/link?shareid=373630&uk=118334538
???????? 支持協(xié)議:YModem, YModem-G。
???????? 所支持的PC軟件:超級終端,SecureCRT。
?????????http://pan.baidu.com/share/link?shareid=373637&uk=118334538
?
YModem協(xié)議:
???????? YModem協(xié)議是由XModem協(xié)議演變而來的,每包數(shù)據(jù)可以達(dá)到1024字節(jié),是一個(gè)非常高效的文件傳輸協(xié)議。下面有一些相關(guān)的文檔。這里要感謝關(guān)注我微博的一些朋友提供的資料。省去了不少時(shí)間。
???????? 下面先看下YModem協(xié)議傳輸?shù)耐暾奈帐诌^程:先看下圖
SENDER:發(fā)送方。
RECEIVER:接收方。
第一步先由接收方,發(fā)送一個(gè)字符'C'
發(fā)送方收到'C'后,發(fā)送第一幀數(shù)據(jù)包,內(nèi)容如下:
SOH 00 FF Foo.c NUL[123] CRC CRC
第1字節(jié)SOH:表示本包數(shù)據(jù)區(qū)大小有128字節(jié)。如果頭為STX表示本包數(shù)據(jù)區(qū)大小為1024
第2字節(jié)00: 編號,第一包為00,第二包為01,第三包為02依次累加。到FF后繼續(xù)從0循環(huán)遞增。
第3字節(jié)FF: 編號的反碼。 編號為00 對應(yīng)FF,為01對應(yīng)FE,以此類推。
?
第4字節(jié)到最后兩字節(jié):若第1字節(jié)為SOH時(shí)有128字節(jié),為STX時(shí)有1024字節(jié),這部分為數(shù)據(jù)區(qū)。“Foo.c” 文件名, 超級終端下,在文件名后還有文件大小。官方dome也是因?yàn)槭褂昧诉@個(gè)文件大小進(jìn)行比對。這就是為什么用SecureCRT中的YMODEM協(xié)議而無法正確傳輸?shù)脑颉?/p>
???????? 在文件名和文件大小之后,如果不滿128字節(jié),以0補(bǔ)滿。
最后兩字節(jié):這里需要注意,只有數(shù)據(jù)部分參與了效CRC驗(yàn),不包括頭和編碼部分。
16位CRC效驗(yàn),高字節(jié)在前,低字節(jié)在后。
?
接收方收到第一幀數(shù)據(jù)包后,發(fā)送ACK正確應(yīng)答。
然后再發(fā)送一個(gè)字符'C'。
發(fā)送方收到'C'后,開始發(fā)送第二幀,第二幀中的數(shù)據(jù)存放的是第一包數(shù)據(jù)。
接收方收到數(shù)據(jù)后,發(fā)送一個(gè)ACK然后等待下一包數(shù)據(jù)傳送完畢,繼續(xù)ACK應(yīng)答。直到所有數(shù)據(jù)傳輸完畢。
數(shù)據(jù)傳輸完畢后,發(fā)送方發(fā)EOT,第一次接收方以NAK應(yīng)答,進(jìn)行二次確認(rèn)。
發(fā)送方收到NAK后,重發(fā)EOT,接收方第二次收到結(jié)束符,就以ACK應(yīng)答。
最后接收方再發(fā)送一個(gè)'C',發(fā)送方在沒有第二個(gè)文件要傳輸?shù)那闆r下,
發(fā)送如下數(shù)據(jù)
SOH 00 FF 00~00(共128個(gè)) CRCH CRCL
接收方應(yīng)答ACK后,正式結(jié)束數(shù)據(jù)傳輸。
?
以上部分,為YMODEM協(xié)議的基本操作流程。
?
STM32 Bootloader軟件設(shè)計(jì)
???????? 筆者一開始軟件的基本思想,串口接收數(shù)據(jù),和寫數(shù)據(jù)到ROM中,兩者可以同步進(jìn)行。這樣可以讓cpu得到最大程度的有效利用。
???????? 比如說接收一幀1024的數(shù)據(jù),所用的時(shí)間= 當(dāng)前波特率單字符所用時(shí)間 * (1024 + 1頭 + 2編碼 + 2CRC)= (1/115200 * 10) * (1024 + 1 + 2 + 2) = 89.323ms
也是就是,在接收的這90ms左右的時(shí)間里,在接收下一幀結(jié)束這一期間內(nèi),可以把上一幀的數(shù)據(jù)寫入到ROM中。 串口接收數(shù)據(jù)是中斷的方式,所以收寫操作基本上算同步運(yùn)行。程序流程如下
????????
STM32 Bootloader使用方法:
???????? 這個(gè)STM32 Bootloader程序使用起來很簡單,如果你以前沒有用過IAP升級方式,也沒關(guān)系下面會詳細(xì)說明。
?
準(zhǔn)備工作:
???????? 硬件:有串口目標(biāo)板1,串口連接線。
???????? 軟件:PC工具:超級終端 或SecureCRT,stm32目標(biāo)板程序.bin,stm32 Bootloader。
?
1)???????? 先把上面的工程stm32 Bootloader下載到目標(biāo)板中;
2)???????? 打開超級終端 或SecureCRT,設(shè)置波特特115200,停止位1,數(shù)據(jù)位8,效驗(yàn)無。
3)???????? 先按下‘C’再給目標(biāo)板上電;(注意先后順序)
?
4)???????? 選擇1,然后使用YModem, YModem-G協(xié)議發(fā)送"stm32目標(biāo)板程序.bin"文件。
5)???????? 傳輸完畢后,會自動(dòng)運(yùn)行。
?
注意:以下兩處根據(jù)自己的需求調(diào)整
stm32 Bootloader修改:
找到工程下的common.h文件:
以下三個(gè)宏定義根據(jù)自己目標(biāo)板的需求來定:
#define ApplicationAddress????? 0x8002000?????? ?//程序首地址
#define ApplicationSize???????? 120000????????? ?//目標(biāo)程序預(yù)留空間
#define STM32F10X_HD??????????????????????? ?//目標(biāo)板芯片類型
?
stm32目標(biāo)板程序.bin偏移地址修改:
有兩個(gè)地方:
1找到system_stm32f10x.c
#define VECT_TAB_OFFSET? 0x2000 /*!< Vector Table base offset field.
?
總結(jié)
以上是生活随笔為你收集整理的stm32 Bootloader设计(YModem协议)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我想用keil5生成BIN文件,可是安装
- 下一篇: stm32f103c8t6芯片IAP升级