久芯网

STM32H743 跳转不成功

avatar 小熊派 提问时间: 2023-08-16 18:56:18 / 未解决
各位大神好,遇到一个奇怪的问题,我从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)
        {

        }
}

如需获得 STM32H743 等器件的更多信息,请点击链接或 点击此处 联系在线客服!

4个回答
  • avatar 废鱼
    回答时间: 2023-08-16 19:14:14

    楼主您好。请问一下BOOT的程序编译时的起始地址是多少?和以下计算后的地址一样吗?建议这个地址和编译时配置的地址一样就行了。 * SysMemBootJump = (void ()(void)) (((uint32_t ) (BootAddr + 4)));

  • avatar 小熊派
    回答时间: 2023-08-16 19:39:30
    废鱼 发表于 2021-12-2 11:17
    楼主您好。请问一下BOOT的程序编译时的起始地址是多少?和以下计算后的地址一样吗?建议这个地址和编译 ...

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

  • avatar 废鱼
    回答时间: 2023-08-16 19:57:27

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

  • avatar xmshao
    回答时间: 2023-08-16 20:22:32

    你确认下,跳转前是否有中断使能没被关闭,中断标志记得清除干净。如果带OS的话,跳转前滴答的中断使能 也禁用掉.

会员中心 微信客服
客服
回到顶部