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填写好

扫描二维码关注公众号,回复: 9188621 查看本文章

(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

发布了17 篇原创文章 · 获赞 24 · 访问量 5473

猜你喜欢

转载自blog.csdn.net/whstudio123/article/details/104123372