Estoy haciendo un poco de codificación en una placa STM32F411, usé el CubeMX & HAL Bibliotecas para la pereza.
Estoy intentando que el perro guardián de la ventana (WWDG) suba & ejecutando, y hacer la versión muy básica (sin interrupción) funciona como se espera usando esta secuencia de configuración (directamente desde el HAL / CubeMX):
/* Reset of all peripherals, Initialises the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialise all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
MX_I2C1_Init();
MX_IWDG_Init();
MX_TIM1_Init();
MX_USART6_UART_Init();
MX_USB_OTG_FS_USB_Init();
MX_WWDG_Init(); // Window == count == 0x7F
HAL_WWDG_Refresh(&hwwdg, 0x7F);
HAL_WWDG_Start(&hwwdg);
while(1)
{
//main loop stuff
}
Esto funciona como se esperaba (cerraré la ventana más adelante), pero si cambio el código para usar la función de interrupción de "activación temprana" (EWIF, por sus siglas en inglés) - nuevamente, todo generado automáticamente desde CubeMX - instantáneamente dispara la interrupción:
/* Reset of all peripherals, Initialises the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialise all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
MX_I2C1_Init();
MX_IWDG_Init();
MX_TIM1_Init();
MX_USART6_UART_Init();
MX_USB_OTG_FS_USB_Init();
MX_WWDG_Init(); // Window == count == 0x7F
HAL_WWDG_Refresh(&hwwdg, 0x7F);
HAL_WWDG_Start_IT(&hwwdg);
while(1)
{
//main loop stuff
}
La llamada MX_WWDG_Init();
en este caso incluye las líneas para configurar NVIC / habilitar IRQ pero es idéntica por lo demás:
void HAL_WWDG_MspInit(WWDG_HandleTypeDef* hwwdg)
{
if(hwwdg->Instance==WWDG)
{
/* USER CODE BEGIN WWDG_MspInit 0 */
/* USER CODE END WWDG_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_WWDG_CLK_ENABLE();
/* Peripheral interrupt init */
HAL_NVIC_SetPriority(WWDG_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(WWDG_IRQn);
/* USER CODE BEGIN WWDG_MspInit 1 */
/* USER CODE END WWDG_MspInit 1 */
}
}
Intenté agregar __HAL_WWDG_CLEAR_FLAG(hwwdg, WWDG_FLAG_EWIF);
justo antes de la llamada __HAL_WWDG_ENABLE_IT(hwwdg, WWDG_IT_EWI);
en HAL_WWDG_Start_IT(&hwwdg);
pero no hace ninguna diferencia.
¿Qué me he perdido aquí?