基于STM32G4的BOOT至APP跳转问题排查与实战指南

发布者:和谐共存最新更新时间:2024-05-07 来源: elecfans关键字:STM32G4  BOOT  APP 手机看文章 扫描二维码
随时随地手机看文章

在STM32应用中经常会需要基于用户程序的做代码更新、升级,即In Applicaton Programming,简称IAP。这个过程往往需要程序从不同执行区做跳转,最常见的自然是从启动区跳往应用程序区,即从BOOT区跳往APP区。这个跳转过程中,经常有人遇到跳转失败的问题。虽是个老话题,但关于这方面的问题咨询可谓经久不息。我这里以STM32G4系列芯片及开发板做下相关实验,分享些应用提醒,以供参考。


为了保证在跳转过程不出异常,主要注意两点:


第一点,即将跳转到程序区的内存地址、中断矢量表地址。在STM32库例程里,中断矢量表地址的修改一般采用基地址加偏移量的代码写法。

第二点,也是非常重要的一点。在做跳转前,做好准备工作。执行跳转前,当前程序区不能存在尚未处理的中断请求,要对开启过的中断使能全面地逐个清零关闭,切不可简单地只是调用一个所谓关总中断函数的做法,即调用  __disable_irq()函数。该函数只是临时关闭中断响应,不会阻止中断事件的发生及相应中断标志的生成。这个做法极不可取,隐患很多。

一般来讲,自己开启了哪些中断大致是清楚的。对于STM32用户来讲,如果基于CubeMx创建工程,SYSTICK定时器中断默认开启,担当Cube库函数的滴答时基,很多延时相关都使用到它。我们在做跳转前,记得将其计数器停掉或关闭它的中断请求能力。使用下面三句的任意一句都可以令其丧失中断请求能力【下面是基于STM32库函数的代码写法】:

SysTick->CTRL&=~SysTick_CTRL_TICKINT_Msk;

SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;

SysTick->LOAD = 0 ; 

我这里以STM32G474芯片为蓝本,划分三个区,分别称之为BOOT区、APP1区、APP2区。三个区代码内容基本一样,用到外设完全一样,主要是UART2、TIM1。基于TIM1周期性事件通过USART向串口终端提示当前程序运行区间。

1815ab60-de7a-11ee-a297-92fbcf53809c.png

程序在3个区间按下面示意图来回跳转执行,永不停息。

182e9bf2-de7a-11ee-a297-92fbcf53809c.png

经过简单的编程即可达到上面目的。下图是串口助手显示的输出结果的部分截图。

1841beb2-de7a-11ee-a297-92fbcf53809c.png

这里实际上有3个工程,每个工程做跳转时跳转地址不一样。这里不妨以从BOOT区跳往AAP1区为例,看看跳转前做的哪些准备工作。

185eb0da-de7a-11ee-a297-92fbcf53809c.png

跳转前的准备工作如果像上面那样,多数情况下跳转是没有啥问题的。不过,这还不能保证跳转总成功,是否成功跟具体应用场景有关。因此,我们强烈建议针对使用过的外设做复位操作,这就比较保险了。毕竟前面的准备工作,侧重跳转过程中避免产生中断事件或停止外设的运行,但不能保证跳转过程中不会出现一些不确定的状态。所以,建议跳转前对开启过的外设做复位,让他们彻底静默下来,待到新的程序执行区根据实际情况再行初始化。

从main()函数开始的地方不难看到,目前开启的外设主要是下面几个。

186a1998-de7a-11ee-a297-92fbcf53809c.png

我们在跳转前的准备工作里加上针对上面外设复位的操作,见下面橙色方框内代码,分别针对TIM1、USART2和相关GPIO外设做了强制复位。

1878f940-de7a-11ee-a297-92fbcf53809c.png

显然,如果之前开启的外设较多的话,这样一个个添加强制初始化代码也挺啰嗦的。这里再推荐一个等效做法。在STM32 HAL库有一个专门用来对所有外设进行复位的函数,它就是HAL_Deinit()。下面是其函数体内的具体内容。

