转自:https://qshanbao.blog.ustc.edu.cn/?p=591
玩单片机的都应该听说过ISP、IAP和ICP这几个词。一直搞不太清楚他们之间的区别。今天查了资料后总结整理如下。
ISP:In System Programing 在系统编程
IAP:In applicating Programing 在应用编程
ICP:In Circuit Programing 在电路编程
区别:
1、ISP是把房子拆了再重造一间,那么在造好之前当然是不能住人的啦!
2、IAP是在造好的房子里边进行一些装修,装修的时候人还住在里面!
3、ICP是在电路编程,是LPC芯片的编程方式,相当于ATMEL的ISP,而LPC的ISP就相当于ATMEL的IAP了。
ISP是指可以在板级上进行编程,而不用把芯片拆下来放到烧写器中,即不脱离系统,所以称作“在系统编程”,它是对整个程序的擦除和写入,通过单片机专用的串行编程接口对单片机内部的Flash存储器进行编程。即使芯片焊接在电路板上,只要留出和上位机接口的串行口就能进行烧写。
IAP同样是在板级上进行编程,MCU获取新代码并对程序的某部分重新编程,即可用程序来改变程序,修改程序的一部分达到升级、消除bug的目的,而不影响系统的其它部分,烧写过程中程序可以继续运行,另外接口程序是自已写的,这样可以进行远程升级而不影响应用。IAP的实现更加灵活,通常可利用单片机的串行口接到计算机的RS232口,通过专门设计的固件程序来编程内部存储器。
IAP的实现
程序运行在CPU内部的高速Flash时无法完成内部Flash中代码的更新,为解决此问题,IAP从结构上将Flash存储器映射为两个存储体——应用boot区和程序存储区,在设计固件程序时编写两个项目代码,第一个项目程序存放在应用boot区,不执行正常的功能操作,而只是通过某种通信管道(如USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码,存放在程序存储区。这两部分项目代码都同时烧录在User Flash中,当芯片上电后,首先运行应用boot区程序,它作如下操作:
1)检查是否需要对第二部分代码进行更新
2)如果不需要更新则转到4)
3)执行更新操作
4)跳转到第二部分代码执行。
应用boot区代码为一个简单的应用程序,实现从外部Flash导入应用程序代码以及向应用程序代码区入口跳转的功能。应用boot通常存放在CPU内部Flash的开始部分,必须通过其它手段,如JTAG或ISP烧入,而且一旦写入后不再修改。
程序存储区代码可以使用第一部分代码IAP功能烧入,也可以和第一部分代码一道烧入,以后需要程序更新时再通过第一部分IAP代码更新。
对于STM32来说,因为它的中断向量表位于程序存储器的最低地址区,为了使第一部分代码能够正确地响应中断,第一部分代码通常位于Flash的开始区域(bootloader),而第二部分代码紧随其后。在第二部分代码开始执行时,首先需要把CPU的中断向量表映像到自己的向量表,然后再执行其他的操作。
如果IAP程序被破坏,产品必须返厂才能重新烧写程序,这是很麻烦并且非常耗费时间和金钱的。针对这样的需求,STM32在对Flash区域实行读保护的同时,自动地对用户Flash区的开始4页设置为写保护,这样可以有效地保证IAP程序(第一部分代码)区域不会被意外地破坏。
ISP、IAP、ICP与传统烧写方式的区别
1)在开发阶段
改code时, 不再需要将MCU从板子上拔起来, 拿到烧录器上烧, 然后再装回去. 可以直接利用ISP/ICP Programmer做板上烧录, 为开发者提供了极大的便利性.
2)在量产阶段
客户可以采用”先焊到板子上再烧code”的方式, 将烧code的动作安排在生产线的某一站.
那么传统的方式 (先将code烧好再焊到板子上)有什么缺点?
传统的方式是这样的: 拆封–>从tray盘取出chip–>烧录–>把chip放回tray盘.
这样的流程比起上面建议的方式: 增加了烧录时间, 容易造成QFP包装的chip弯脚, 或忘了烧code即放回tray盘.
3)在成品阶段
已组装好的成品若要改code, 可以透过预留的接口, 利用ISP或ICP, 更新MCU, 不需要拆机.
什么是 IAP (In-Application Programming)?
IAP指的是, MCU在运行的状态下, 利用ISP的机制, 不透过外接工具 (例如: ISP Programmer) 的帮忙, 去更新APROM, DataFlash 或 CONFIG. 要实现这种功能,
系统必须有取得更新数据的能力, 例如: 处于某一种联机的状态.
(注: 有时候, ISP/IAP的分别并不是那么清楚!)
ISP与ICP的差别
For ISP
(1) MCU必须处于可执行程序的状态 (除了上电, 还要接XTAL), 且必须预烧ISP-code在LDROM里面
(2) 烧录范围只限于APROM, DataFlash或CONFIG (但对使用者来说, 应经够了!)
(3) chip在LOCK的状态下, 仍然可以只更新某一区块 (APROM, DataFlash或CONFIG)
(4) 因为烧录的动作取决于ISP-code的写法, 所以给系统设计者的弹性较大
For ICP
(1) MCU只要处于上电状态即可, 不必预烧任何code在MCU里面
(2) 烧录范围涵盖整颗MCU, 包括 APROM, DataFlash, CONFIG, LDROM 和 ROMMAP
(3) chip在LOCK的状态下, 无法只更新某一区块, 只能在erase-ALL之后, 更新某一区块, 再逐一烧回其它区块(因为ICP的本质就是走串行接口的Writer Mode, chip被LOCK之后, 除了erase-ALL, 所有烧录动作皆会被禁止)
(4) 因为烧录纯粹是ICP硬件的行为, MCU无法自己更新自己, 所以给系统设计者的弹性较小(例如: 无法藉由ICP去实现IAP的功能)
ISP与ICP的使用场合
依这两者的特性, 配合客户的系统需求, 而后才建议客户使用ISP或ICP.
注:上述差别的第(3)点和第(4)点, 可能是ICP带给使用者的最大限制. 站在使用者的观点, 若ISP与ICP只能择一的话, ISP会是必要的选择。
目前市场上不少的单片机具有ISP/IAP功能
ATMEL公司的单片机AT89SXXXX系列,提供了一个SPI串行接口对内部程序存储器编程(ISP)。
ATMEL公司的单片机AVR系列,提供了一个SPI串行接口对内部程序存储器编程(ISP)。
PHILIPS 公司的P89C51RX2xx系列是带ISP/IAP的8位Flash单片机。PHILIPS公司为了使ISP技术和IAP技术得以推广,在芯片上免费提供了Boot ROM固件,并且巧妙地解决了固件和FLASH的地址覆盖问题及一些具体实现细节问题,使它们的实现变得简单。
ST公司的μPSD32××系列单片机片内带128KB/256KB的FLASH存储器及32KB Boot ROM,通过JTAG串行口能很容易地实现ISP功能,IAP功能则可由用户在应用中实现。
SST公司的单片机SST89C54,其最大的特点内部有两块独立的FLASH存储器,具有IAP功能,对于8052系列的其它公司的单片机(ATMEL、 WINBOND、ISSI)可以直接代换,软硬件无须做任何改动。
PHILIPS公司的P89C51RX2xx系列是带ISP/IAP的8位Flash单片机。PHILIPS公司为了使ISP技术和IAP技术得以推广,在芯片上免费提供了Boot ROM固件,并且巧妙地解决了固件和FLASH的地址覆盖问题及一些具体实现细节问题,使它们的实现变得简单。
很多家公司的单片机都具备ISP功能,ISP在单片机领域的应用成为了必然的趋势。此外在外围器件中ST公司的PSD系列产品片内带大容量存储器,支持ISP及IAP功能。