对于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系列芯片。
如何申请PTCRB认证;PTCRB认证有哪些类型?
ARM9嵌入式处理器S3C2440实现了远程图像光线监控系统
瓷片电容、涤纶电容耐压值的判别方法
PADS中对矩形的倒角功能
丰田正式无偿公开虚拟人体模型
STM32F0芯片内不同程序区的跳转问题交流与介绍
一加5上市时间曝光:相比于一加3T,一加5性能还是提升了很多
史上最文艺的战斗机ZUK Z1橡木版: 骁龙芯+64G+4100mAh, 仅989
无线供电的方式有哪些?什么叫电磁感应方式?
工程师浪漫小创意:自制LED侧光屏
美国大约有1625万人持有比特币
Linux教程:Linux Tee命令真实示例详细指南
旗舰型喷码机
三星曝光屏幕开孔新专利
万能电源模块原理图 常见故障处理方法
基于流媒体应用系统为基础的远程监控系统的设计
比特币中国关业务是好还是坏,在津巴布韦比特币价格还高达7200美刀
适用于1.8V至5V的1-Wir双向电压电平转换器的参考设计
关于智能语音耳机的性能分析和介绍
【展讯】2023青岛工业自动化展7月18日盛大启幕,台湾高技与您相约青岛!