找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3270|回复: 8
打印 上一主题 下一主题
收起左侧

请教一个关于STM32f1的IAP跳转的问题

[复制链接]
跳转到指定楼层
楼主
ID:246215 发表于 2019-8-21 11:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
昨天因为是flash读写问题,c8t6每页只有1k,最后搞定了,但是又卡在了jump2app();                                                                        //跳转到APP.这个跳转函数,打断点调试发现一到这就进HardFault_Handler硬件错误循环,我把flash的app程序读出来也没有错误,中断向量也在app里边设置了,但还是进不去,能不能请大哥指点一番,谢谢啦
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:246215 发表于 2019-8-21 11:43 | 只看该作者
现在我发现一个问题 jump2app=(iapfun)*(vu32*)(appxaddr+4);                //用户代码区第二个字为程序开始地址(复位地址)         usb_printf("jump:%x",jump2app);         程序地址设置的0x08009500        ,但是这个语句后边出来就是0x080001cd这是不是就是出错的地方呢,函数指针指错了,这才导致硬件错误循环
回复

使用道具 举报

板凳
ID:246215 发表于 2019-8-21 11:45 | 只看该作者
typedef  void (*iapfun)(void);                                //定义一个函数类型的参数.
iapfun jump2app;
跳转函数是原子哥的,为什么在将用户地址转换成跳转函数指针地址就变了,头疼,我觉得大概率是这个原因
回复

使用道具 举报

地板
ID:138097 发表于 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是你跳转的地址
回复

使用道具 举报

5#
ID:246215 发表于 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();关闭了中断和外设时钟,还是不行
回复

使用道具 举报

6#
ID:138097 发表于 2019-8-22 13:04 | 只看该作者
Anger 发表于 2019-8-22 11:54
对的,就是跳转不了,执行完jump2app()就进硬件错误循环了,跳转之前通过__set_PRIMASK(1) 和RCC_DeIni ...

你先要确定一个问题,到底是跳转不了,还是跳转了,但是运行不了,我当时做过,也是会死在这里,最后验证时因为跳转成功了,但是目标地址的程序运行不了
回复

使用道具 举报

7#
ID:458649 发表于 2020-2-6 16:06 | 只看该作者
请问楼主解决了吗,遇到同样问题
回复

使用道具 举报

8#
ID:139994 发表于 2024-1-24 17:16 | 只看该作者
我刚遇到类似问题,把MSR_MSP(*(vu32*)appxaddr);改为__set_MSP(*(volatile unsigned int*) appxaddr);后可以跳转了。原因未知,后面的函数一般用到F4上面,我的GD32A503没有MSR_MSP函数,自己在启动函数中加了汇编还是不行,换成后面的函数就行。有哪个大佬给讲一下,不胜感激!
回复

使用道具 举报

9#
ID:1110056 发表于 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();         }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表