目前我正在从事 i.MXRT1064 的引导加载程序开发活动,我从文件系统接收到新固件映像并写入内部闪存。写入新的固件映像后,我想从自定义引导加载程序跳转到应用程序,自定义引导加载程序的地址范围从 0x70000000 到 0x70080400,其余地址空间分配给应用程序。我已经参考了 mcuboot_opensource 的 SDK 源代码,并且从这个 SDK 示例中跳转至应用程序代码,在那里我更新了 ivt,禁用了矢量并尝试执行跳转,但不幸的是它没有发生。请参考我的以下跳转到应用程序代码。
#define APP_VECTOR_TABLE_ADDRESS 0x70080400
#define STACK_POINTER_SIZE 0x20001FFFUL
struct arm_vector_table
{
uint32_t msp;
uint32_t 重置;
};
//!@brief 退出引导加载程序并跳转到用户应用程序。
void jump_to_applica
tion(void)
{
/*LED*/
gpio_pin_config_t led_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
GPIO_PinInit(GPIO3, 4U, &led_config);
GPIO_PinWrite(GPIO3, 4U, 1U); // 第 6 个 LED //
/*LED*/
//跳转实现//
PRINTF("n开始跳转过程n");
__asm 易失性(“cpsid i”);
SCB_DisableDCache();
vt = (struct arm_vector_table *)(APP_VECTOR_TABLE_ADDRESS);
vt->msp = STACK_POINTER_SIZE;
//清理();
SCB_DisableICache();
SCB_DisableDCache();
ARM_MPU_Disable();
DbgConsole_Deinit();
//bspstop();
for (long delay = 0; delay < 1000000; delay++)
{
// 什么都不做..
for (long delay1 = 0; delay1 < 1000; delay1++)
{
// 什么都不做..
}
}
//!<实验部分>
//PRINTF("nVTOR 初始化之前n");
// 将 VTOR 设置为应用程序向量表地址。
//SCB->VTOR = (uint32_t *)(0x70080400);
//!<实验部分>
__set_CONTROL(0);
__set_MSP(vt->msp);
__为B();
((void (*)(void))vt->reset)();
// 永远不应打印此语句//
PRINTF("nJUMP SUCCESSFULn");
//跳转实现 - END//
//引导加载程序结束 //
}
请找到随附的应用程序的十六进制文件快照以供参考。请让我知道,我在代码中遗漏了什么,并给我跳转的解决方案。