知识在于分享,技术在于交流。技术小白一枚,欢迎大家指教。
一、IAP and APP
产品开发中为方便后期维护和升级,一般都会具有在线升级功能。IAP即(In Application Programming)在应用编程便是常用的实现该功能的方法。
自己日常学习(专门学习IAP功能除外),开发普通程序,通常不考虑IAP,即根据电路原理图,利用Keil等工具进行单片机编程,烧录运行即可。如果功能需求改变,重新修改程序,进行烧录即可。不过,实际产品如果每次这样进行,估计没多少公司会接受😄
我们编写的STM32程序,烧录以后存储于Flash中,当不使用IAP时,我们的程序存储于,如图1-1所示红色箭头标志的起始地址。
0x08000000即我们程序运行的起始地址,后面Size根据不同芯片默认不同。
如果需要加入IAP程序,进行升级功能。首先我们必须编写两个程序:
一个叫bootloader(引导加载程序),我们称为IAP程序,就是实现升级功能必须的代码(跟实际功能没关系);另一个较user application(用户应用程序),我们称为APP程序,就是实现我们产品实际功能的代码。
写完IAP和APP后,我们要进行烧录,这个大家很容易理解,我们要将程序烧录进Flash,如果我们不对要烧录的Flash地址进行修改,那肯定第二个烧录的一定会覆盖第一个烧录的程序,导致程序运行不是我们想要的结果。
IAP在出厂时就固定下来了,在需要变更user application时只需要通过触发bootloader对user application的擦除和重新写入即可完成用户应用的更换。如图1-1所示
则我们需要人为将Flash区域分为两部分,两部分区域各存放一个程序,如下:
图中红色箭头即我们程序的起始地址,STM32系列为0x08000000。一般情况下IAP程序占据的Flash不会很大,可预估大小决定蓝色箭头处Flash的具体地址,绿色箭头根据实际使用的单片机大小,终止地址不一样。
二、具体实现
原理简述:STM32系列如果从Flash启动程序(还有其他的启动方式,用到再查),一般都使用Flash启动。当启动时程序首先从0x08000000开始执行程序,运行我们的IAP程序,IAP仅需要根据某一系统变量(我们设置的存储于Flash中的,开机读取)决定是否进入APP程序。如果不需要升级,则进入APP运行。例程代码如下:
该部分一般放于系统初始化之前,用于实现跳转,涉及到的函数及变量定义如下:
APP程序修改,当程序从IAP跳转如APP后,首先必须在图1-1中修改APP的Flash起始地址为IAP中跳转的,其次由于中断向量表的缘故,需要进行重新定义,应该在程序初始化之前添加如下内容:
其中0x20000为具体的偏移地址,也就是IAP程序的预留大小。
如此便可实现相应的功能。
二、注意事项
1、IAP和APP的实现如果有问题,有可能会影响在线升级功能,可以先确定程序功能没问题
2、IAP需要预留相应的通信接口,实现APP代码的接收,从而进行烧录
3、当APP跳转IAP时,仅需要先修改系统标准变量,复位重新运行即可,会重新从IAP开始发现有升级标准则不跳转继续运行IAP下面功能,实现升级,升级完成将标准量清空,复位重新IAP跳转APP即可。
4、APP跳转IAP如果涉及到IAP接收代码的通信功能一定注意初始化问题,如果重新配置有可能会通信中断。