×
单片机 > 单片机程序设计 > 详情

STM32—IWDG看门狗

发布时间:2020-09-01 发布时间:
|

背景:


STM32的看门狗有2个:独立看门狗IWDG和窗口看门狗WWDG本文主要介绍STM32的IWDG。


内容:


IWDG主要性能


(1)自由运行的递减计数器;


(2)时钟由独立的RC振荡器提供(可在停止和待机模式下工作),LSI为其时钟源,STOP和SLEEP模式仍可运行;


(3)看门狗被激活后,在计数器计数至0x000的的时产生复位。


下图为看门狗的框图。

上图中,IWDG由4个寄存器控制,PR,SR,RLR和KR。下面继续分析STM32的HAL库中IWDG的使用。


IWDG_HandleTypeDef hiwdg;定义一个IWDG_HandleTypeDef类型的结构体,查看其结构体,如下


typedef struct 

  IWDG_TypeDef * Instance; / *!

 

  IWDG_InitTypeDef Init; / *!

 

} IWDG_HandleTypeDef;


继续查看其内部的两个结构体,如下


typedef struct 

  __IO uint32_t KR; / *!

  __IO uint32_t PR; / *!

  __IO uint32_t RLR; / *!

  __IO uint32_t SR; / *!

} IWDG_TypeDef;

typedef struct 

  uint32_t Prescaler; / *!

                            此参数可以是@ref的值IWDG_Prescaler * / 

 

  uint32_t Reload; / *!

                            此参数必须是介于Min_Data = 0和Max_Data = 0x0FFF之间的数字* / 

 

} IWDG_InitTypeDef;


下面继续分析看门狗的初始化函数:


static void MX_IWDG_Init(void)

  hiwdg.Instance = IWDG; //传入IWDG的基地址;

  hiwdg.Init.Prescaler = IWDG_PRESCALER_32; //32预分频

  hiwdg.Init.Reload = 3000; 

  if(HAL_IWDG_Init(&hiwdg)!= HAL_OK)

  { 

    _Error_Handler(__ FILE__,__LINE__); 

  } 

}

继续查看HAL_IWDG_Init函数:


HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef * hiwdg)

  uint32_t tickstart; 

  / *检查IWDG句柄分配* / 

  if(hiwdg == NULL)

  { 

    return HAL_ERROR; 

  } 

  / *检查参数* / 

  assert_param(IS_IWDG_ALL_INSTANCE(hiwdg-> Instance)); 

  assert_param(IS_IWDG_PRESCALER(hiwdg-> Init.Prescaler)); 

  assert_param(IS_IWDG_RELOAD(hiwdg-> Init.Reload)); 

 

  / *启用IWDG。LSI开启automaticaly * / 

  __HAL_IWDG_START(hiwdg); 

 

  / *通过在KR * / 

  IWDG_ENABLE_WRITE_ACCESS(hiwdg)中写入0x5555来启用对IWDG_PR和IWDG_RLR寄存器的写入访问; 

 

  / *写入IWDG寄存器Prescaler&Reload值与* /

  hiwdg-> Instance-> PR = hiwdg-> Init.Prescaler; 

  hiwdg-> Instance-> RLR = hiwdg-> Init.Reload; 

 

  / *检查未决的标志,如果以前的更新没有完成,则返回超时* / 

  tickstart = HAL_GetTick(); 

 

  / *等待寄存器更新* / 

  while(hiwdg-> Instance-> SR!= RESET)

  { 

    if((HAL_GetTick() - tickstart)> HAL_IWDG_DEFAULT_TIMEOUT)

    { 

      return HAL_TIMEOUT; 

    } 

  } 

 / *在重装载寄存器* /定义的值重新加载IWDG计数器

  __HAL_IWDG_RELOAD_COUNTER(hiwdg); 

 

 

  / *返回函数状态* / 

  return HAL_OK; 

}


当实际程序中使用看门狗后,需要在计数时间内不停地喂狗,以防止程序重启。若程序较为复杂,也可通过开启的一个定时器来不停地喂狗,喂狗即让看门狗复位从新计数,调用 __HAL_IWDG_RELOAD_COUNTER(hiwdg)函数来喂狗。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32 USB HID 键盘