完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
从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个回答
|
|
同样的程序(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) (); //跳转.不再返回. } |
|
|
|
发现从IAP到APP执行程序速度明显快过从APP跳转到IAP的执行速度,看样子,从APP跳转到IAP,好象也是经过了重启的过程
|
|
|
|
|
|
|
|
自动跳回的话,说明你的程序设计不对吧,应该是某个语句使程序执行又回到IAP了,你可以试试管理员安的方法,把*pIapFun) ();改为pIapFun();
|
|
|
|
好的,谢谢两位,我回去测试一番.
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
238 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
734 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1128 浏览 1 评论
LL库F030进行3个串口收发,2个串口为232,一个为485,长时间后,会出现串口1停止运行,另外两个正常,只有重启复原
1600 浏览 1 评论
538 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-9 03:33 , Processed in 0.684414 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号