本帖最后由 WuKaiLi 于 2022-10-26 19:25 编辑
#申请原创# #技术资源#
1 前言
最近拿到了一块APM32F103VC的MINI开发板,在学习了一段时间后发现其有非常丰富的外设资源,主频能达到96Mhz。最近在项目中使用到了IAP(In Application Programming)功能,特来评估一下APM32F103的IAP实现方式。
在应用编程IAP(In-Application Programming)是应用在Flash程序存储器的一种编程模式。它可以在应用程序正常运行的情况下,通过调用特定的IAP程序对另外一段程序Flash空间进行读/写操作,甚至可以控制对某段、某页甚至某个字节的读/写操作,这为数据存储和固件的现场升级带来了更大的灵活性。
2 程序跳转基础
实现IAP,最重要的是实现在BootLoader程序跳转至APP中。然后是APP程序正常运行,能够正常的响应自己的中断。由于APP程序一般不是保存在Flash的起始位置,这里我们引入知识点“PC指针”和“中断向量表”。
2.1 程序计数器
单片机的PC是指程序计数器(Program Counter)。程序计数器用于存放下一条将要执行的指令地址。当执行一条指令时,首先需要根据程序计数器中存放的指令地址,将指令取出送到指令寄存器中,此过程称为“取指令”。与此同时,程序计数器中的地址编制的程序进行自动加1跳转操作,得到下一条指今的地址。当前一条指令执行完毕,单片机再根据程序计数器取出下一条指令的地址,并再得到再下条指令地址,依次执行每一条指令。
简而言之,只要我们在BootLoader跳转至APP时将,程序计数器里面的内容装载入我们APP的起始函数,我们就能够运行APP起来啦。
2.2 中断向量表
中断向量表是程序用于响应中断的基础。单片机程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动。当中断来临, 单片机的内部硬件机制亦会自动将 PC 指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。我们编写的BootLoader跳转至APP时,需要让APP的中断向量表映射到相应的位置。
若不对APP的向量表进行重映射,将会发生什么情况呢?即BootLoader程序跳转至APP后,若在APP程序运行过程中发生中断,则会去执行BootLoader的中断服务函数而造成整个系统异常。
2.3 向量表偏移量寄存器
APM32F103VC这块芯片是基于M3内核的。通过查阅M3内核参考手册,里面有一个向量表偏移寄存器VTOR。这个寄存器是我们APP能正常运行程序的基础,通过设置该寄存器。我们可以轻而易举完成APP向量表的重映射。
理论上只要我们跳转至APP程序后将向量表偏移量寄存器指向我们的APP存放中断向量表的地方,我们即可让单片机能够在发生中断的时候正确执行APP的中断服务函数。
(由于个人技术有限,可能在编撰**时出现漏洞,欢迎大家指出)
(IAP原理涉及内容较多,后续会持续更新相关学习心得以及代码) |