STM32F4: WWDG-Interrupt wird ausgelöst, sobald er aktiviert ist

Ich codiere etwas auf einem STM32F411-Board und verwende die CubeMX- und HAL-Bibliotheken aus Faulheit.

Ich versuche, den Windowed Watchdog (WWDG) zum Laufen zu bringen, und die sehr einfache Version (ohne Unterbrechung) funktioniert wie erwartet mit dieser Einrichtungssequenz (direkt aus 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
}

Dies funktioniert wie erwartet (ich werde das Fenster später verengen), aber wenn ich den Code so ändere, dass er die Interrupt-Funktion "Early Wakeup" (EWIF) verwendet - wieder alles automatisch von CubeMX generiert -, wird der Interrupt sofort ausgelöst:

/* 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
}

Der MX_WWDG_Init();Aufruf enthält in diesem Fall die Zeilen zum Setzen von NVIC / Aktivieren des IRQ, ist aber ansonsten identisch:

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 */
  }
}

Ich habe versucht, __HAL_WWDG_CLEAR_FLAG(hwwdg, WWDG_FLAG_EWIF);kurz vor dem __HAL_WWDG_ENABLE_IT(hwwdg, WWDG_IT_EWI);Anruf hinzuzufügen HAL_WWDG_Start_IT(&hwwdg);, aber es macht keinen Unterschied.

Was habe ich hier verpasst?

Antworten (2)

Sie müssen sowohl IWDG_SR.EWIF als auch das NVIC-Pending-Flag für IWDG-Interrupt löschen, bevor Sie es aktivieren:

WWDG->SR = 0;
NVIC_ClearPendingIRQ(WWDG_IRQn);
NVIC_EnableIRQ(WWDG_IRQn);

Sogar ich habe sowohl an IWDG als auch an WWDG von STM32F407 BOARD gearbeitet. Ich schlage vor, Sie verwenden Independent Watchdog Timer (IWDG) anstelle von WWDG ... IWDG-Timeout ist mehr, und Sie können IWDG-Preskalar konfigurieren, um das gewünschte Timeout zu erhalten. Es hat eine separate Uhr.

Beantwortet dies die Frage?
Nur wenn „Diese Funktion nicht verwenden“ eine vernünftige Antwort auf „Wie verwende ich diese Funktion?“ ist.
Aber IWDG kann nicht deaktiviert werden. Das bedeutet, dass IWDG Sie bei Schlafzeiten von mehreren Stunden alle paar Sekunden aufweckt.