NG体育·(南宫)官方网站。有趣实用的生活常识!

最新更新文章排行

NG体育资讯网站

当前位置: NG体育·(南宫)官方网站 > 最新更新

STM32F0不同代码区跳转时总失败…这些操作你做对了吗?

时间:2024-05-28人气: 作者: 小编

  NG体育电子游戏官网【下载】STM32F0使用DFU升级后Leave DFU Mode不能运行用户代码

  【文章】STM32F1与STM32F0在GPIO_TypeDef 寄存器方面的不同

  【文章】STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单

  明天有奖直播 嵌入式人才认证项目课程介绍暨嵌入式大赛ST赛道培训材料指引

  有奖学习 探索泰克 4 系列 BMSO 强大功能,还能参与“叠叠乐”省钱大作战!

  PI 有奖直播:在无需DC-DC变换器的多路输出电源设计中实现高效率和出色的输出调整率

  STM32新品直播 报名参会获取【千元新品开发板】抽奖资格,还能赢【京东卡】

  【万元大奖等你赢,入围即得600元物料】2024 DigiKey“感知万物,乐享生活”创意大赛火热报名中!

  台湾金属工业研究发展中心与尼得科株式会社 就推广工业节能节电型高效电机签署MOU

  艾迈斯欧司朗:2030年完成奥地利施泰尔马克州产能及芯片技术升级,响应欧洲芯片法案

  品英Pickering公司携多款领先的开关和仿真方案及产品亮相飞机航空电子国际论坛

  TITAN Haptics采用最新触觉技术以实现绝佳性能和用户体验,优化产品设计和提高市场竞争力

  Gartner预测2024年全球公有云终端用户支出将超过6750亿美元

  佳能推出 FPD 曝光设备 MPAsp-E1003H,可用于生产车载大型特殊显示器及智能手机显示器

  新思科技Fusion Design Platform成为首个获得三星EUV技术5LPE工艺认证的平台

  IAR Embedded Workbench®集成开发环境全面支持航顺芯片HK32MCU系列

  感知器的VC实现#include percept.h#include stdio.h#include stdlib.h

  对于STM32用户,经常会涉及到通过用户启动程序实现对用户应用程序的更新升级。一般来讲,用户启动程序主要用来跟外界通信,获取新的用户程序代码并实现对用户代码区的应用程序升级。用户应用程序是指实现各种用户功能的代码。

  在这个过程中,往往需要做从用户引导程序区(以下简称【BOOT区】)到用户应用程序区(以下简称【APP区】)的跳转,有时可能还需实现从用户应用程序区跳回到用户启动程序区,甚至不同用户程序区的互相跳转等操作。在这些跳转过程中,常常有人的开发工作在此遇到阻碍,甚至破费周折。

  在此我们以STM32F0为例,就芯片内不同程序区的跳转问题做些交流与介绍,限于篇幅,这里仅直接介绍具体操作和注意事项,不做过多拓展介绍。相关知识点可阅读STM32芯片参考手册、STM32相关内核编程手册。

  下面介绍中提及的集成编译环境是指ARM MDK,硬件基于STM32F072RB Nucleo开发板。后面我将逐一介绍不同跳转操作的基本流程和注意事项,涉及以下三种情况:

  先说从BOOT区跳转到APP区。这个跳转代码比较简洁、简单,注意跳转前要关闭刚才程序区开启过的所有中断使能,保证所有中断请求位都被清除,不是简单的关闭总中断,否则往往隐患多多。BOOT区相关跳转代码如下:

  这个从BOOT区到APP区的跳转最终能否成功,关键还是取决于APP区代码相关配置及准备工作。假设这里的APP区是上面提到的APP1区,内部FLASH地址段为0x8004000—0x8008000,那么在MDK的Option项里的Memory配置板块要做正确配置,即FLASH空间与RAM空间的配置,如下图所示:

  IROM1的配置就是APP1代码摆放的起始空间地址及长度。IRAM的配置要注意先保留48个字的空间用来存放中断矢量表的内容。因为STM32F0芯片的中断矢量表的大小就是48个字(即0xc0字节)。至于剩下的内部RAM空间大小由芯片本身的RAM容量决定(这里是基于STM32F072RB芯片,其内部RAM总容量为0x40000)。

  另外一件很重要的事情就是做中断矢量表的拷贝。在APP1区的main()程序开头部分,将放在FLASH程序空间起始部分的连续48个中断矢量地址表拷贝到内部RAM的起始地址段。即将矢量表从0x8004000地址开始拷到0x20000000开始的连续48个字空间(前面提到的存储配置正是为了配合这个拷贝操作)。基于MDK环境的参考代码如下:

  上面代码中绿色语句就是实现中断矢量表从内部FLASH到内部RAM的拷贝,而红色语句则是为了实现将程序执行的0地址域的重映射,即将程序运行的0地址从内部FLASH的0x8000000通过重映射机制切换到0x20000000,为的是在APP1区发生中断时CPU能从正确的地方准确获取相应中断矢量地址去执行中断服务程序。

  那么,如果想从APP1区跳转到另外APP2代码区呢?这个跟从BOOT区跳转到APP1区类似。在APP1区的跳转代码这里就不说了,地址给对、代码写对就好。APP2区的代码也同样必须做中断矢量表的拷贝和0地址域的重映射。但因为在APP1代码里已经做过了0地址的重映射,所以就不必重复做了。

  有时我们还希望或需要程序能从APP区跳回用户BOOT区,那如何操作呢?对于STM32F0芯片而言,程序执行区从APP区跳回BOOT区跟从BOOT区跳到APP区还不太一样,经常有人在这个跳转过程中卡壳,对于跳得出而跳不回感到难以理解。

  假设从APP2区跳回BOOT区,在APP2区做跳转准备时除了给定正确的跳转地址外,另一个要做的就是将之前通过重映射将0地址程序空间从内部SRAM切换回内部FLASH区。实际应用中,我们往往因为忽视了这点,跳回去后一碰到中断就问题来了。另外,从APP区跳回BOOT区无须矢量表的拷贝操作。所以在APP2区执行跳转前需将0地址重映射回内部FLASH空间,通过运行如下库代码完成:

  通过以上几种不同情况下操作过程的描述,我们可以知道,想要避免STM32F0在代码调转中出错,应该遵循以下几条关键的经验:

  √ 从【BOOT区】跳转到【APP区】,在【APP区】要做中断矢量表的拷贝和将0地址从内部FLASH切换到内部SRAM起始地址。

  √ 从【APP区】跳转到其它新的【APP区】,只需在新的【APP区】的代码里再做中断矢量表的拷贝,并保证相关存储配置的正确。

  √ 从【APP区】跳回【BOOT区】,该过程无矢量表的拷贝,只需将0地址执行域重新映射回内部FLASH区。

  √ 不论从什么区跳往什么区,跳转前禁用当前用户打开过的所有中断使能、确保无未处理的中断请求存在或在跳转过程中发生中断。

  √ 以上操作流程主要针对基于CORTEX M0内核的STM32F0系列芯片。

标签: 跳转地址  

本类推荐