首先先明白几个概念
IAP:In applicating Programing,在应用编程
ICP:In-Circuit Programming,在线编程
我自己理解的话,ICP就是平时用仿真器直接下载程序的方式。应用程序直接从FLASH的0x0800 0000开始执行,只需要应用程序一个代码。
IAP则需要两个代码(应该是两类代码),Bootloader和APP程序。Bootloader作用是先接受到(通过各种通信方式)需要更新的APP文件,然后写入到指定位置(FLASH或者SRAM,SRAM好像不用写入,这个不太懂,)。
所以需要对代码执行过程进行学习,再了解几个概念。
起始地址:FLASH或者SRAM物理起始地址,FLASH为0x8000 000,SRAM为0x2000 0000。
中断向量表:各种中断响应程序。应该就是发生中断时(异常事件)判断是哪种中断,并进入对应中断服务程序。中断向量表起始地址(0x8000 0004)复位中断向量,复位中断服务程序执行完成后会跳转到main()函数。在ICP中只有一个程序,也就只有一个中断服务向量表。而在加入Bootloader后即存在两个代码,对应FLASH中的不同位置上,有两个中断向量表。
中断向量表偏移量:在加入Bootloader后,同一个FLASH中存在两个中断向量表,但在APP中发生中断时,PC指针扔强制跳转到0X0800 0004中断向量处,而不是新程序的中断向量表。要想执行APP程序中的中断服务程序就需要对中断向量表进行偏移。