[APM32F1] APM32F103_IAP的简单实现_2 程序跳转代码实现

[复制链接]
 楼主| WuKaiLi 发表于 2022-5-3 21:07 | 显示全部楼层 |阅读模式
#技术资源#
1 前言

最近拿到了一块APM32F103VC的MINI开发板,在学习了一段时间后发现其有非常丰富的外设资源,主频能达到96Mhz。最近在项目中使用到了IAP(In Application Programming)功能,特来评估一下APM32F103的IAP实现方式。

在应用编程IAP(In-Application Programming)是应用在Flash程序存储器的一种编程模式。它可以在应用程序正常运行的情况下,通过调用特定的IAP程序对另外一段程序Flash空间进行读/写操作,甚至可以控制对某段、某页甚至某个字节的读/写操作,这为数据存储和固件的现场升级带来了更大的灵活性。

话接上回,我们提及到了一个概念“程序计数器”,大家对这个说法可能没有什么概念,但是说它的另外一个名词,大家一点不会陌生。那就是“PC指针”

2 PC指针(程序计数器)

PC指针用于存放下一条将要执行的指令地址。为了让大家直观看到PC指针的意义,我这里选取APM32F103VC在仿真状态下PC指针内容以便大家理解。

我们在仿真状态下在任意一个函数下打断点,我们可以看到程序停止在了我们打断点的地方,我这里是“SystemInit()”,鼠标悬浮于该函数上我们可以看到该函数的地址,我这为“0x080003E4”,于此同时我们看到PC现在的值为“0x08000468”。
image-20220503204124574.png

我们在按照“PC指针用于存放下一条将要执行的指令地址”可以理解为,现在断点处的地址为“0x08000468”,下一步程序运行,PC将到“0x080003E4”处。为验证我们的猜想,我们单步运行程序。

image-20220503204751748.png
果然,如我们所想,PC指针内容为“0x080003E4”。

3 仿真状态下改变PC指针

我们可以想象,加入我们改变了PC指针的内容,我们就可以随心所欲的控制单片机运行我们的代码。那我们还是在仿真状态下验证我们的猜想。我们让程序全速运行,然后卡在我们设置的第二个断点处。
image-20220503205155112.png

理论上我们持续运行代码,它都不会回到第一个断点的地方。但是按照我们第二个章节描述,其实只需改变PC内容为“0x08000468”,它就能使得程序回到第一个断点。
我们双击PC指针内容,得到可编辑窗口,然后填入“0x08000468”后按回车键。
image-20220503205455598.png

然后我们就得到了以下内容。
image-20220503205551241.png
可以看到程序又跑回了断点1处。

4 使用代码实现改变PC指针

我这里也不买关子了,用代码实现PC指针的修改方式如下,“addr”即保存着我们PC需要装载的目标值的地址。
  1. ( (void(*)(void)) (*((int*)(addr))) )();


(由于个人技术有限,可能在编撰**时出现漏洞,欢迎大家指出![img]())

(IAP原理涉及内容较多,后续会持续更新相关学习心得以及代码![img]())

caigang13 发表于 2022-5-5 07:57 来自手机 | 显示全部楼层
沙发,支持一下。

评论

感谢支持  发表于 2022-5-6 13:51
Aligagago 发表于 2022-5-6 17:45 | 显示全部楼层
催更
kai迪皮 发表于 2022-5-12 22:36 | 显示全部楼层
支持一波
yangxiaor520 发表于 2022-5-13 08:20 来自手机 | 显示全部楼层
帮顶一下,码字不容易。
Fanexs168 发表于 2022-5-14 00:38 | 显示全部楼层
点赞点赞
lzbf 发表于 2022-10-5 16:34 | 显示全部楼层
ISP/IAP 触发寄存器是什么?  
minzisc 发表于 2022-10-5 16:53 | 显示全部楼层
IAP的实现更加灵活的           
soodesyt 发表于 2022-10-5 17:38 | 显示全部楼层
能不能实现一个DFU的IAP工程?  
232321122 发表于 2022-10-5 18:15 | 显示全部楼层
iap升级可以通过spi通信实现吗  
tabmone 发表于 2022-10-5 19:14 | 显示全部楼层
ISP下载或者IAP都可以吧。      
myiclife 发表于 2022-10-9 20:12 | 显示全部楼层
远程方式升级 在flash 烧bootloader 然后用bootloader来远程更新代码  
olivem55arlowe 发表于 2022-10-9 21:06 | 显示全部楼层
如何利用IAP实现数据掉电不丢失?
htmlme 发表于 2022-10-9 22:08 | 显示全部楼层
iap升级一定要用ymodem协议吗  
pl202 发表于 2022-10-10 20:35 | 显示全部楼层
如何实现通过无线方式给单片机更新程序   
benjaminka 发表于 2022-10-10 21:47 | 显示全部楼层
如何实现从bootloader到APP的跳转   
AloneKaven 发表于 2022-11-4 21:28 | 显示全部楼层
ISP/IAP 触发寄存器是什么?  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

39

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部