【GD32F427开发板试用】工业级串口OTA实现----移植韦东山老师BootLoader项目

news/2024/11/13 3:07:56/

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:足球之路

一、综述

一款完善的工业产品往往需要支持在线更新程序的需求,业界最近火热的叫法叫做“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   PROCEXPORT  start_app; set vector base address as 0x08040040ldr r3, =0xE000ED08;SCB->VTORstr r0, [r3]ldr sp, [r0]      ; read val from new vectorldr r1, [r0, #4]  ; read val from "new vector + 4“BX r1ENDP

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/video/BV1Lg411E7Sz​www.bilibili.com/video/BV1Lg411E7Sz

四、总结

感谢极术社区提供的开发板,让我有机会接触更多地国产芯片资源,随着国际风云的不断变化,国产芯片的重要性和竞争能力越来越强,祝愿极术社区越办越好,也祝愿所有的工程师在国产化替代上硕果累累!
Thinks!
end


http://www.ppmy.cn/news/18409.html

相关文章

maven基础

一、Maven基础 为什么要学习Maven? Maven作为依赖管理工具,能够管理大规模的jarjarjar包,使用MavenMavenMaven后,依赖对应的JarJarJar包,能够自动下载、方便、快捷切规范。Maven作为构建管理工具,当我们使…

c++ - 第26节 - c++知识梳理

目录 1.STL知识梳理 2.c知识梳理 3.数据结构知识梳理 1.STL知识梳理 STL知识掌握: 底层实现角度:六大组件。 上层用的角度:容器、算法、迭代器。 底层实现角度: 注: 1.可以认为迭代器是容器和算法的粘合剂&#…

如何搭建VGG网络,实现Mnist数据集的图像分类

1 问题如何搭建VGG网络,实现Mnist数据集的图像分类?2 方法步骤:首先导包Import torchfrom torch import nnVGG11由8个卷积,三个全连接组成,注意池化只改变特征图大小,不改变通道数class MyNet(nn.Module): def __in…

QEMU之一调试uboot(vexpress-a9)

u-boot版本:u-boot-2017.05开发板:vexpress-a9(没办法,目前看到的都是这个开发板,想QEMU调试tiny210,一直没看到怎么修改qemu)编译u-boot:make ARCHarm CROSS_COMPILEarm-linux-gnueabi- vexpre…

深度学习入门基础CNN系列——批归一化(Batch Normalization)和丢弃法(dropout)

想要入门深度学习的小伙伴们,可以了解下本博主的其它基础内容: 🏠我的个人主页 🚀深度学习入门基础CNN系列——卷积计算 🌟深度学习入门基础CNN系列——填充(padding)与步幅(stride&…

【NI Multisim 14.0虚拟仪器设计——放置虚拟仪器仪表(频率计数器)】

目录 序言 🏮放置虚拟仪器仪表🏮 🧧频率计数器🧧 🥳🥳(1)“测量”选项组:参数测量区。 🥳🥳(2)“耦合”选项组:用于选择电流耦合方…

十六进制转八进制(蓝桥杯基础练习C/C++)

我首先想到的就是十六进制转十进制&#xff0c;十进制转八进制&#xff0c;毕竟这样的方法是最常见的&#xff0c;但始终出现报错。 我想可能是int能储存的数范围太小了&#xff0c;就尝试用long long存储&#xff0c;结果还是报错。 #include <bits/stdc.h> using nam…

[ESP][驱动]GT911 ESP系列驱动

GT911ForESP GT911在ESP系列上的驱动&#xff0c;基于IDF5.0&#xff0c;ESP32S3编写 本库使用面向对象思想编写&#xff0c;可创建多设备多实例 Github&#xff0c;Gitee同步更新&#xff0c;Gitee仅作为下载仓库&#xff0c;提交Issue和Pull request请到Github Github: h…