一、综述
一款完善的工业产品往往需要支持在线更新程序的需求,业界最近火热的叫法叫做“OTA”。这篇文章记录我利用技术社区提供GD32F427芯片开发板完成的BootLoader移植过程,这套程序使用了z-moder传输协议和shell命令行模式,有较高的可靠性和友善的交互模式。如果想深入了解BootLoader技术原理,可以学习韦东山老师的免费视频:https://www.100ask.net/p/t_pc...
二、架构
三、分支
1、BootLoader
在现在的单片机程序中实现BootLoader有多种方法,韦东山老师提供的这套方案借鉴了linux的设计思想,功能强大,扩展性很强,同时代码逻辑清晰,对于初学者可以学习到代码的构件技巧;对于高手则可以“拿来即用”。
BootLoader程序人机交互移植了RT-Thread的shell库,这样用户操作起来会有在使用linux界面的错觉。同时也非常方便BootLoader的功能扩展,比如我要完成多个app的升级维护的相互之间的跳转,那么可以直接在添加shell命令里面添加新的指令,并完成对应的操作逻辑编码。
BootLoader程序下载是通过z-moder协议完成,z-moder协议在工业场合已经广泛应用,有久经考验的稳定性。
BootLoader核心是要在当前运行代码中,完成代码跳转去执行另外一个程序。就需要涉及到“中断向量重定位”,M4中有一个寄存机可以完成“中断向量重定位”:在启动文件中加入执行跳转的汇编代码:
start_app PROC
EXPORT start_app
; set vector base address as 0x08040040
ldr r3, =0xE000ED08;SCB->VTOR
str r0, [r3]
ldr sp, [r0] ; read val from new vector
ldr r1, [r0, #4] ; read val from "new vector + 4“
BX r1
ENDP
cortex M3/4权威指南中有相关介绍:
有了这段代码后,当在指定地址(0x8040040)烧录了app后,即可跳转过去执行新的app。
BootLoader需要把下载到ram的程序固化到flash,GD32F427的内存还是超级大!但是需要注意,只有前面1024KB支持零等待运行。一定要把执行程序放到前面的1024去运行,或者可以放到ram运行,每次启动从flash搬出来。
另外这次测试中发现flash是需要擦除后再烧录,具体原因有点类似于“拨算盘”,每次使用算盘前,要把算盘复位,然后计算完成后,如果不动算盘,它就一直保持你拨动后的结果(拿算盘举例子,是不是暴露年龄O(∩_∩)O哈哈~~~老猿一枚)。
其他内容不过多介绍,请参考源码:
链接:https://pan.baidu.com/s/1bc7O...
提取码:1234
2、APP
由于BootLoader需要跳转,app的运行起始地址不是0x8000000,需要根据实际情况来设置运行地址,例如:0x08040040
这样,在BootLoader中也设置同样的地址,或者通过shell命令把加载地址传入BootLoader(当前demo使用的固定加载地址)。
APP还需要做一件事儿是给bin烧录文件添加“头部”(协议帧头),采用了linux中mkimage程序和协议,可以指定app的名称、大小、加载地址、链接地址等信息。下图中我只需要填写下载地址为0x20000000其他信息固化到了BootLoader,并没有使用。
文件的上传需要使用支持z-moder协议的通讯工具,我使用的是MobaXterm。
3、视频演示:
https://www.bilibili.com/vide...
四、总结
感谢极术社区提供的开发板,让我有机会接触更多地国产芯片资源,随着国际风云的不断变化,国产芯片的重要性和竞争能力越来越强,祝愿极术社区越办越好,也祝愿所有的工程师在国产化替代上硕果累累!
Thinks!
end