STM32的IAP

IAP(In-Application-Programming)即在应用编程。传统的STM32应用编程需要使用调试器或者改变STM32的启动方式通过ISP(In-System-Programming)来升级芯片内的用户程序,前者需要有一个专用的调试器,后者则需要改动硬件电路,这些方式对于终端的用户来说都不是很方便,为了实现更友好的升级程序方式于是IAP出现了。IAP能够在不改变硬件电路以及没有调试器的情况下仅通过板子支持的数据传输协议(常见的USART,CAN,SDIO等)升级内部应用程序。
实现原理
STM32内置FLASH的各区域默认分布如下:
在只有一个应用程序的情况下,芯片执行程序的情况如下:
闪存前四个字节存储着栈顶地址,从第五个字节即地址0x80000004开始存储的是系统中断向量表,当发生中断时程序查询这个表找到对应中断的服务函数地址,然后程序跳入中断服务函数中执行。板子上电后即从0x8000004中取出复位中断向量的地址,然后跳转到复位中断程序的入口(标号①所示),执行结束后跳转到main函数中(标号②所示)。在执行main函数的过程中发生中断,则强制将PC指针指回中断向量表处(标号③所示),从中断向量表中找到相应的中断函数入口地址,跳转到相应的中断服务函数(标号④所示),执行完中断函数后再返回到main函数中来(标号⑤所示)。
使用IAP方案后的内置FLASH各区域分布如下:
芯片执行程序的情况如下:
上电初始程序依然从0x08000004处取出复位中断向量地址,执行复位中断函数后跳转到IAP的main(标号①所示),在IAP的main函数执行完成后强制跳转到0x08000004+N+M处(标号②所示),最后跳转到新的main函数中来(标号③所示),当发生中断请求后,程序跳转到新的中断向量表中取出新的中断函数入口地址,再跳转到新的中断服务函数中执行(标号④⑤所示),执行完中断函数后再返回到main函数中来(标号⑥所示)。