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?
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.
Sean Houlihane
John u
gon1332