打印
[APM32F1]

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

[复制链接]
1649|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#技术资源#
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”。


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


果然,如我们所想,PC指针内容为“0x080003E4”。

3 仿真状态下改变PC指针

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


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


然后我们就得到了以下内容。

可以看到程序又跑回了断点1处。

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

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


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

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

使用特权

评论回复
沙发
caigang13| | 2022-5-5 07:57 | 只看该作者
沙发,支持一下。

使用特权

评论回复
评论
WuKaiLi 2022-5-6 13:51 回复TA
感谢支持 
板凳
Aligagago| | 2022-5-6 17:45 | 只看该作者
催更

使用特权

评论回复
地板
kai迪皮| | 2022-5-12 22:36 | 只看该作者
支持一波

使用特权

评论回复
5
yangxiaor520| | 2022-5-13 08:20 | 只看该作者
帮顶一下,码字不容易。

使用特权

评论回复
6
Fanexs168| | 2022-5-14 00:38 | 只看该作者
点赞点赞

使用特权

评论回复
7
lzbf| | 2022-10-5 16:34 | 只看该作者
ISP/IAP 触发寄存器是什么?  

使用特权

评论回复
8
minzisc| | 2022-10-5 16:53 | 只看该作者
IAP的实现更加灵活的           

使用特权

评论回复
9
soodesyt| | 2022-10-5 17:38 | 只看该作者
能不能实现一个DFU的IAP工程?  

使用特权

评论回复
10
232321122| | 2022-10-5 18:15 | 只看该作者
iap升级可以通过spi通信实现吗  

使用特权

评论回复
11
tabmone| | 2022-10-5 19:14 | 只看该作者
ISP下载或者IAP都可以吧。      

使用特权

评论回复
12
myiclife| | 2022-10-9 20:12 | 只看该作者
远程方式升级 在flash 烧bootloader 然后用bootloader来远程更新代码  

使用特权

评论回复
13
olivem55arlowe| | 2022-10-9 21:06 | 只看该作者
如何利用IAP实现数据掉电不丢失?

使用特权

评论回复
14
htmlme| | 2022-10-9 22:08 | 只看该作者
iap升级一定要用ymodem协议吗  

使用特权

评论回复
评论
WuKaiLi 2022-10-9 22:17 回复TA
不一定的,这升级协议主要是看应用场景。 
15
pl202| | 2022-10-10 20:35 | 只看该作者
如何实现通过无线方式给单片机更新程序   

使用特权

评论回复
16
benjaminka| | 2022-10-10 21:47 | 只看该作者
如何实现从bootloader到APP的跳转   

使用特权

评论回复
评论
WuKaiLi 2022-10-10 22:24 回复TA
( (void(*)(void)) (*((int*)(addr))) )(); addr 改成我们APP的保存地址+4即可。 
17
AloneKaven| | 2022-11-4 21:28 | 只看该作者
ISP/IAP 触发寄存器是什么?  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

39

帖子

1

粉丝