1,通过USART1 串口IAP,跳转程序一定不能放在中断中执行。可在主循环中轮询中断中改变的一个全局变量,满足条件后执行跳转;否则跳转用户APP后会出现部分执行,或者不执行现象;
2,重定向fput后,利用printf函数输出提示字符串时,会出现遗漏,乱码现象。可用DMA批量发送。这种方式不能使用printf函数的格式设定字符;
3,bootloader程序中,跳转前需初始化所有外设,关闭中断调度,推荐逐个关闭使用的中断
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
HAL_DeInit(); //Ç¿ÖƸ´Î»ËùÓÐÍâÉè
__disable_irq(); //×è¶ÏÖжϵ÷ÓÃ
HAL_NVIC_DisableIRQ(USART1_IRQn);
HAL_NVIC_DisableIRQ(DMA2_Stream7_IRQn);
HAL_NVIC_DisableIRQ(TIM2_IRQn);
HAL_NVIC_DisableIRQ(TIM3_IRQn);
HAL_NVIC_DisableIRQ(SysTick_IRQn);
/* execute the new program */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
/* Jump to user application */
JumpToApplication = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
JumpToApplication();
while(1);
}
4,在用户APP的开头,需设置中断向量表基地址,注意需先关后开中断调度