gd32f103vbt6 串口OTA升级-问题记录-2-平衡OTA弊端

news2025/1/11 7:03:58

走在路上的时候,我想起了这个OTA的弊端,那我想有没有办法解决呢?其实是有的。

那就是我还是把app程序放在flash的最开始的位置,而把OTA的程序放到后面(flash的最后12k)去。

这样也带来新的弊端:

1.是要小规模的修改单片机的应用程序,在串口增加一条命令,进入到下载模式。

2.如果升级失败,单片机将不能启动了,需要调试器的协助。这里倒是可以通过另外的方法解决。比如更新到备份区,升级的时候进行验证等。升级的时候断电就会比较致命。

3.OTA程序烧写不方便!!!好在这个程序基本不需要多次烧写,只要第一次烧写就好了。

这可能就需要大家权衡一下利弊了,一般来说,升级的时候是肯定不允许断电的。

 

本节的调整主要是方便应用程序的调试,和使用keil直接下载。同时也还是有串口升级的功能。

可能还是不太完善,后续再继续更新。

一、单片机程序的修改

1.1 调试串口增加一条指令,我增加的是 y

1.2  对于y指令的跳转

 1.3 goto_ota_program函数的实现

 1.4 设置修改回去

 1.5 main函数中设置中断向量偏移注释掉。

二、OTA程序的修改

1. irom的位置的修改

这里其实是链接地址,就是程序的实际运行的地址。见下图吧。

2. 中断向量设置

3. OTA软件的策略也要换了

3.1 软件执行时,直接停在升级的程序部分

3.2 还有一些不需要使用设备需要关闭。

跳转后,出现单片机死机的问题,这里猜测gd32单片机触发了一些不必要的中断,所以要关闭不使用的设备。

4. 应用的地址也要设置一下,原来是0x800,3000,改为0x8000000

这个地址是OTA升级应用的地址,需要注意的。

5. ota程序生成bin文件的话,需要设置软件。

user选项卡

 fromelf --bin -o ./output/@L.bin ./Objects/@L.axf

4. 烧写ota到单片机中的方法。

4.1 可以用ota(flash前端)升级ota(后端)的方法。

这个方法理论是可以的,但是我没有尝试,后面我发现可以用调试器,就没再纠结了。

4.2 能否借助调试器呢?

似乎是不行的,还想着用烧写软件STM32 ST-LINK Utility

但是我发现bin文件是可以的,呵呵

4.3 改单片机应用程序,让其增加升级OTA的功能。

这里可能需要增加的代码多,我暂时就不修改了!

5. 出现的问题

5.1 ota程序卡死

当应用跳转到ota的时候,ota打印11个字符左右,单片机卡死

5.1.1 怀疑中断的问题

关闭所有外设和定时器,然后再跳转,故障依旧,现象相同

void gd32_disable_phy(void)
{
	SysTick->CTRL  = 0;  //关闭systick
	rcu_periph_clock_disable(RCU_GPIOA);
	rcu_periph_clock_disable(RCU_GPIOB);
	rcu_periph_clock_disable(RCU_GPIOC);
	rcu_periph_clock_disable(RCU_GPIOD);
	rcu_periph_clock_disable(RCU_GPIOE);
	rcu_periph_clock_disable(RCU_GPIOF);
	rcu_periph_clock_disable(RCU_GPIOG);
	rcu_periph_clock_disable(RCU_USART0);
	rcu_periph_clock_disable(RCU_USART1);
	
	rcu_periph_clock_disable(RCU_TIMER1);
	rcu_periph_clock_disable(RCU_TIMER0);
	rcu_periph_clock_disable(RCU_TIMER2);
	rcu_periph_clock_disable(RCU_TIMER3);
	rcu_periph_clock_disable(RCU_TIMER4);
	rcu_periph_clock_disable(RCU_TIMER5);
	rcu_periph_clock_disable(RCU_TIMER6);
	rcu_periph_clock_disable(RCU_TIMER7);

}

5.1.2  加上   __disable_irq(); // 关闭总中断    就可以了

跳转之前关闭了所有的中断。(下图是单片机的应用程序!!!)

 但是有一个问题,就是OTA下的systick也没有中断了。这个中断只是影响我led灯的闪烁,其他没有影响。

5.1.3 我又试了一下,我能关闭的所有中断,似乎只有关闭总中断才可以,难不成出了系统异常?

