请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32H743 跳转不成功

[复制链接]
小熊派 提问时间:2021-12-2 11:13 / 未解决
各位大神好,遇到一个奇怪的问题,我从APP跳转到bootloader不成功,但是bootloader升级没有问题,重新上电也可以运行,但是就是无法跳转成功,源代码如下,希望有人能解答下!

void JumpToBootloader(void)
{
        uint32_t i=0;
        void (*SysMemBootJump)(void);       // 申明一个函数指针
        __IO uint32_t BootAddr = 0x08000000; //boot地址

        __set_PRIMASK(1);        //关全局中断

        //关定时器
        SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

        //关闭所有中断,清除所有中断挂起标志
        HAL_RCC_DeInit();

        //
        for (i = 0; i < 8; i++)
        {
                NVIC->ICER=0xFFFFFFFF;
                NVIC->ICPR=0xFFFFFFFF;
        }       

        __set_PRIMASK(0);        //开全局中断

        // 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址
        SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));

        //设置主堆栈指针
        __set_MSP(*(uint32_t *)BootAddr);

        //在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针
        __set_CONTROL(0);

        //跳转到系统BootLoader
        SysMemBootJump();

        //跳转成功的话,不会执行到这里,用户可以在这里添加代码
        while (1)
        {

        }
}
收藏 评论4 发布时间:2021-12-2 11:13

举报

4个回答
废鱼 回答时间:2021-12-2 11:17:38

楼主您好。请问一下BOOT的程序编译时的起始地址是多少?和以下计算后的地址一样吗?建议这个地址和编译时配置的地址一样就行了。

* SysMemBootJump = (void ()(void)) (((uint32_t ) (BootAddr + 4)));

小熊派 回答时间:2021-12-2 14:44:42

废鱼 发表于 2021-12-2 11:17
楼主您好。请问一下BOOT的程序编译时的起始地址是多少?和以下计算后的地址一样吗?建议这个地址和编译 ...

[md]您好,bootloader地址和设置的跳转地址是一样的,断点之后重启可以正常重启,但是就是跳转不了。

废鱼 回答时间:2021-12-2 15:19:59

我看了一下,我写的APP跳转也是这样写的。我一般是直接软件复位进行进入boot的操作。楼主需要从应用程序跳转到boot程序时,需要先关闭所有的中断后,再跳转。另外,是否可以加一些打印看一下是否跳转到boot了,但是由于某些中断开启后,导致找不到中断入口,进入硬件错误中断了。

xmshao 回答时间:2021-12-2 16:46:06
你确认下,跳转前是否有中断使能没被关闭,中断标志记得清除干净。如果带OS的话,跳转前滴答的中断使能 也禁用掉.
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版