STM32F10X系列通用OTA bootloader移植與使用指南

基於STM32F10X系列通用OTA bootloader原理、移植與使用全指南

寫在前面

從2020.1.26到2020.1.30這5天,我的較多研究精力放在AVR和STM32的bootloader機制,做了一些閱讀、實驗、編寫和移植的工作,最後纔有了這篇文章,算是一個階段成果彙報。
這裏先簡單總結磨嘰一小下,接下來的小節我會儘可能詳細的記錄和講解這幾天的開發與研究過程。

這幾天我都做了什麼呢?

1.翻閱了一些AVR和STM32關於ROM存儲、劃分與燒寫;向量表;應用跳轉資料。
2.瞭解常用文件傳輸協議,並深入研究一種(我深入研究的Xmodem協議):
(1)查閱文獻並解決一些疑惑和問題,查看Xmodem規範
(2)閱讀基於AVR的Xmodem協議IAP更新bootloader源碼
(3)閱讀並完善Xmoden協議的java實現源碼
(4)基於Windows超級終端與sscom/超級終端進行協議驗證實驗
3.做了一些OTA升級的上位機工作:
(1)使用WCH提供的CH34X android驅動庫開發基於OTG的android下CH340T的驅動與串口通信demo
(2)將Xmodem協議移植到andrioid平臺,加以封裝並完善了bug。
(3)Windows與android利用串口基於Xmodem傳輸文件驗證實驗。
4.瞭解並使用相關工具:
超級終端、HEX22BIN轉換工具、ICCAVR7.22和KEIL5等。
5.閱讀了幾個前人所寫的優秀代碼:
AVR@Xmodem、STM32@Ymodem等。
6.有了上述準備工作,最後着手製作基於STM32F10X系列通用OTA bootloader。

有什麼感受?

一.bootloader本身並不難,難的是牽扯的東西很多。
協議,單片機,相關軟件這些都得了解差不多才行。具體什麼是差不多我也說不太精確,但我的感受是:
1.閱讀代碼時能主動提出幾個問題並通過各種方式解決疑惑。
2.親手至少做過一個驗證實驗。
3.能發現網上的不同文章間的區別,重點;能夠看懂他們;甚至能夠找出其中寫的錯誤

二.網上的錯誤有時候很多
網上的錯誤有時候很多呦,而且大家一抄一,都採用的代碼也可能有bug,我就碰到很多次了這種問題。
還有一些代碼被做了一點改動,代碼本身就有問題,改正了就能運行了,也不知道是故意的還是怎樣,咱們不要往壞方向揣摩別人,自己做到合理採用網上的代碼,保留一些質疑和驗證的空間就好。(等哪天寫一個勘誤集錦?哈哈哈)
三.研究和開發要順應潮流和時代
AVR可以說是最早可以自編bootloader的單片機了,但現在隨着市場和應用的要求,它的使用越來越少了,這導致講解資料和代碼實例在網上的流失,有很多工具和軟件已經不能在新版本windwos上運行,能提供的功能也相對較少,這就給研究造成了一定的困難。
本開始想最先自編AVRbootloader的,後來轉爲先實現STM32的bootlader。

開始移植

移植的配置大多是都是在“Options for Target ‘Template’”選項,也就是頂部欄中魔術棒 的圖標,主要分爲兩大步
第一大步:根據你的單片機型號修改相關容量宏與啓動文件
(1)在第一欄“Device”當中
在這裏插入圖片描述
(2)設置ROM容量宏
在第六欄“C/C++”當中
在這裏插入圖片描述
可以這麼認爲:
flash容量<=32k 改爲 STM32F10X_LD
64k<= <=128k 改爲STM32F10X_MD
256<= <=512k 改爲STM32F10X_HD
ROM容量怎麼看(服務到家):
在這裏插入圖片描述
6:32K 8:64K
B:128K C:256K
D:384K E:512K

(3)選擇合適的啓動文件
在CORE當中按上面的ROM容量選擇正確的
在這裏插入圖片描述

第二大步:爲bootloader和app劃分各自的ROM地址
(1)在第二欄“Target”當中
在這裏插入圖片描述
先解釋名詞:
IROM:internal rom 內部ROM,指的是集成到SoC內部的ROM
IRAM:internal ram 內部RAM,指的是集成到SoC內部的RAM
start就是ROM開始的地址,這裏就是默認的0x08000000
(PS:0x8000000和0x08000000是一個東西,前面的零沒用的,但數字後面的零有用呀!)
size就是你要給bootloader留多大的空間,這裏是0x2500,也就是10240字節,10kb
size大小怎麼取:
編譯一下程序,在Build Output欄中有這樣的行
在這裏插入圖片描述
Code爲程序代碼部分
RO-data 表示 程序定義的常量 const temp;
RW-data 表示 已初始化的全局變量
ZI-data 表示 未初始化的全局變量
Total RO Size (Code + RO Data)
Total RW Size (RW Data + ZI Data)
Total ROM Size (Code + RO Data + RW Data)
也就是說,將前三項加起來就是bootloader佔用的rom大小,只要size比這個大就行了
(PS:一般size取整,我這裏是10kb,遠遠夠用了,也留了足夠空間給app)

(2)在倒數第三欄“Linker”中選擇

勾選Use Memory Layout from Target Dialog選項(選中這一項實際上是默認在Target中對Flash和RAM的地址配置)
在這裏插入圖片描述

(3)在倒數二欄“Debug”當中
在這裏插入圖片描述
Download Function 要按照我這個選
Start和size要按之前的start和size填寫好

(PS:有人問這個RAM for Algorithm是什麼:
RAM for Algorithm是用來在IRAM1區域劃分一段空間,用來運行flash下載算法(可理解爲一個程序),從而給MCU下載代碼。但是這個空間只在下載代碼的時候有用,下載完了代碼以後,這段空間就可以被你的APP代碼(你下載的代碼)佔用的,相當於釋放了。這個保持默認就可以了)

(4)在common.h中填寫正確的app啓動地址(就是你的start+size)
在這裏插入圖片描述
這裏操作完移植工作就基本結束啦,趕緊燒寫一下看看bootloader能不能用吧:
bootloader使用串口1(PA9 TX ; PA10 RX)
波特率:115200 N 8 1
燒寫協議:ymodem

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