在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设置

但是执行完跳转函数以后,我发现程序仍然在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工程的设置,但是看了网上很多文章,都只是对魔术棒里的地址进行了设置,没有其他的步骤,想请教一下各位,问题是出在哪里?