Estoy trabajando en una aplicación en el microcontrolador STM32L4. La idea es que cuando presiono el botón de usuario, el gestor de arranque salta de la aplicación principal (0x08000000) a la segunda (0x08080000).
El segundo firmware es solo una aplicación de LED parpadeante. El salto está bien y el LED comienza a parpadear, pero mi problema es que cuando quiero volver de la segunda aplicación a la primera (0x08000000), la exti no funciona.
Aquí está mi código:
Primer firmware:
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
JumpToApplication = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
__disable_irq;
SCB->VTOR = FLASH_BASE | 0x80000;
HAL_RCC_DeInit();
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
__set_PRIMASK(1);
printf("Starting Firmware 2 . . . \r\n");
HAL_DeInit();
JumpToApplication();
}
El comienzo del segundo firmware:
SCB->VTOR = FLASH_BASE | 0x80000;
__set_PRIMASK(0);
HAL_Init();
SystemClock_Config();
HAL_InitTick(1);
...
Esta es la devolución de llamada exti del segundo firmware:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
HAL_NVIC_ClearPendingIRQ(EXTI15_10_IRQn);
HAL_NVIC_DisableIRQ(EXTI15_10_IRQn);
if (GPIO_Pin == GPIO_PIN_13)
{
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
JumpToApplication = (pFunction) JumpAddress;
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
HAL_NVIC_DisableIRQ(EXTI15_10_IRQn);
__disable_irq;
SCB->VTOR = FLASH_BASE;
JumpToApplication();
}
}
}
¿Por qué esto no funciona?