完善资料让更多小伙伴认识你,还能领取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();
|
|
|
|
好的,谢谢两位,我回去测试一番.
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
自定义系统时钟频率后,用库函数和微带两种方式点亮LED灯,为什么灯的闪烁频率不一致?
793 浏览 2 评论
991 浏览 2 评论
1975 浏览 0 评论
【嵌入式SD NAND】基于FATFS/Littlefs文件系统的日志框架实现
704 浏览 0 评论
求助!STM32F4单片机编程与设计sEMG信号采集电路问题
878 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-3-29 23:30 , Processed in 0.610278 second(s), Total 74, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 深圳华秋电子有限公司
电子发烧友 (电路图) 粤公网安备 44030402000349 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号