STM32F4: la interrupción WWDG se activa tan pronto como se habilita

4

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í?

    
pregunta John U

2 respuestas

0

Incluso he trabajado tanto en IWDG como en WWDG de STM32F407 BOARD. Te sugiero que uses el temporizador de vigilancia independiente (IWDG) en lugar de WWDG ... El tiempo de espera de IWDG es más, y puede configurar el prealar IWDG para obtener el tiempo de espera deseado. Tiene un reloj separado.

    
respondido por el Sagar BN
0

Debe borrar el indicador pendiente IWDG_SR.EWIF y NVIC para la interrupción IWDG antes de habilitarlo:

WWDG->SR = 0;
NVIC_ClearPendingIRQ(WWDG_IRQn);
NVIC_EnableIRQ(WWDG_IRQn);
    
respondido por el a3r3

Lea otras preguntas en las etiquetas