#技术资源#
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]())
|