打印
[STM32F0]

iap和和app跳转问题

[复制链接]
5786|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fvcvxvcv|  楼主 | 2014-7-11 14:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
                  /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
                        if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
                        {
                                /* Jump to user application */
                                JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
                                Jump_To_Application = (pFunction) JumpAddress;
                               
                                /* Initialize user application's Stack Pointer */
                                __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
                               
                                /* Jump to application */
                                Jump_To_Application();
                        }
    }
上面是iap跳转到app的代码,经过验证APPLICATION_ADDRES 是iap或app的首地址的话 比如(iap 程序首地址是0x8000000,app首地址是0x8003000),都可以相互跳转到复位地址执行,但是我改成JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS );APPLICATION_ADDRESS  是我固定的一个函数的地址,这样执行总是失败,失败就进入中断的错误函数里void HardFault_Handler(void),
请问大侠们 怎么能跳转到函数的地址呀,实现直接绝对跳转到函数地址执行函数, 是不是我的堆栈的设置有问题?
沙发
STARM| | 2014-7-11 14:21 | 只看该作者
JumpAddress = APPLICATION_ADDRESS;

使用特权

评论回复
板凳
fvcvxvcv|  楼主 | 2014-7-11 14:41 | 只看该作者
STARM 发表于 2014-7-11 14:21
JumpAddress = APPLICATION_ADDRESS;

试了,也不行呀。我把一个函数的地址固定成0x8001000,
#define APPLICATION_ADDRESS (u32)0x08001000

不知道为什么不能跳转到函数执行,但是跳转到 0x8000000+4复位地址却可以,

这个跟堆栈的设置__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);有关系吗?这句话是不是只是定义了堆栈指针的位置,是不是还需要清空堆栈??但是我没找到情况堆栈的指令

要不就是地址对齐问题??

最后进去void HardFault_Handler(void)  

不知道是啥问题呀!!求助

使用特权

评论回复
地板
STARM| | 2014-7-11 15:47 | 只看该作者
#define APPLICATION_ADDRESS (u32)(0x08001000+1)

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
fvcvxvcv + 1 很给力!
5
fvcvxvcv|  楼主 | 2014-7-14 14:17 | 只看该作者
STARM 发表于 2014-7-11 15:47
#define APPLICATION_ADDRESS (u32)(0x08001000+1)

大神,前两天休息,
按照你指点的两条确实可以跳转到函数并且往下执行了,
有一点没弄明白,如果不+1,可以跳到函数处,但是无法向下进行,+1后可以跳到函数处,并且往下执行,这是为什么呢?+1是什么道理??

iap调了好几天了,我从app 跳到iap的某一函数处后,就会莫名其妙的出现很多问题,不知道跳转到函数地址后还要不要进行什么操作,以避免莫名其妙的问题?如果直接运行iap都是正常,就是跳转到iap的某函数开始运行就出现莫名其妙的问题

跳回后我再初始化一次串口,就会出现idle无法置位的问题,这样,串口发送就只能发一次,就无法工作了

然后我干脆不初始化串口了,串口可以工作,但是 程序运行到写flash的时候就会崩溃,大神帮分析一下,这是咋回事,这程序调了好久 我都要疯了,!!

使用特权

评论回复
6
STARM| | 2014-7-14 20:22 | 只看该作者
>> +1是什么道理??

STM32F0 使用 Thumb2 指令集,  要用 Thumb 模式跳转

define APPLICATION_ADDRESS (u32)(0x08001000+1)

/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
Jump_To_Application = (pFunction) JumpAddress; // APPLICATION_ADDRESS
                                
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
                                
/* Jump to application */
Jump_To_Application(); -- 这里生成类似 BLX R0 形式的指令

其中 R0 的Bit[0] 将复制到 CPSR 的标志位 T

如果R0 中的第0 位为1,处理器将执行Thumb 指令
如果R0 中的第0 位为0,执行ARM 指令。

因为STM32一直使用 Thumb 指令, 所以必须是跳转地址的最低位为 1, 从而执行Thumb 指令





使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
fvcvxvcv + 1 赞一个!
7
fvcvxvcv|  楼主 | 2014-7-15 09:28 | 只看该作者
STARM 发表于 2014-7-14 20:22
>> +1是什么道理??

STM32F0 使用 Thumb2 指令集,  要用 Thumb 模式跳转

多谢指点!
是不是就是 r0 的bit[0] 一直存放的是ARM指令或 Thumb 指令的标志位,所以是从bit[1].开始执行。

要不是你告诉我 怎么我也想不+1 估计我就永远卡死在这里了。太感谢了

使用特权

评论回复
8
liyongyong| | 2016-1-18 14:36 | 只看该作者
fvcvxvcv 发表于 2014-7-15 09:28
多谢指点!
是不是就是 r0 的bit[0] 一直存放的是ARM指令或 Thumb 指令的标志位,所以是从bit[1].开始执 ...

您好 ,请问您这个函数,跳到APP后 ,通过什么方式跳回到 主函数的?
appEntry = (void (*)(void)) (0x11810720);
(*appEntry)( );//在此跳入到APP

jump_back();怎么跳回到主函数 ,这个位置呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