基于ESP8266实现STM32的远程IAP程序升级(1)
第一节:串口IAP基本介绍
1.1 STM32的程序下载方式
STM32下载程序的方式有以下三种,第一种是在电路编程(ICP)方式,MCU内部不需要有程序,直接上电就能够进行编程的方式。使用ST-LINK下载器的JTAG/SWD接口属于这种方式。
第二种方式是在系统编程(ISP),通过设置boot引脚设置对应启动模式,执行厂家固化的Bootloader程序,来下载程序。使用串口下载程序属于这种方式。
最后一种方式是在应用中编程(IAP),即允许用户在现运行程序中,通过任何一种通信接口,将新的程序重新下载到单片机闪存中,实现无需操作硬件平台的情况下程序的远程升级。
1.2 IAP程序下载流程
(插叙一段基本知识:下载程序是指,将用户应用程序下载到FLASH中0x08000000地址开始的区域。在ICP下载方式中,如果通过JTAG/SWD协议下载,是将代码直接下到这一区域;如果通过串口下载,需要配合芯片引脚BOOT0/1,实现单片机从系统存储器的Bootloader程序【这段程序是原厂固化的】启动,将串口接收到的程序代码,引导存储到FLASH中0x08000000地址开始的区域中去)
对于IAP下载方式的实现,是将一段用户Bootloader程序写到FLASH中0x08000000地址开始的区域。注意,这里的用户BootLoader程序,不同于原厂固化的BootLoader程序,是用户可以自我定制的【例如你可以在Bootloader程序中配置好串行通信接口,用于后续接收更新后的应用程序】。
用户BootLoader程序会实现以下功能:将外部应用程序包通过串口接收起来,写到FLASH设定好的IAP应用程序存储区域,写完之后,又可以从主程序跳转到应用程序中去执行。
1.3 IAP程序执行流程
(插叙一段基础知识:一般的程序执行流程如图1所示,程序从FLASH中0x08000000地址开始,执行复位中断向量,跳转到复位中断程序,再跳转至main函数入口【这种跳转逻辑在启动文件里面有定义】,主函数处于死循环,若发生中断请求,STM32的内部硬件机制会自动将PC指针定位到中断向量表,再跳转至相应中断程序入口,执行中断程序 )加入IAP后,程序执行流程如图2所示,程序从FLASH中0x08000000地址开始,通过复位中断,跳转至IAP程序main函数入口,执行IAP过程【IAP过程是指将用户程序包通过某种通讯机制写到FLASH的地址中去】,执行完IAP过程,跳转至APP程序区域。
APP程序区域同样有中断向量表,通过APP复位中断,跳转至APP的主函数入口,进入死循环。若发生中断请求,会先跳转至原IAP程序的中断向量表,然后根据IAP与APP程序的偏移量,跳转至应用中断程序入口,执行中断,完后返回应用主程序。
1.4 IAP配置流程
对于APP程序,设置好程序的起始地址和存储空间大小,然后设置好中断向量表偏移量,通过fromelf.exe生成.bin格式的APP文件,该文件用于后续更新。
对于BootLoader程序,初步尝试时,直接将例程下载到开发板中即可。
至此,已经可以实现,通过串口将.bin格式的APP文件下载至单片机中了。
上述过程的实现参考正点原子的视频与例程,不再赘叙。
然而,正点原子的例程仅实现了从IAP至APP程序的跳转,当我要更新APP程序时,需要在接收到新的APP代码的后返回IAP代码块,重新更新APP固件,如何实现这一需求呢,请看下一文章。