BOOT 跳转程序APP ,没有使用MCUboot,使用简单的boot + app APP地址 0x20000,调试软件keil ,单独调试boot 和 app 都运行正常 , 如下图所示:
void iap_drv_jump_to(uint32_t jump_addr){ uint32_t JumpAddress = jump_addr; iap_mcu_deal(0); SCB->VTOR = jump_addr; __set_MSP(*(uint32_t *)jump_addr); JumpAddress = *(__IO uint32_t*) (jump_addr + 4); jump_to_func = (pfunc) JumpAddress; R_MPU_SPMON->SP[0].CTL = 0; jump_to_func();}
boot sct文件配置:
#define RAM_START 0x1FFE0000 #define RAM_LENGTH 0x60000 #define FLASH_START 0x00000000 #define FLASH_LENGTH 0x020000 #define DATA_FLASH_START 0x40100000 #define DATA_FLASH_LENGTH 0x8000 #define OPTION_SETTING_START 0x00000000 #define OPTION_SETTING_LENGTH 0x0 #define OPTION_SETTING_S_START 0x00000000 #define OPTION_SETTING_S_LENGTH 0x0 #define ID_CODE_START 0x0100A150 #define ID_CODE_LENGTH 0x10 #define SDRAM_START 0x90000000 #define SDRAM_LENGTH 0x8000000 #define QSPI_FLASH_START 0x60000000 #define QSPI_FLASH_LENGTH 0x4000000 #define OSPI_DEVICE_0_START 0x68000000 #define OSPI_DEVICE_0_LENGTH 0x0 #define OSPI_DEVICE_1_START 0x70000000 #define OSPI_DEVICE_1_LENGTH 0x0
APP层 sct文件配置
#define RAM_START 0x1FFE0000 #define RAM_LENGTH 0x60000 #define FLASH_START 0x00020000 #define FLASH_LENGTH 0x0E0000 #define DATA_FLASH_START 0x40100000 #define DATA_FLASH_LENGTH 0x8000 #define OPTION_SETTING_START 0x00000000 #define OPTION_SETTING_LENGTH 0x0 #define OPTION_SETTING_S_START 0x00000000 #define OPTION_SETTING_S_LENGTH 0x0 #define ID_CODE_START 0x0100A150 #define ID_CODE_LENGTH 0x10 #define SDRAM_START 0x90000000 #define SDRAM_LENGTH 0x8000000 #define QSPI_FLASH_START 0x60000000 #define QSPI_FLASH_LENGTH 0x4000000 #define OSPI_DEVICE_0_START 0x68000000 #define OSPI_DEVICE_0_LENGTH 0x0 #define OSPI_DEVICE_1_START 0x70000000 #define OSPI_DEVICE_1_LENGTH 0x0
从BOOT层 跳转到APP层后,进入NMI中断,中断值显示 0x1000,查看数据手册,显示
请各位大神帮助一下,帮忙看看什么问题。或者有keil 平台 RA6M2 boot / APP 例程的麻烦发一下到邮箱76430739@qq.com ,非常感谢。
先设置SP[0].CTL, 检查一下要跳转工程的MSP 和MPSLIM, 然后增加一句__set_MSPLIM,
SCB->VTOR = jump_addr;
R_MPU_SPMON->SP[0].CTL = 0; __set_MSP(*(uint32_t *)jump_addr);
__set_MSPLIM(*(uint32_t *)jump_addr); //正确设置MSPLIM