bootloader无法跳转问题

在gd32e230c上进行bootloader跳转到应用程序时,发现加入__set_MSP( * ( __IO uint32_t * ) App_Addr );这句初始堆栈地址时,就无法跳转了,去掉这句话就可以正常跳转到app,实在想不明白怎么回事。

void IAP_ExecuteApp (uint32_t App_Addr)
{
                uint32_t JumpAddress;
         usart_disable(USART0);

        JumpAddress = * ( __IO uint32_t * )(App_Addr + 4);//用户代码区第二个字为程序开始地址(复位地址)        
//        __set_MSP( * ( __IO uint32_t * ) App_Addr );    //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
        (*( void (*)( ) )JumpAddress) ();                //跳转到APP.

}

这里的问题可能与应用程序的堆栈初始化有关。

在 ARM Cortex-M 架构中,应用程序启动时需要进行堆栈初始化。堆栈指针 MSP (Main Stack Pointer) 是一个指向堆栈顶部的寄存器,用于管理堆栈内存。在应用程序启动时,需要设置 MSP 的值以指向正确的堆栈区域。通常情况下,MSP 的值应该是用户代码区的第一个字,即存储栈顶地址的位置。

在你提供的代码中,应用程序的堆栈指针初始化的代码被注释掉了。因此,在应用程序中的堆栈指针可能没有正确初始化,导致跳转失败。

如果去掉 __set_MSP( * ( __IO uint32_t * ) App_Addr ); 这句话后,应用程序可以正常跳转,则说明在应用程序中堆栈指针已经被正确初始化。此时,不需要再执行初始化堆栈指针的代码。

建议在应用程序中确保堆栈指针正确初始化后再跳转到应用程序。如果堆栈指针未正确初始化,则应用程序可能无法正常运行,或者发生异常和错误。