你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

IAP程序编写遇到问题,从IAP能跳转到APP,但是只能运行大约2秒,又回到IAP程序了

[复制链接]
genys 提问时间:2013-10-10 10:07 /
从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,谢谢!
收藏 评论5 发布时间:2013-10-10 10:07

举报

5个回答
genys 回答时间:2013-10-10 10:12:01

问题描述

同样的程序(8010000开始的APP),从APP跳转回IAP是没有问题的:
代码:
#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) ();                                  //跳转.不再返回.
}
genys 回答时间:2013-10-10 10:44:46

现象:从APP跳转到IAP,好象也是经过了重启的过程

发现从IAP到APP执行程序速度明显快过从APP跳转到IAP的执行速度,看样子,从APP跳转到IAP,好象也是经过了重启的过程
废鱼 回答时间:2013-10-10 14:22:55

RE:IAP程序编写遇到问题,从IAP能跳转到APP,但是只能运行大约2秒,又回到IAP程序了

(*pIapFun) (); //跳转.不再返回.
改为pIapFun(); //跳转.不再返回.
这样应该就可以了。我的IAP是这样跑的。
mxj1005071012 回答时间:2013-10-11 00:02:00

RE:IAP程序编写遇到问题,从IAP能跳转到APP,但是只能运行大约2秒,又回到IAP程序了

自动跳回的话,说明你的程序设计不对吧,应该是某个语句使程序执行又回到IAP了,你可以试试管理员安的方法,把*pIapFun) ();改为pIapFun();
genys 回答时间:2013-10-12 15:30:03

RE:IAP程序编写遇到问题,从IAP能跳转到APP,但是只能运行大约2秒,又回到IAP程序了

好的,谢谢两位,我回去测试一番.

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版