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

2023-12-06 08:40

本文主要是介绍gd32f103vbt6 串口OTA升级-问题记录-2-平衡OTA弊端,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

走在路上的时候,我想起了这个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;  //关闭systickrcu_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  应用程序做了小部分修改。并且禁止了全部的中断。

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

这篇关于gd32f103vbt6 串口OTA升级-问题记录-2-平衡OTA弊端的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/461184

相关文章

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2