导致该问题可能存在的原因:
-
BootLoader使用的中断,跳转APP前未关闭,APP启动后中断异常,需要逐个将中断关闭 HAL_NVIC_DisableIRQ(USART1_IRQn);
HAL_NVIC_DisableIRQ(SysTick_IRQn);
HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn);
HAL_NVIC_DisableIRQ(TIM5_IRQn);
-
BootLoader使用了APP没有使用到的外设,跳转APP前未DeInit,APP启动后出现异常,需要逐个将使用到的资源DeInit HAL_UART_DeInit(&UART1_Handler);
HAL_SPI_DeInit(&SPI1_Handler);
HAL_FDCAN_DeInit(&FDCAN1_Handler);
HAL_TIM_Base_DeInit(&TIM5_Handler);
-
未设置中断向量表,APP启动后出现异常,需再APP中设置中断向量表即可 SCB->VTOR = D1_AXISRAM_BASE|0X2407FC00;//中断向量表放在Ram
1、2需要将中断和资源逐个关闭和DeInit,容易漏掉出错,So~ BootLoader跳转APP之前,首先重启一次,就不需要进行1和2操作了,完美~
程序 | 起始地址 |
---|
BootLoader | 0x08000000 | APP | 0x08080000 |
一个完整的升级流程:
- BootLoader程序启动
- 从Flash读 RunApp 标志为 0,等待升级或 JumpToApp 指令
- 接收新固件,将固件写入Flash,等待 JumpToApp 指令
- 接收 JumpToApp 指令,将 RunApp 置1写入Flash
- 重启
- BootLoader再启动
- 从Flash读 RunnApp 标志为1
- 先清 RunApp 标志,写入Flash
- 跳转APP运行
- APP启动,如果需要升级,发送 upgrade 指令,重启进入BootLoader
//BootLoader程序示例
//RunAPP记录BootLoader启动后是等待升级或跳转APP指令,还是直接跳转APP,保存在Flash中
RunApp = readRunAppFlagFromFlash(); //0-等待升级或跳转指令 1-直接跳转APP
while(1){
if(1==RunApp){
writeRunAppFlagToFlash(0); // RunAPP清零
exec_app(RunApp); // 跳转APP
}
// 代码升级部分省略,此处接收新固件,并将固件写入到Flash
if(1==JumpToApp){
writeRunAppFlagToFlash(1); // RunAPP置1
HAL_NVIC_SystemReset(); // 重启
}
}
//APP程序实例
#define VECT_TAB_OFFSET 0x08080000
int main(void){
SCB->VTOR = FLASH_BANK1_BASE | VECT_TAB_OFFSET;
while(1){
if(1==upgrade){
HAL_NVIC_SystemReset(); // 重启
}
}
}
//以上代码仅是示例,并不完善
|