STM32
直播中

凤毛麟角

8年用户 918经验值
私信 关注
[问答]

stm32H725IGTX设计两个APP,APP1与APP2之间为什么不能跳转?

跳转函数如下,实际跳转不了,请问各位大侠问题出在哪儿,多谢

#define APP_A_RELOCAtiON_ADDRESS                0x08000000
#define APP_B_RELOCATION_ADDRESS                0x08080000

void jump_app_task(uint8_t ABZone)
{
    uint32_t i=0;
    __IO uint32_t AppAddress = 0;
    void (*SysMemBootJump)(void);        /* 声明一个函数指针 */


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



/* 关闭滴答定时器,复位到默认值*/
    SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;
    /* 设置所有时钟到默认状态,使用HSI时钟 */
    HAL_RCC_DeInit();
    /* 关闭所有中断,清除所有中断挂起标志 */
    for (i = 0; i < 8; i++)
    {
        NVIC->ICER[i]=0xFFFFFFFF;
        NVIC->ICPR[i]=0xFFFFFFFF;
    }
    SCB_DisableDCache();
    /* 使能全局中断 */
    __set_PRIMASK(0);

[i][i]    if(ABZone == 0xaa)
    {
        /* 跳转到appA,首地址是MSP,地址+4是复位中断服务程序地址*/
        SysMemBootJump = (void (*)(void)) (*((uint32_t *) (APP_A_RELOCATION_ADDRESS + 4)));
        AppAddress = APP_A_RELOCATION_ADDRESS;
    }
    else
    {
        /* 跳转到appB,首地址是MSP,地址+4是复位中断服务程序地址*/
        SysMemBootJump = (void (*)(void)) (*((uint32_t *) (APP_B_RELOCATION_ADDRESS + 4)));
        AppAddress = APP_B_RELOCATION_ADDRESS;
    }


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


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


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

   }



}


回帖(2)

刘飞

2024-3-18 10:46:53
默认不都是0x08000000执行,你这个那不是相当于可以应用和Boot来回跳转?重启机制是什么?
举报

丁冬芹

2024-3-18 16:45:46
在使用跳转函数时,通常需要注意以下几点来确保能够跳转到目标APP:

1. 确保目标APP的代码已经正确烧录到相应的地址。在这里,你需要确认APP1和APP2的代码确实烧录到了0x08000000和0x08080000地址处。

2. 确保跳转函数被正确调用。你可以通过在调用跳转函数前添加调试输出或断点来确认是否执行了跳转函数。

3. 确保目标APP的程序入口地址正确。你需要确认APP1和APP2的程序入口地址是否正确,通常为Reset_Handler函数。

另外,如果你使用的是RTOS,并且APP1和APP2是两个独立的任务,你可能需要注意中断和任务切换的相关问题。确保跳转函数可以正确地切换中断和任务上下文。

如果以上步骤都没有问题,但跳转仍然不能成功,那可能是由于其他原因导致的,比如硬件配置不匹配、内存访问冲突等。这种情况下,你可能需要进一步排查这些原因并进行调试。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分