STM32—IWDG看门狗

背景:

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

内容:

IWDG主要性能

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

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

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

下图为看门狗的框图。

STM32—IWDG看门狗_第1张图片

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

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

typedef struct 
{ 
  IWDG_TypeDef * Instance; / *!<寄存器基地址* / 

  IWDG_InitTypeDef Init; / *!

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

typedef struct 
{ 
  __IO uint32_t KR; / *!
typedef struct 
{ 
  uint32_t Prescaler; / *!<选择IWDG的预分频器。
                            此参数可以是@ref的值IWDG_Prescaler * / 

  uint32_t Reload; / *!<指定IWDG减计数器重载值。
                            此参数必须是介于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,STM32开发)