stm32 HAL库学习笔记6——独立看门狗

TOC

环境

  • 开发板: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设置如下

posted @ 2021-02-01 22:13  JerryZheng2020  阅读(1012)  评论(0编辑  收藏  举报