一、IAP是什么?
IAP(In Application Programming)即在应用编程,解释一下,就是给单片机下载烧录程序的,而且只要有串口就行。下载器J-Link、ST-Link、ISP下载也都能给单片机下载程序,但是这些都需要对硬件进行干预,不是很方便,比如下载器要插在板子上,ISP要改变启动的分区,而且ISP是官方的固定不变的,ISP不能做个性化的功能。IAP就能解决这些问题
官方IAP例程
其实ST官方就有提供IAP的例程,我们可以在例程的基础上添加个性化的功能,比如改成能通过网络或者U盘升级的、能够加密用户程序的等等。那到哪里去找这个IAP例程呢?其实就在官方固件库文件的文件夹里。比如F0标准固件库STM32F0xx_AN4065_FW_V1.0.0\Project\STM32F0xx_IAP,就是官方的IAP例程。还有HAL固件库提供的IAP例程,使用STM32Cube下载固件库后可在STM32Cube_FW_F1_V1.8.2\Projects\STM3210E_EVAL\Applications\IAP\IAP_Main找到F1的例程路径,F4的也类似,但是HAL好像没有F0的IAP例程。
官方例程采用的Ymodem协议,这种协议会把文件分块进行传输。
F0系列的IAP程序:
与F1主要区别在于F0的M0内核没有向量表偏移(M0+都有),所以实现方法就是在应用程序起始时把向量表复制到RAM内存,中断发生时到内存中取中断函数地址。
F1系列的IAP程序:
网上资料一大把
F4系列的IAP程序:
基本和F1一样。
二、自定义实现IAP需要知道的事情
1、单片机的启动过程,程序的运行过程,中断实现方式,了解一点汇编。
2、如何操作内部flash。
3、对文件系统的简单理解。
扩展:
1、安全性:
不希望原程序泄露,那么就需要对程序文件加密后传输,IAP再将收到的文件解密,然后写入flash,加密方式多种多样,可以自己选择。
2、通用及易用性:
做到通过宏定义配置就能适配以下几点内容。
①做到适配多种容量的单片机,最好做到在运行时能够得知容量信息,根据容量确定flash页大小。
②适配多种晶振规格常用的8M、16M晶振。
③串口的配置,产品可能使用的串口、串口波特率等不同。
④IAP功能与接口的分层,方便在不同库之间适配,或移植到其他系列单片机。比如都要用到的flash擦除函数,定义成iap_flash_erase(int sector)的形式,移植时改变函数调用即可。
3、扩展性:
产品有远程升级的需求,还要做网络接口。