参考
参考:https://mar-sky.blog.csdn.net/article/details/140448176,本质一样,实现方式不同,对程序的要求不同,不用放在运行代码中。和下面最大区别就是代码的下载地址不同,IAP的代码放在的另一个区域。
概述
将IAP的hex和运行程序的hex文件下载到不同的地址,在keil中设置下载地址的位置不能让IAP的hex和想要运行的实际运行的hex文件地址重合,需要把IAP的下载地址修改
keil中修改IAP代码烧录起始地址的设置
这个地址写入需要注意对内存不同的地方写入运行程序很危险,需要谨慎。首先知道两个文件的大小和MCU实际存储程序的地址空间
下载程序的起始地址计算
感觉这样起始地址计算有些问题,例如共有10字节,需要用5字节:10-5+1 =6才是开始的地址。下面是根据参考的IAP的文档的计算方式
上面只是计算的例子,所以和下面的实际地址不同
IAP“引导程序”
实际上还是最终跳转到了厂家的bootload程序
#include "CH554.H"
#include "delay.h"#define BOOT_ADDR 0x3800 //这个引导最终还是进入了厂家编写的bootload程序
typedef void( *pTaskFn)( void );//定义一个函数指针pTaskFn BOOT_PRE; void main( void )
{EA = 0; //关闭总中断,必加BOOT_PRE = BOOT_ADDR;mDelaymS( 100 ); BOOT_PRE( ); //跳至BOOT升级程序,使用ISP工具升级 while(1);}