用stm32f407zgt6编写bootloader时,从bootloader跳转到app无法跳转
bootloodar编写中程序里面没有中断,但依然按要求关闭了中断进行跳转,在网上复制的跳转代码,多数可以成功编译但是不能成功跳转,查资料f407zgt6中一个内存扇区为4000,第一段程序的内存扇区首地址0x8000000大小为0x4000。
第二段程序首地址为0x8004000大小为0xFC000。第二段中断向量首地址已经进行了重定向重定向时修改的程序如下
void SystemInit(void)
{
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
/* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
SCB->VTOR = (FLASH_BASE+0x4000)| VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
}
怀疑时跳转程序有问题在网上找了好几个跳转程序都不能成功跳转
#define APP_ADDR 0x08004000
void MSR_MSP(uint32_t addr)
{
__ASM volatile("MSR MSP, r0");
__ASM volatile("BX r14");
}
typedef void (*Jump_Fun)(void);
void IAP_ExecuteApp(uint32_t App_Addr)
{
Jump_Fun JumpToApp;
if (((*(__IO uint32_t *)App_Addr) & 0x2FFE0000) == 0x20000000)
{
JumpToApp = (Jump_Fun) * (__IO uint32_t *)(App_Addr + 4);
MSR_MSP( * (__IO uint32_t *) App_Addr);
JumpToApp();
}
else
{
}
}
仿真debug的时候没有看到过跳转到0x8004000
运行时没有报错只是跳转失败对汇编原理不太理解,希望有师傅能提供指导
付费悬赏帮忙跳转程序微信红包感谢