0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32F0芯片内不同程序区的跳转问题交流与介绍

茶话MCU 来源:未知 作者:李倩 2018-07-16 14:30 次阅读

‍‍对于STM32用户,经常会涉及到通过用户启动程序实现对用户应用程序的更新升级。一般来讲,用户启动程序主要用来跟外界通信,获取新的用户程序代码并实现对用户代码区的应用程序升级。用户应用程序是指实现各种用户功能的代码。在这个过程中,往往需要做从用户引导程序区到用户应用程序区的跳转,有时可能还需实现从用户应用程序区跳回到用户启动程序区,或者不同用户程序区的互相跳转等操作。在这些跳转过程中,往往有人在此遇到阻碍,破费周折,尤其是在使用基于cortex M0内核的STM32F0做IAP应用时,这个过程跟其它基于CORTEX M3/M4/M7内核的STM32系列相比,操作上不太一样,实现起来稍微复杂些。

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

‍下面介绍中提及的集成编译环境是指ARM MDK,硬件基于STM32F072RB Nucleo开发板。后面我将逐一介绍从BOOT区【用户启动程序区】跳转到APP区【用户应用程序区】,从APP区跳转到另外新APP区以及从APP区跳回BOOT区的基本流程及注意事项。

一般来讲,不同区段的执行代码我们通过建立不同的工程项目来实现,最终将不同区段执行代码写入芯片。这里假定用户BOOT区对应的内部FLASH地址段为0x8000000—0x8004000, 用户APP1区对应的内部FLASH地址段为0x8004000—0x8008000, APP2区对应的内部FLASH地址段为0x8008000—0x800C000.

一、从用户启动程序区【BOOT区】到用户应用程序区【APP区】的跳转

先说从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总容量为0x4000】。

另外一件很重要的事情就是做中断矢量表的拷贝。在APP1区的main()程序开头部分,将放在flash程序空间起始部分的连续48个中断矢量地址表拷贝到内部RAM的起始地址段。即将矢量表从0x8004000地址开始拷到0x20000000开始的连续48个字空间。

基于MDK环境的相关参考代码如下:

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

到此,从BOOT区到APP1区的跳转就算完成了。

二、从一用户应用程序区【APP区】到另一用户应用程序区【APP区】的跳转

那么,如果想从APP1区跳转到另外APP2代码区呢?这个跟从BOOT区跳转到APP1区类似。在APP1区的跳转代码这里就不说了,地址给对、代码写对就好。APP2区的代码也同样必须做中断矢量表的拷贝和0地址域的重映射。这里因为在APP1代码里已经做过了0地址的重映射,所以就不必重复做重映射了,只需做拷贝操作,即将从0x8008000开始的48个字拷贝进0x20000000开始的RAM空间。

假定APP2代码区的内部flash空间安排在为0x8008000—0x800C000。MDK环境里memory布局配置如下:

三、从用户应用程序区【APP区】到用户启动程序区【BOOT区】的跳转

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

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

小结:

1、从BOOT区跳转到APP区,在APP区要做中断矢量表的拷贝和将0地址映射空间从内部flash切换到内部SRAM起始地址。

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

3、从APP区跳回BOOT区,该过程无矢量表的拷贝,只需将0地址映射空间重新映射回内部flash区。

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

5、以上操作流程主要针对基于ARM Cortex M0内核的STM32F0系列芯片。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    453

    文章

    50387

    浏览量

    421751
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1367

    浏览量

    114521
  • STM32F0
    +关注

    关注

    0

    文章

    61

    浏览量

    17088

原文标题:STM32F0 IAP应用中不同代码区的跳转话题

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

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

    STMCU官网更新了一则实战经验文件,文章以STM32F0为例,就芯片【从BOOT跳转到APP
    发表于 06-25 15:28

    STM32F0技术介绍及对比

    STM32F0技术介绍及对比手中有利器,方为真英雄。
    发表于 04-29 16:50 17次下载

    STM32F0硬件开发入门

    分享一份STM32F0的硬件开发资料
    发表于 12-16 17:23 26次下载

    STM32F0系列产品简介

    STM32F0系列产品简介
    发表于 09-29 15:13 22次下载

    STM32F0系列概览

    STM32F0系列是基于Cortex-M0内核的32位入门级产品系列,沿用现有STM32优异基因,针对8位MCU市场,为成本敏感型应用而设计的。 STM32F0 总览
    发表于 11-29 18:13 4512次阅读
     <b class='flag-5'>STM32F0</b>系列概览

    使用Coocox建立STM32F0项目

    使用Coocox建立基于STM32F0 Discovery的项目
    的头像 发表于 07-06 02:09 3253次阅读
    使用Coocox建立<b class='flag-5'>STM32F0</b>项目

    关于STM32F0讲座:内核

    STM32F0产品技术讲座:第一节 内核
    的头像 发表于 07-05 00:15 3915次阅读

    STM32F0—电源控制

    STM32F0—电源控制(开关电源技术与设计 潘永雄pdf)-电源控制 PWR
    发表于 09-29 18:29 50次下载
    <b class='flag-5'>STM32F0</b>—电源控制

    stm32f0 discovery开发包

    stm32f0 discovery开发包分享
    发表于 09-07 15:30 11次下载

    AN5145_从STM32F0系列到 STM32G0 系列的应用移手册

    AN5145_从STM32F0系列到 STM32G0 系列的应用移手册
    发表于 11-21 17:06 13次下载
    AN5145_从<b class='flag-5'>STM32F0</b>系列到 <b class='flag-5'>STM32G0</b> 系列的应用移手册

    AN4088_STM32F1和STM32F0系列微控制器之间的芯片替换

    AN4088_STM32F1和STM32F0系列微控制器之间的芯片替换
    发表于 11-21 17:06 0次下载
    AN4088_<b class='flag-5'>STM32F</b>1和<b class='flag-5'>STM32F0</b>系列微控制器之间的<b class='flag-5'>芯片</b>替换

    AN4617_从STM32F0STM32L0的软件移植

    AN4617_从STM32F0STM32L0的软件移植
    发表于 11-21 17:06 5次下载
    AN4617_从<b class='flag-5'>STM32F0</b>到<b class='flag-5'>STM32L0</b>的软件移植

    UM1779_STM32CubeF0入门之STM32F0系列

    UM1779_STM32CubeF0入门之STM32F0系列
    发表于 11-22 08:22 9次下载
    UM1779_<b class='flag-5'>STM32CubeF0</b>入门之<b class='flag-5'>STM32F0</b>系列

    STM32F0—电源控制

    电子发烧友网站提供《STM32F0—电源控制.pdf》资料免费下载
    发表于 07-31 14:56 0次下载
    <b class='flag-5'>STM32F0</b>—电源控制

    为什么STM32F0系列芯片里面没有VTOR

    为什么基于STM32G0STM32L0系列芯片里有VTOR而STM32F0系列又没有? 用过STM32G0
    的头像 发表于 09-09 15:40 1487次阅读
    为什么<b class='flag-5'>STM32F0</b>系列<b class='flag-5'>芯片</b>里面没有VTOR