跳转到新固件STM32L4后,EXTI停止工作

2019-07-14 17:12发布

我正在研究STM32L4微控制器上的应用程序。我的想法是当我按下用户按钮时,引导加载程序从主应用程序(0x08000000)跳转到第二个(0x08080000)。第二个固件只是一个闪烁的LED应用程序。跳跃很好,LED开始闪烁,但我的问题是,当我想从第二个应用程序返回到第一个应用程序(0x08000000)时,exti将无法工作!这是我的代码:第一个固件:
  1. <font size="4">if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
  2. {
  3.     /* Jump to user application */
  4.     JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
  5.     JumpToApplication = (pFunction) JumpAddress;

  6.     /* Initialize user application's Stack Pointer */
  7.     __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);

  8.     __disable_irq;
  9.     SCB->VTOR = FLASH_BASE | 0x80000;

  10.     HAL_RCC_DeInit();
  11.     SysTick->CTRL = 0;
  12.     SysTick->LOAD = 0;
  13.     SysTick->VAL = 0;
  14.     __set_PRIMASK(1);

  15.     printf("Starting Firmware 2 . . .   ");
  16.     HAL_DeInit();
  17.     JumpToApplication();
  18. }</font>
复制代码第二个固件的开头:
  1. <font size="4">SCB->VTOR = FLASH_BASE | 0x80000;
  2.   __set_PRIMASK(0);
  3.   HAL_Init();

  4.   SystemClock_Config();

  5.   HAL_InitTick(1);</font>
复制代码这是来自第二个固件的exti回调:
  1. <font size="4">void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  2. {
  3.     HAL_NVIC_ClearPendingIRQ(EXTI15_10_IRQn);
  4.     HAL_NVIC_DisableIRQ(EXTI15_10_IRQn);

  5.     if (GPIO_Pin == GPIO_PIN_13)
  6.     {
  7.         if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
  8.         {
  9.             JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
  10.             JumpToApplication = (pFunction) JumpAddress;

  11.             __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);

  12.              HAL_NVIC_DisableIRQ(EXTI15_10_IRQn);
  13.             __disable_irq;
  14.              SCB->VTOR = FLASH_BASE;
  15.             JumpToApplication();
  16.         }
  17.     }
  18. }</font>
复制代码为什么这不起作用?


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。