IAP(In Application Programming),在用户程序运行中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。是自已对自已进行编程,IAP在应用中进行编程,可以只是更改某一部分而不影响系统的其它部分,接口程序需要自已写,可以进行远程升级而不影响应用。
IAP技术是从结构上将Flash存储器映射为两个存储体,当运行一个存储体上的用户程序时,可对另一个存储体重新编程,之后将控制从一个存储体转向另一个。
在用户需要实现IAP功能时,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信管道接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。在上述IAP的概念中,bootloader就是其第一个项目程序,第二个项目代码的称App程序。
IAP程序分为两部分:IAP和APP;IAP代码存放起始位置在片上FLASH起始区域 0x8000000(STM32),APP代码则存放在离这个位置一定距离的位置,这个距离一定是大于或等于IAP本身所占空间大小。
ICP(In Circuit Programing)在电路编程,MCU只要处于上电状态即可,不必预烧任何code在MCU里面,烧录范围包括APROM,DataFlash,CONFIG,LDROM和 ROMMAP等整个MCU存储区域,在LOCK的状态下只能在erase-ALL之后更新,ICP的本质就是走串行接口写入,是纯粹的ICP硬件行为, MCU无法自己更新自己。
ISP(In System Programing)是指可以在板级上进行编程,也就是不用拆芯片下来,写的是整个程序,一般是通过ISP接口线来写。ISP一般是通过单片机专用的串行编程接口对单片机内部的Flash存储器进行编程。MCU必须处于可执行程序的状态(除了上电,还要接XTAL),且必须预烧ISP-code(即ISP LDROM固件)在LDROM里面。烧录范围只限于APROM, DataFlash或CONFIG,在LOCK的状态下仍然可以更新某一区块 (APROM, DataFlash或CONFIG),因为烧录的动作取决于ISP-code的写法,所以给系统设计者的弹性较大,不需要额外硬件。