/* WWDG init function */ void MX_WWDG_Init(void) { hwwdg.Instance = WWDG; hwwdg.Init.Prescaler = WWDG_PRESCALER_1; hwwdg.Init.Window = 64; hwwdg.Init.Counter = 64; HAL_WWDG_Init(&hwwdg); }
void Watchdog_Init() { __WWDG_CLK_ENABLE(); /*##-2- Configure the WWDG peripheral ######################################*/ /* WWDG clock counter = (PCLK1 (32MHz)/4096)/8) = 976.6 Hz (~1024 us) WWDG Window value = 80 means that the WWDG counter should be refreshed only when the counter is below 80 (and greater than 64) otherwise a reset will be generated. WWDG Counter value = 127, WWDG timeout = ~1024 us * 64 = 65.536 ms In this case the refresh window is: ~1024 * (127-80) = 48.128 ms < refresh window < ~1024 * 64 = 65.536 ms */ WatchdogHandle.Instance = WWDG; WatchdogHandle.Init.Prescaler = WWDG_PRESCALER_8; WatchdogHandle.Init.Window = 0x7F; WatchdogHandle.Init.Counter = 0x7F; HAL_WWDG_Init(&WatchdogHandle); /*##-3- Start the WWDG #####################################################*/ HAL_WWDG_Start(&WatchdogHandle); // Timer_For_Main_Loop_Init(); }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* STM32F2xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 120 MHz */ SystemClock_Config(); /* Configure LED1, LED2, LED3 */ BSP_LED_Init(LED1); BSP_LED_Init(LED2); BSP_LED_Init(LED3); /* Configure User push-button */ BSP_PB_Init(BUTTON_USER, BUTTON_MODE_EXTI); /*##-1- Check if the system has resumed from WWDG reset ####################*/ if (__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET) { /* WWDGRST flag set: Turn LED1 on */ BSP_LED_On(LED1); /* Clear reset flags */ __HAL_RCC_CLEAR_RESET_FLAGS(); } else { /* WWDGRST flag is not set: Turn LED1 off */ BSP_LED_Off(LED1); } /*##-2- Configure the WWDG peripheral ######################################*/ /* WWDG clock counter = (PCLK1 (30MHz)/4096)/8) = 915 Hz (~1092 us) WWDG Window value = 80 means that the WWDG counter should be refreshed only when the counter is below 80 (and greater than 64/0x40) otherwise a reset will be generated. WWDG Counter value = 127, WWDG timeout = ~1092 us * 64 = 70 ms */ WwdgHandle.Instance = WWDG; WwdgHandle.Init.Prescaler = WWDG_PRESCALER_8; WwdgHandle.Init.Window = 80; WwdgHandle.Init.Counter = 127; if (HAL_WWDG_Init(&WwdgHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-3- Start the WWDG #####################################################*/ if (HAL_WWDG_Start(&WwdgHandle) != HAL_OK) { Error_Handler(); } /* Infinite loop */ while (1) { /* Toggle LED2 */ BSP_LED_Toggle(LED2); /* Insert 60 ms delay */ HAL_Delay(60); /* Refresh WWDG: update counter value to 127, the refresh window is: between 51 ms (~1092 * (127-80)) and 70 ms (~1092 * 64) */ if (HAL_WWDG_Refresh(&WwdgHandle, 127) != HAL_OK) { Error_Handler(); } } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* STM32F3xx HAL library initialization: - Configure the Flash prefetch - Systick timer is configured by default as source of time base, but user can eventually implement his proper time base source (a general purpose timer for example or other time source), keeping in mind that Time base duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and handled in milliseconds basis. - Set NVIC Group Priority to 4 - Low Level Initialization */ HAL_Init(); /* Configure LED1, LED2, LED3 */ BSP_LED_Init(LED1); BSP_LED_Init(LED2); BSP_LED_Init(LED3); /* Configure the system clock to 72 MHz */ SystemClock_Config(); /* Configure Key push-button */ BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_EXTI); /*##-1- Check if the system has resumed from WWDG reset ####################*/ if (__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET) { /* WWDGRST flag set: Turn LED1 on */ BSP_LED_On(LED1); /* Clear reset flags */ __HAL_RCC_CLEAR_RESET_FLAGS(); } else { /* WWDGRST flag is not set: Turn LED1 off */ BSP_LED_Off(LED1); } /*##-2- Configure the WWDG peripheral ######################################*/ /* WWDG clock counter = (PCLK1 (36MHz)/4096)/8) = 1098 Hz (~910 us) WWDG Window value = 80 means that the WWDG counter should be refreshed only when the counter is below 80 (and greater than 64/0x40) otherwise a reset will be generated. WWDG Counter value = 127, WWDG timeout = ~910 us * 64 = 58.24 ms */ WwdgHandle.Instance = WWDG; WwdgHandle.Init.Prescaler = WWDG_PRESCALER_8; WwdgHandle.Init.Window = 80; WwdgHandle.Init.Counter = 127; if (HAL_WWDG_Init(&WwdgHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-3- Start the WWDG #####################################################*/ if (HAL_WWDG_Start(&WwdgHandle) != HAL_OK) { Error_Handler(); } /* Infinite loop */ while (1) { /* Toggle LED2 */ BSP_LED_Toggle(LED2); /* Insert 45 ms delay */ HAL_Delay(45); /* Refresh WWDG: update counter value to 127, the refresh window is: between 42.7ms (~910 * (127-80)) and 58.24 ms (~910 * 64) */ if (HAL_WWDG_Refresh(&WwdgHandle, 127) != HAL_OK) { Error_Handler(); } } }