关于STM32的IAP与APP互相跳转

转自:https://www.cnblogs.com/smulngy/p/5700283.html

首先说一下什么是IAP。IAP(In Application Programming)即在应用编程,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。通常实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信方式(如USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。

以上内容摘自原子的开发指南。说的通俗一点,要做IAP功能(也可以说成是远程升级功能),需要有两段程序一个是IAP程序(也可以称为BootLoader),另一个是APP程序(主应用程序)。通过USB、串口、CAN等通讯方式向STM32发送要升级的程序文件数据(按自定的协议),IAP程序中将接收到的数据写到APP程序的地址实现将APP程序的升级。这是大致的流程。

此文档只做互相跳转的总结不包含接收数据、FLASH写入等操作。

说到IAP升级不得不说两个图(图片引自原子的开发指南)

第一个是正常运行时的流程图

关于STM32的IAP与APP互相跳转

STM32的FLASH地址起始于0x08000000,程序文件就从此地址开始写入。此外STM32内部通过“中断向量表”来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动,而“中断向量表”的起始地址是0x08000004,当中断来临,STM32的内部硬件机制亦会自动将PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。

根据上图分析启动和运行过程,

① STM32在复位后,先从0X08000004地址取出复位中断向量的地址,并跳转到复位中断服务程序,

② 在复位中断服务程序执行完之后,会跳转到的main函数(如使用KEIL MDK调试时一下载进程序,会发现需要运行几次下一步才会跳转到main函数的位置)

③ main函数一般都是超循环体(while(1)死循环),在main函数执行过程中,如果收到中断请求(发生重中断),此时STM32强制将PC指针指回中断向量表处

④ 根据中断源进入相应的中断服务程序,

⑤ 在执行完中断服务程序以后,程序再次返回main函数执行。

第二个是加入IAP功能后的流程图

关于STM32的IAP与APP互相跳转

关于STM32的IAP与APP互相跳转

根据上图分析加入IAP后的起动和运行过程

① STM32复位后,还是从0X08000004地址取出复位中断向量的地址,并跳转到复位中断服务程序,在运行完复位中断服务程序之后跳转到IAP的main函数,如将IAP看作是一个APP的话,那么此部分和正常起动是一样的,此步相当于正常运行的①和②。

② 在执行完IAP以后(如需要将新的APP代码写入STM32的FLASH或没有更新直接跳转。APP的复位中断向量起始地址为0X08000004+N+M),跳转至APP的复位向量表

③ 取出APP的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至APP的main函数

④ 同样main函数为一个超循环,并且注意到此时STM32的FLASH,在不同位置上,共有两个中断向量表。在main函数执行过程中,如果CPU得到一个中断请求,PC指针仍强制跳转到地址0X08000004中断向量表处,而不是APP程序的中断向量表。

⑤ 程序再根据我们设置的中断向量表偏移量,跳转到对应中断源的APP中断服务程序中,

⑥ 在执行完中断服务程序后,程序返回main函数继续运行。

注意:IAP和APP跳转过程中,是通过PC指针定位进行跳转,所有的寄存器都保持原有状态,跳转过程中并不是做了复位。

下面是IAP和APP互相跳转程序

 

上一篇:Xamarin解决方案:UITableView和键盘滚动问题


下一篇:Largest Contentful Paint (LCP)