从IAP跳转到APP的代码: #define APP_ADDR 0X08010000 u16 AppProgramRun(void)//run in application program { vu32 AppSpInitVal; //App程序的SP初值. vu32 AppJumpAddr; //APP程序的跳转地址.即,APP程序的入口. void (*pAppFun)(void); //定义一个函数指针.用于指向APP程序入口. AppSpInitVal = *(vu32 *)APP_ADDR; //取APP的SP初值. AppJumpAddr = *(vu32 *)(APP_ADDR + 4); //取程序入口. IWDG_ReloadCounter(); NVIC_DeInit (); //恢复NVIC为复位状态.使中断不再发生. __MSR_MSP (AppSpInitVal); //设置SP. 问题点就在这里 pAppFun = (void (*)(void))AppJumpAddr; //生成跳转函数. (*pAppFun) (); //跳转.不再返回. return (0x0); } 问题:如果设置了" __MSR_MSP (AppSpInitVal); //设置SP.,则跳转过去大约2秒就又回到IAP程序了;而不操作这个SP,则可以正常运行,实际上就是在IAP与APP同时运作,SP堆栈占用了IAP运行中的,觉得有点浪费,想进入APP后,程序自己重新建立新的堆栈,利用率更高点,网上也是这样操作的,可我的为什么就不能重新设置SP堆栈呢? 还请大师们给指点12,谢谢! |
问题描述
代码:
#define IAP_ADDR 0X08000000
void IapProgramRun(void)//run in iap program
{
vu32 IapSpInitVal; //IAP程序的SP初值.
vu32 IapJumpAddr; //IAP程序的跳转地址.即,IAP程序的入口.
void (*pIapFun)(void); //定义一个函数指针.用于指向APP程序入口.
NVIC_DeInit(); //恢复NVIC为复位状态.使中断不再发生.
IapSpInitVal = *(vu32 *)IAP_ADDR; //取APP的SP初值.
IapJumpAddr = *(vu32 *)(IAP_ADDR + 4); //取程序入口.
__MSR_MSP(IapSpInitVal); //设置SP.
pIapFun = (void (*)(void))IapJumpAddr; //生成跳转函数.
(*pIapFun) (); //跳转.不再返回.
}
现象:从APP跳转到IAP,好象也是经过了重启的过程
RE:IAP程序编写遇到问题,从IAP能跳转到APP,但是只能运行大约2秒,又回到IAP程序了
改为pIapFun(); //跳转.不再返回.
这样应该就可以了。我的IAP是这样跑的。
RE:IAP程序编写遇到问题,从IAP能跳转到APP,但是只能运行大约2秒,又回到IAP程序了
RE:IAP程序编写遇到问题,从IAP能跳转到APP,但是只能运行大约2秒,又回到IAP程序了