環境
- 開發板:stm32F407ZG EXPLORER
- STM32CubeMX: Version 6.1.0
CubeMX設置
- IWDG時鍾為32KHz

- IWDG 設置

CubeMX 生成的代碼
- main.c
注意:hal庫中與原子標准庫demo中,關於分頻值有區別,原子標准庫中為4分頻,對應hal庫的分頻值為64

/**
* @brief IWDG Initialization Function
* @param None
* @retval None
*/
static void MX_IWDG_Init(void)
{
/* USER CODE BEGIN IWDG_Init 0 */
/* USER CODE END IWDG_Init 0 */
/* USER CODE BEGIN IWDG_Init 1 */
/* USER CODE END IWDG_Init 1 */
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_64;
hiwdg.Init.Reload = 500;
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN IWDG_Init 2 */
/* USER CODE END IWDG_Init 2 */
}
添加的代碼
- 鍵值枚舉變量
/* USER CODE BEGIN PTD */
typedef enum {
KEY_WAKEUP=0,
KEY_0,
KEY_1,
KEY_2,
KEY_NULL
}KEY_user_t;
/* USER CODE END PTD */
- 以下代碼作用是當看門狗超時重啟時,DS0熄滅一次
/* USER CODE BEGIN 2 */
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET);
/* USER CODE END 2 */
- 以下代碼作用是,不停的按KEY_UP鍵 喂狗,這樣DS0就不會熄滅
/* USER CODE BEGIN WHILE */
while (1)
{
if ( key_input == KEY_WAKEUP ) {
HAL_IWDG_Refresh( &hiwdg );
key_input = KEY_NULL;
}
/* USER CODE END WHILE */
- 按鍵響應
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
HAL_Delay(20);
switch (GPIO_Pin) {
case GPIO_PIN_0:
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {
//HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_8);
key_input = KEY_WAKEUP;
printf("wake up\r\n");
}
break;
case GPIO_PIN_2:
......
另外: CubeMX 生成的代碼縮進為2個空格,所以為了同一可以將keil設置如下

