hyts3366 2025-02-26 15:23 采纳率: 40%
浏览 169
已结题

STM32bootloader跳转app失败

在STM32G474芯片上开发bootloader,遇到了从bootloader跳转app失败的问题,具体描述如下。

flash的写入已经通过crc校验和人肉检查,目前认为没什么问题。
跳转代码是从网上搜来的,看了下感觉大致没什么问题

void JumpToApp(void)
{
    uint32_t JumpAddress;
    pFunction JumpToApplication;

    if (((*(__IO uint32_t *)APP_START_ADDR) & 0x2FFE0000) == 0x20000000)
    {
        __disable_irq();
        SCB->VTOR = APP_START_ADDR;  // 设置应用程序的向量表地址
        __set_MSP(*(__IO uint32_t *)APP_START_ADDR);
        JumpAddress = *(__IO uint32_t *)(APP_START_ADDR + 4);
        JumpToApplication = (pFunction)JumpAddress;
        JumpToApplication();
    }
    else
    {
        Error_Handler();
    }
}

APP_START_ADDR为0x8010000
APP程序的keil设置

img


但是执行完跳转函数以后,我发现程序仍然在boot里运行,于是在执行跳转的地方打断点观察,发现JumpToApplication的值为
0x80001ed,这个值显然不合理,于是我分析应该是app的设置不对,在deepseek里搜索到的结果是要修改system_stm32g4xx.c里的VECT_TAB_OFFSET宏,修改为0x10000;修改完成后发现没有效果。
网上又搜到另一种方法,就是在STM32G4.sct文件中,将开头两段修改为

LR_IROM1 0x08010000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08010000 0x00080000  {  ; load address = execution address

修改后重复上述测试,发现JumpToApplication的值变为了0x80101ed,这个值似乎是正确的,但是跳转完成后,app并没有正常运行,这里我是通过观察can报文来进行判断,因为我的app程序会周期向can总线发送报文。我怀疑过是不是boot跳转前,没有进行反初始化步骤,于是加上了HAL_DeInit()函数,但是依旧不行。

现在我怀疑的重点还是app工程的设置,但是看了网上很多文章,都只是对魔术棒里的地址进行了设置,没有其他的步骤,想请教一下各位,问题是出在哪里?

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2025-02-26 15:23
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    STM32 bootloader 跳转 app 失败

    你遇到的问题是 STM32G474 芯片上的 bootloader 跳转 app 失败,已经检查了 flash 的写入没有问题。下面是一些可能的解决方案:

    1. 检查跳转代码:你从网上获取的跳转代码是否正确?是否有任何错误或不一致?可以尝试使用调试器来检查跳转代码的执行情况。
    2. 检查 app 的入口点:app 的入口点是否正确?是否在正确的地址上?可以尝试使用调试器来检查 app 的入口点。
    3. 检查 bootloader 的跳转机制:bootloader 是否正确地跳转到 app?可以尝试使用调试器来检查 bootloader 的跳转机制。
    4. 检查 flash 的写入:flash 的写入是否正确?是否有任何错误或不一致?可以尝试使用 flash 的写入工具来检查 flash 的写入。

    以下是一个简单的示例代码,用于从 bootloader 跳转到 app:

    void bootloader_jump_to_app(void) {
        // 设置栈指针
        __set_MSP(__get_MSP());
        // 跳转到 app 的入口点
        NVIC_SetVector(NVIC_IRQ_PRIORITY, app_entry_point);
    }
    

    其中,app_entry_point 是 app 的入口点,NVIC_IRQ_PRIORITY 是中断优先级。

    如果你已经检查了这些问题仍然无法解决问题,可以提供更多的信息和代码,我将尽力帮助你解决问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月26日
  • 已采纳回答 4月18日
  • 创建了问题 2月26日