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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版