标题: 请教一个关于STM32f1的IAP跳转的问题 [打印本页]

作者: Anger    时间: 2019-8-21 11:42
标题: 请教一个关于STM32f1的IAP跳转的问题
昨天因为是flash读写问题,c8t6每页只有1k,最后搞定了,但是又卡在了jump2app();                                                                        //跳转到APP.这个跳转函数,打断点调试发现一到这就进HardFault_Handler硬件错误循环,我把flash的app程序读出来也没有错误,中断向量也在app里边设置了,但还是进不去,能不能请大哥指点一番,谢谢啦

作者: Anger    时间: 2019-8-21 11:43
现在我发现一个问题 jump2app=(iapfun)*(vu32*)(appxaddr+4);                //用户代码区第二个字为程序开始地址(复位地址)         usb_printf("jump:%x",jump2app);         程序地址设置的0x08009500        ,但是这个语句后边出来就是0x080001cd这是不是就是出错的地方呢,函数指针指错了,这才导致硬件错误循环
作者: Anger    时间: 2019-8-21 11:45
typedef  void (*iapfun)(void);                                //定义一个函数类型的参数.
iapfun jump2app;
跳转函数是原子哥的,为什么在将用户地址转换成跳转函数指针地址就变了,头疼,我觉得大概率是这个原因
作者: whx.000    时间: 2019-8-22 08:16
BOOTLoader跳转吗
iapfun jump2app;
        if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)        //检查栈顶地址是否合法.
        {
                jump2app=(iapfun)*(vu32*)(appxaddr+4);                //用户代码区第二个字为程序开始地址(复位地址)               
                MSR_MSP(*(vu32*)appxaddr);                                        //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
                jump2app();                                                                        //跳转到APP.
        }
appxaddr是你跳转的地址
作者: Anger    时间: 2019-8-22 11:54
whx.000 发表于 2019-8-22 08:16
BOOTLoader跳转吗
iapfun jump2app;
        if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)        //检查栈顶地址 ...

对的,就是跳转不了,执行完jump2app()就进硬件错误循环了,跳转之前通过__set_PRIMASK(1) 和RCC_DeInit();关闭了中断和外设时钟,还是不行
作者: whx.000    时间: 2019-8-22 13:04
Anger 发表于 2019-8-22 11:54
对的,就是跳转不了,执行完jump2app()就进硬件错误循环了,跳转之前通过__set_PRIMASK(1) 和RCC_DeIni ...

你先要确定一个问题,到底是跳转不了,还是跳转了,但是运行不了,我当时做过,也是会死在这里,最后验证时因为跳转成功了,但是目标地址的程序运行不了
作者: zhufeiyu    时间: 2020-2-6 16:06
请问楼主解决了吗,遇到同样问题
作者: duanzhiruorou    时间: 2024-1-24 17:16
我刚遇到类似问题,把MSR_MSP(*(vu32*)appxaddr);改为__set_MSP(*(volatile unsigned int*) appxaddr);后可以跳转了。原因未知,后面的函数一般用到F4上面,我的GD32A503没有MSR_MSP函数,自己在启动函数中加了汇编还是不行,换成后面的函数就行。有哪个大佬给讲一下,不胜感激!
作者: kekehuizi    时间: 2024-1-24 18:31
if(((*(__IO uint32_t*)address + 0x8000) & 0xFFFC0000 ) == 0x20000000)         {                 uint32_t JumpAddress = *(__IO uint32_t*)(address + 4);                 pFunc Jump_To_Application = (pFunc)JumpAddress;                 __set_MSP(*(__IO uint32_t*) address);                 Jump_To_Application();         }




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1