void gd32_disable_phy(void)
{
//	SysTick->CTRL  = 0;  //关闭systick
//	rcu_periph_clock_disable(RCU_GPIOA);
//	rcu_periph_clock_disable(RCU_GPIOB);
//	rcu_periph_clock_disable(RCU_GPIOC);
//	rcu_periph_clock_disable(RCU_GPIOD);
//	rcu_periph_clock_disable(RCU_GPIOE);
//	rcu_periph_clock_disable(RCU_GPIOF);
//	rcu_periph_clock_disable(RCU_GPIOG);
//	rcu_periph_clock_disable(RCU_USART0);
//	rcu_periph_clock_disable(RCU_USART1);
//	
//	rcu_periph_clock_disable(RCU_TIMER1);
//	rcu_periph_clock_disable(RCU_TIMER0);
//	rcu_periph_clock_disable(RCU_TIMER2);
//	rcu_periph_clock_disable(RCU_TIMER3);
//	rcu_periph_clock_disable(RCU_TIMER4);
//	rcu_periph_clock_disable(RCU_TIMER5);
//	rcu_periph_clock_disable(RCU_TIMER6);
//	rcu_periph_clock_disable(RCU_TIMER7);

//	
//	fwdgt_write_disable();
//	nvic_irq_disable(USART0_IRQn);
//	nvic_irq_disable(USART1_IRQn);
//	nvic_irq_disable(TAMPER_IRQn);
//	nvic_irq_disable(FMC_IRQn);
//	nvic_irq_disable(EXTI0_IRQn);
//	nvic_irq_disable(EXTI1_IRQn);
//	nvic_irq_disable(EXTI2_IRQn);
//	nvic_irq_disable(EXTI3_IRQn);
//	nvic_irq_disable(EXTI4_IRQn);
//	nvic_irq_disable(EXTI5_9_IRQn);
//	nvic_irq_disable(EXTI10_15_IRQn);
//	nvic_irq_disable(TIMER1_IRQn);
//	nvic_irq_disable(TIMER2_IRQn);
//	nvic_irq_disable(TIMER3_IRQn);
//	nvic_irq_disable(TIMER4_IRQn);
	__disable_irq(); // 关闭总中断
	//__set_BASEPRI(WWDGT_IRQn);
}

因为我的单片机跑了freertos,这个问题估计还要研究一下才能清晰。

5.1.4 我升级了一下,提示成功了,但是无法继续执行新的单片机应用程序。

我想应该是关闭了中断的原因。我的应用程序需要中断才能继续。建议是升级后直接重启了。 

启动程序 改为   NVIC_SystemReset(); 重启单片机就行。

三、总结一下:

3.1  第一版的功能优点:

3.1.1 升级时断电,重启还是可以使用串口继续升级

3.2  第一版的缺点:

3.2.1 不方便使用keil直接下载应用程序,就要用串口,或者下载软件

3.2.2 不方便keil调试应用程序,不方便追踪问题

3.3 第二版的改进:

3.3.1  修正了第一版的研发不便。

3.4 又引进了新的问题:

3.4.1 升级的时候风险增加,比如升级过程中断电,或者被中断,都会导致单片机无法再启动了。

3.4.2  应用程序做了小部分修改。并且禁止了全部的中断。

似乎没有十全十美的办法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PMP考试技巧PMP考试大纲

一,PMP解题策略 PMP考试默认条件 精准审题 E(Eye):找到题眼; K(Key):找到考点; C(Choice):确定 选项; 情景结合 基本知识从PMI的角度出发,按PMI的思维方式,项目经理应该做出什么决定; 选…

SpringBoot自定义全局异常处理

自定义全局异常处理一. 创建所需类1. 自定义异常接口2. 自定义枚举类3. 自定义异常类4. 自定义异常处理类5. 自定义全局响应类5.1 BaseResponse类5.2 RespGenerator类二. 效果演示我们在 SpringBoot 项目中,往往会写许多 Controler 接口类,由于 Controll…

SNV的使用

一:什么是SVN? SVN是一个版本控制系统,SVN全称Subversion,用于记录一个或多个文件内容变化,方便我们查阅特定版本的修改情况。以前在没有版本控制的时候,我们通常在项目根目录下这样命名项目:p…

Python 环境搭建配置

