4. 编写在一定条件下跳转APP的部分。比如按下某个键,就跳到APP去。
5. 编写跳转APP函数:
#define APP_ADDR 0X08010000
OP_RESULT AppProgramRun(void)
{
INT32U AppSpInitVal; //App程序的SP初值.
INT32U AppJumpAddr; //APP程序的跳转地址.即,APP程序的入口.
void (*pAppFun)(void); //定义一个函数指针.用于指向APP程序入口.
AppSpInitVal = *(INT32U *)APP_ADDR; //取APP的SP初值.
if (AppSpInitVal & 0XFFFF 0000 != 0X20 00 00 00) //APP未写入.不能跳.
{
FaceEnterDialog (&OpFailDialog);
return OP_FAIL;
}
AppJumpAddr = *(INT32U *)(APP_ADDR + 4); //取程序入口.
if ((AppJumpAddr & 0X FF F8 00 00) != 0X 08 00 00 00) //APP无效.不能跳.
{
FaceEnterDialog (&OpFailDialog);
return OP_FAIL;
}
NVIC_DeInit (); //恢复NVIC为复位状态.使中断不再发生.
__MSR_MSP (AppSpInitVal); //设置SP.
pAppFun = (void (*)(void))AppJumpAddr; //生成跳转函数.
(*pAppFun) (); //跳转.不再返回.
return OP_SUCCESS;
}
完成上述几步后,编译调试,OK。
第四步:双程序调试:
1. 用仿真器运行IAP程序,然后按下按键,转到APP去。如果你正常转
到APP,说明成功。不能的话,用仿真器跟一下,把问题解决。
2. 用仿真器运行APP程序,然后按下按键,转到IAP去。如果你正常转
到IAP,说明成功。不能的话,用仿真器跟一下,把问题解决。
3. 用仿真器运行IAP程序,然后按下按键,转到APP。
在APP中又按下按键,转回IAP。如此反复。
可以在IAP第一句设个断点,每次转回来的时候,都应该会停在那里
的。
注意:在跳到另一个程序中运行的时候,要停止不能直接点“停止调试按
纽”,就是那个放大镜一样的按纽,否则MDK立马出错退出。要停止的
话,要先打开反汇编观察窗口,然后按下“停止”按纽,就是左上角红圆圈
里一把叉那个,
再按下“停止调试按纽”。
第五步:在IAP中加载APP。
如果你的板子上没有USB,或都SD卡,这后面的就做不了了。