使用第一版boot和app跳转的时候是很顺利的,没有出现问题,后面改了app的代码后,出现boot不能跳转到app,原因是STM32L4有两段IRAM,boot跳转的时候需要判断是否在这两段RAM内
因此boot跳转的代码如下:
void GoToApp(void)
{
u8 i;
u32 ram;
/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
ram = ((*(__IO uint32_t*)APPLICATION_ADDRESS));
if(((ram >= 0X20000000) && (ram < (0X20000000 + 0x40000))) \
|| ((ram >= 0X10000000) && (ram < (0X10000000 + 0x10000))))
{
/* 关闭全局中断 */
DISABLE_INT();
/* 关闭滴答定时器,复位到默认值 */
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
/* 关闭所有中断,清除所有中断挂起标志 */
for (i = 0; i < 8; i++)
{
NVIC->ICER[i]=0xFFFFFFFF;
NVIC->ICPR[i]=0xFFFFFFFF;
}
/* 使能全局中断 */
ENABLE_INT();
/* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
/* 设置主堆栈指针 */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
/* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
__set_CONTROL(0);
/* Jump to user application */
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
Jump_To_Application();
}
}