187fb9ba-de7a-11ee-a297-92fbcf53809c.png

这些复位操作将让相应总线上的外设得以强制复位。这样一来,我们就可以将前面跳转前的那一堆逐个针对ST外设的操作代码改成HAL_DeInit()这一句即可。经实际验证也是可行的。参考下面代码的写法,代码一下变得精简、清爽很多。

188d10b0-de7a-11ee-a297-92fbcf53809c.png

最后补充两点,上面实验代码中从APP2区跳回BOOT区,通过调用系统复位函数也是可行的。另外,上面内容不完全适用于STM32F0系列。

好,关于程序在不同代码区跳转执行的话题就聊到这里,下次再聊!


关键字:STM32G4  BOOT  APP 引用地址:基于STM32G4的BOOT至APP跳转问题排查与实战指南

上一篇:STM32针对字库的调用方法
下一篇:利用STM32CubeMx的串口DMA收发数据

推荐阅读最新更新时间:2024-11-12 10:00

华为公布 “我的华为” app:移动端光线追踪技术
根据华为爆料博主 @长安数码君的消息,华为将在明天宣布 “我的华为”App和一些游戏技术。 该博主表示,“我的华为” App 集成了花粉俱乐部、华为服务、玩机技巧、会员中心等多个之前单独的App。现在,“我的荣耀” App 已经搭载在荣耀V40手机上了。 另外,华为还将在明天正式宣布华为凤凰引擎实现光线追踪技术在移动端手游的首次商用。 日前华为表示,天谕手游通过集成HMS Core Scene Kit,突破了实时光线追踪技术在移动平台上的算力局限,实现了60fps、1080p的高帧率、高画质表现。通过光线追踪技术的加持,可让曲面玻璃、大理石柱等不规则曲面上的人物反射更加逼真、动人。
[手机便携]
提升WiFi体验,腾达智能路由APP超实用功能推荐
新换的路由器,安装完后是不是就丢墙角啦?觉得只要路由器能上网就万事大吉,不需要其他设置了?相信不少小伙伴都是这样想的,但这样一来,许多改善我们上网体验的功能就只能明珠蒙尘了。其实许多路由器都配备了不少能够提升网络体验的功能,只要我们在路由器后台中将它们开启,绝对能打开你使用路由器的新大门! 更改无线信道,增强发射功率 如今路由器已成为每个家庭的标配,所以平常我们在搜索WiFi时都会搜到周围邻居家的WiFi,因为WiFi之间存在无线干扰现象,搜到的WiFi信号越多,代表周围干扰越严重,干扰容易导致频繁丢包,信号下降。在路由器的后台设置中,我们可以通过更改WiFi信道和调节发射功率等手段提升WiFi体验。你可以通过进入路由器设
[网络通信]
专家谈印度禁用59款中国App:系口号大于实质
印度近期针对中国企业和“中国制造”的限制举动层出不穷。据报道,印度电子信息技术部29日宣布,禁止包括TikTok、微信、茄子快传、UC浏览器、微信、QQ、快手和美图等在内的59款中国应用。   据印度政府的一份新闻稿中称,印度出于“安全”考虑,禁止包括TikTok(抖音国际版)和微信在内的59款中国应用,认为这些应用从事的活动有损印度主权、国防、国家安全和公共秩序。   此外,印度手机与电子产品协会上周向印度官方 投诉 称,他们从中国进口的所有电子产品都在“未经警告的情况下”在印度港口遭检查。   专家表示,印度抵制中国应用的口号虽然喊得响,但实际效果怎样就很难说了,因为中印产业合作已有相当深度。由于中国产品领域十分广泛,若印
[手机便携]
智能手机的耗电特征及APP耗电量测试的两种方法
文章陈述了手机发展趋势及耗电特性,集中讨论了时下最为关心的智能手机耗电问题,并介绍了测量手机软件耗电量的两种方法。此外还解释了为何运营商此前会提出收取微信的费用,心跳机制是什么。 美国著名手机公司Palm的CEO JonRubinstein曾经说过: 手机未来的发展取决于两个因数,一是手机的数据传输速度;二就是手机待机时长。 为什么手机待机时长如此重要呢? 现在,手机上网速度已经有很大的提升,而且还在马不停蹄的发展4G,5G。4G网络可以将手机的上网速度提高到100Mbps以上,简单的说,下载一首歌曲不用1秒钟,下载一部电影不到1分钟。现在正在制定和规划的5G网络,通过手机上网的速度甚至可以达到1Gbps。所以可以想象,在数据速度
[测试测量]
智能手机的耗电特征及<font color='red'>APP</font>耗电量测试的两种方法
U-boot-2014.04移植到MINI2440(2) Readme翻译分析
为什么要阅读README,我觉得是更加方便我们理解U-BOOT吧,尤其是在整体上的把握,当然,开发人员写了二十多万个字符,一共六千多行的README,里面有很多涉及到具体配置和使用的部分,其实这就是U-BOOT的使用说明书,这里着重关注几个部分部分,按照README的顺序,就当做英文阅读理解吧。 1. 总结(summary) 首先看看开发者对U-BOOT的定义:a boot loader for Embedded boards based onPowerPC, ARM, MIPS and several other processors, which can be installed in aboot ROM and
[单片机]
U-<font color='red'>boot</font>-2014.04移植到MINI2440(2) Readme翻译分析
U-Boot补丁 S3C2440
# tar xvf u-boot-1.1.6.tar.bz2 //解压 # cd u-boot-1.1.6/ 制作补丁文件 # diff -urN u-boot-1.1.6 u-boot-1.1.6.new u-boot-1.1.6_jz2440.patch 打补丁 # patch -p1 u-boot-1.1.6_jz2440.patch p1:忽略补丁文件第一个”/”之前的内容(也就是如下:u-boot-1.1.6) # head u-boot-1.1.6_jz2440.patch diff -urN u-boot-1.1.6/board/100ask24x0/100ask24x0.c u-boo
[单片机]
stm32-BootLoader程序和app程序合并烧录
我前面的文章有说过,如何制作BootLoader和app程序,但是需要烧录2个hex文件,整个程序才可以正常运行。 那如果是量产烧录2次程序是非常耗时间的,通过查阅一些资料,可以把两个hex文件合并成一个hex文件。 hex文件的格式不做解释,有兴趣可以百度一下,很多大神说过。 我亲自做了2款合并软件 一个是dos界面的 一个是MFC界面的 先看看dos界面的使用 运行合并程序之前: 运行合并程序之后: 这里面多了一个合并的hex,只要烧录这个hex文件,整个程序就包括了BootLoader和app了。 实测烧录进芯片是可以完美运行的。 MFC版本 分别选择BootLoader.h
[单片机]
stm32-BootLoader程序和<font color='red'>app</font>程序合并烧录
苹果应用如临大敌,聊天机器人将让应用开发者失业?
年轻人在大学宿舍或公寓中开发出价值数十亿美元的应用而一夜成名的故事似乎就发生在昨天,比如Snapchat、Instagram以及Uber等。苹果iTunes应用店中已经被某些应用主导了多年,比如Facebook、谷歌应用、Snapchat、Uber以及Spotify等。在过去3到4年间,顶级应用排名几乎没太大变化,应用店正走向衰亡。   苹果公司即将在旧金山举行全球开发者大会 WWDC ,它被许多为智能手机、平板电脑、电视机以及智能手表开发应用的人视为“救命索”。iTunes应用店中大约有150万个应用,开发者希望通过苹果、测评以及口碑促销取得成功。苹果正调整销售结构,计划为应用开发者推出新的赚钱方式。   对于通过订阅
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved