1. Bootloader代码中打开了一些中断,例如定时器、systick、串口、外部中断等中断,跳转到App后,会出现一些莫名的App死机问题,例如:
(1)改变bootloader的编译等级,不优化后,有时候App就不死机,原因:不优化bootloader代码跑得较快,systick中断跑在SCB->VTOR = APPLICATION_ADDRESS之前执行,这样也没问题。
(2)在SCB->VTOR = APPLICATION_ADDRESS;增加__ISB(); __DSB();有时App也不会死机。
2. 本实验中在bootloader中打开了systick定时器,所以此处关闭systick的运行,也就不会在再次使能前产生中断。
3. 实际代码
3.1 Bootloader部分
void Run_App(void)
{
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */HAL_TIM_Base_MspDeInit(&htim3); //关闭App中没使用外设/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
// if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000){
/* Jump to user application */JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);Jump_To_Application = (pFunction) JumpAddress;/* Initialize user application's Stack Pointer */__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);/* Jump to application */Jump_To_Application();}
}
3.2 App部分
int main(void)
{
SCB->VTOR = APPLICATION_ADDRESS;
//以下为其他代码
}