STM32L4 使用HAL库做IAP功能,bootloader跳转到APP后产生HardFault_Handler()

通过仿真器调试发现执行到APP的HAL_Init()->HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)->NVIC_SetPriorityGrouping(PriorityGroup)函数时进入的HardFault_Handler()中断,此时Call Stack+Locals窗口已经显示了已经执行了SysTick_Handler()和HAL_IncTick();还没有初始化Systick定时器确产生了Systick的中断,说明在进入APP时Systick就在运行,所以bootloader中跳转到APP之前应该关闭Systick。如果在bootloader中开启了其它中断,也应该在跳转到APP之前,关闭相应外设。

/*------------Bootloader------------*/
#define FLASH_RUN_BASEADDR                     0x8004000


  SysTick->CTRL = 0;                                //关键代码
  
  HAL_DeInit();                                     //可选
  HAL_NVIC_DisableIRQ(SysTick_IRQn);                //可选
  HAL_NVIC_ClearPendingIRQ(SysTick_IRQn);           //可选
  /* Jump to user application */
  __disable_irq();

  JumpAddress = *(__IO uint32_t*) (FLASH_RUN_BASEADDR + 4);

  JumpToApplication = (pFunction) JumpAddress;
  /* Initialize user application's Stack Pointer */
  __set_MSP(*(__IO uint32_t*) FLASH_RUN_BASEADDR);
  
  JumpToApplication();

/*------------App------------*/
int main(void)
{
    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH     */
    __enable_irq();
    HAL_Init();

    .
    .
    .

}

火柴棍科技工作室:www.huochaigun.top

技术交流群

STM32MP1:861926625

ESP8266:476685983

你可能感兴趣的:(STM32)