Python可应用于多平台包括 Linux 和 Mac OS X。你可以通过终端窗口输入 "python" 命令来查看本地是否已经安装Python以及Python的安装版本。Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。)Win 9x/NT/2000Macintosh (Intel, PPC, 68K)OS/2DOS (多个…

微信小程序 Springboot校园达达互助平台快递代取系统 java

本 录 摘 要 III Abstract 1 1 系统概述 1 1.1 概述 2 1.2课题意义 3 1.3 主要内容 4 2 系统开发环境 5 2.1微信开发者工具 6 2.2小程序框架以及目录结构介绍 6 2.3 JAVA简介 7 2.4 MySQL数据库 7 3 需求分析 8 3.1 系统设计目标 8 3…

STM32开发(1)----stm32f103c6t6开发板介绍和环境搭建

stm32f103c6t6开发板介绍一、stm32f103c6t6芯片资源介绍STM32 的命名规则二、最小系统开发板介绍三、开发板基本使用方法软件安装MDK5 安装安装STM32芯片包安装licenseUSB转串口驱动安装四、本文小结一、stm32f103c6t6芯片资源介绍 stm32f103c6t6 是一款基于 ARM Cortex M3 内…

测试岗外包4年终上岸,这段日子说起来都是泪啊

昨天一个老哥找到我倾诉,他干了好几年外包,现在通过自己的努力应聘上了阿里测试开发,虽然只是P6,但也属实不容易了。这位老哥是湖南长沙毕业的,计算机专业,二流本科。长沙,湖南省会,…

Python图像合成与视频倒放

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、视频抓帧二、图像转换1,图像翻转2,图像文件倒序三、倒序视频合成四、图像截取拓展任务——动态图合成与倒放1,gif动态图生…

面了个阿里拿28k跳槽出来的,真正见识到了跳槽天花板

2022年已经结束了,迎来的是2023崭新的一年,最近内卷严重,各种跳槽裁员,相信很多小伙伴也在准备金三银四的面试计划。 作为一个入职5年的老人家,目前工资比较乐观,但是我还是会选择跳槽,因为感觉…

MySQL表中的联合查询

上一篇有关聚合查询的博客:MySQL表中的聚合查询_徐憨憨!的博客-CSDN博客主要是针对单个表进行查询操作,但是实际的开发环境中,数据往往来自己于不同的数据表,此时就需要使用联合查询进行操作!联合查询多表查询的基本执行过程:进行笛卡尔积然后设置条件删除无效数据进…

Echarts环形图线性渐变,hover后显示阴影

第004个点击查看专栏目录Echarts的渐变在上一篇文章中已经讲过 ECharts线性渐变色示例演示(2种渐变方式),这里做了环形图,饼图的一个渐变示例演示,hover到元素后,会呈现出一个阴影。注意,颜色属…

年度总结 | 积跬步以至千里,2023一起筑梦新征程

2022年,是值得载入史册的一年。疫情开放,健康码隐入历史尘埃。国际形势紧张,信创化进入快车道。企业加速转型,跨界技术融合的运维新生态已初露苗头。回顾2022,我们聚沙成塔逆寒流而勇进,精造创新以实践诠释…

【Linux】基础网络编程

计算机网络基本概念 在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。 计算机网络的分类与一般的事物分类方法一样,可以按事物所具有的不同性质特点分类。计算机网络通俗地讲就是由多台计算…

VMware双网卡配置(ubuntu)

桥接的时候不能上网,上网的时候又不能桥接和开发板通信,这是一个非常难受的事情,下面我来配置一下双网卡,一个用来桥接和单片机通信,一个用来上网。 ⚫ NAT 网卡:Ubuntu 通过它上网,只要 Windo…

【快速开始】vuejs环境搭建第一个项目

本篇包含vuejs环境安装以及通过vue客户端快速创建运行第一个项目。(注:以下内容均已windows平台为基准) 目录: 一、安装nodejs 二、配置国内源加速 三、安装vue客户端 四、创建第一个应用 1、安装nodejs: 1.1、下载 官网下载地址&…

【Java】java | smart-doc + tonar | API文档统一管理

一、说明 1、准备舍弃swagger了,拥抱smart-doc 2、win10 3、jdk8 4、idea 二、搭建torna 1)下载zip https://foruda.gitee.com/attach_file/1672544760054905357/torna-1.19.4.zip?token25e02a8e2817a757a0aa47172349cc20&ts1675345098&am…

06 Sentinel规则持久化(3)

Sentinel 持久化模式 Sentinel规则的推送有下面三种模式: 1、原始模式 如果不做任何修改,Dashboard 的推送规则方式是通过 API 将规则推送至客户端并直接更新到内存中: 这种做法的好处是简单,无依赖;坏处是应用重启规则就会消失…

智能网联汽车信息安全敲响「警钟」,如何筑牢防线?

2009年起,谷歌、百度等互联网科技公司就入局自动驾驶,旨在赋予汽车更智慧的大脑。 如今,物流、港口等场景下自动驾驶的商业化落地,众多的网联化接口不仅加强了智能网联汽车与操作环境之间的紧密关联,也促使智能网联汽…

Linux 学习笔记 文件、目录操作与用户群组权限

一、命令行提示符 1.1 命令行基础 bearpi:当前用户名,在前是用户名 ubuntu:用户所在的域名,在后面,这是我自定义的,默认应该是主机名 ~ 波浪线为目前所在目录,~代表家目录(home d…

【LMI传感器】LMI Gocator线激光传感器环境变量配置

文章目录1 打开系统环境配置界面2 环境变量配置1 打开系统环境配置界面 控制面板>系统和安全>系统>高级系统设置 系统属性>高级>环境变量 2 环境变量配置 环境变量配置 GENICAM_GENTL32_PATH E:\Program Files(x86)\GoCator\Release_5.3.22.22(SR1)\Integ…