5. 编写跳转IAP函数:
/**************************************************************************************************
函数: 运行IAP程序.
输入: 无
返回: 无.不再返回.
说明: 由于APP是在IAP的基础上运行的,因此,IAP一定是有效的,这里不再作IAP有效性检查.
**************************************************************************************************/
#define IAP_ADDR 0X08000000
void IapProgramRun(void)
{
INT32U IapSpInitVal; //IAP程序的SP初值.
INT32U IapJumpAddr; //IAP程序的跳转地址.即,IAP程序的入口.
void (*pIapFun)(void); //定义一个函数指针.用于指向APP程序入口.
NVIC_DeInit (); //恢复NVIC为复位状态.使中断不再发生.
IapSpInitVal = *(INT32U *)IAP_ADDR; //取APP的SP初值.
IapJumpAddr = *(INT32U *)(IAP_ADDR + 4); //取程序入口.
__MSR_MSP (IapSpInitVal); //设置SP.
pIapFun = (void (*)(void))IapJumpAddr; //生成跳转函数.
(*pIapFun) (); //跳转.不再返回.
}
6. 编写在一定条件下跳转IAP的部分。比如按下某个键,就跳到IAP去。
完成上述几步后,编译调试,用JLINK调试,可以直接运行的,跟你原来的工程应该没区别。有问题的话,将它解决。
第三步:制作您的IAP程序。
1. 将程序定位在0X08000000开始的位置。如果您的程序本来就是在这个位置
的,不用改了。
点魔术棒,打开目标选项设置。
选Target选项卡,IROM1改成从0X08000000开始,尺寸0X00010000;
Debug选项卡,Load Application at Startup打上勾,Run to main()打上勾;
Utilitiles选项卡,点settings按纽,弹出Flash download卡,Erase sectors
打上勾,点你的编程算法,将底下的的起始地址改成0X08000000,尺寸
0X00010000。
2. 为了从APP程序跳回来运行IAP的时候正常开始,初始化时要恢复RCC为
复位状态,恢复NVIC为复位状态。
在你的RCC初始化部分,第一句加上:
RCC_DeInit();
在你的NVIC初始化部分,第一句加上:
NVIC_DeInit ();
3. 重定位中断表到0X08000000位置。
在上面NVIC_DeInit ();后面加上:
NVIC_SetVectorTable (NVIC_VectTab_FLASH, 0x0);