IAP是 直译 在应用中编程 的缩写。本意是指设备的程序跑起来的时候对设备进行程序修改,这样说更符合嵌入式设备的IAP实际工作过程。
一般不含IAP程序的单片机启动后直接到main后开始运行就可以了
原理上的
一般嵌入式单片机的IAP过程主要完成两个过程 以STM32为例
1.程序(Fuc1)先进行必要的初始化(如与为获取IAP的设备外设功能初始化 定时器 校验器之类的) 然后进行收程序包的工作 确认收完或者超时或者达到某种条件进入第二步
2.用函数指针进行起始代码跳转 这个里面放完成实际功能的程序(叫他Fuc2),然后在这个完成实际功能的程序的开始进行中断向量表移位操作。
实操上的细节
重点是第二步的跳转
Fuc1中达到某种开发者认为可以跳到正常应用程序的条件时
一般利用函数指针跳转到Fuc2所在的地址Addr2(可以自定义,但是必须在代码区 以407vet为例在0x0800 0000~0x0807 FFFF内) 在烧写Fun2时 代码区起始地址配置成Addr2 这样跳转后就能从这个地址为起始地址开始跑正常代码。这两个数字加起来应该等于代码区最后一个字节的地址
跳转后Fun2的中断向量重定位
打开条件编译的开关 即取消83行的注释 修改95行的偏移地址量
搜索这个偏移量可以发现在SystemInit()中会对这个偏移地址进行偏移 调用NVIC_SetVector函数后,此后相应的向量跳转值都会发生偏移
这样fun2就可以正常跳转到它的ISR(中断服务程序)了。建议做一个函数将所有的IRQ进行偏移 调多个NVIC_SetVector(相应IRQ,)
这是在更新向量表的位置
把函数地址写入更新后的向量表 这里不用改 只是说明函数地址写到新的向量表中
完