STM32学习小记之独立看门狗(IWDG)

独立看门狗(库函数)

   注:本文程序基于STM32F10X版本编写

一、独立看门狗(IWDG)的作用

根据《STM32中文参考手册》,STM32F10X内置了两个看门狗,一个是独立看门狗(IWDG),另一个是窗口看门狗(WWDG)。
看门狗在百度百科中给出的解释是:“看门狗,又叫 watchdog,从本质上来说就是一个定时器电路,一般有一个输入和一个输出,其中输入叫做喂狗,输出一般连接到另外一个部分的复位端,一般是连接到单片机。 看门狗的功能是定期的查看芯片内部的情况,一旦发生错误就向芯片发出重启信号。看门狗命令在程序的中断中拥有最高的优先级。”

二、IWDG的原理

如果打个比方的话就是,你从外边骗来一条狗(定时),只要你定时去喂狗(执行某个操作),这条狗就不会回到原来的地方(不复位),但你有一天没有喂狗,这条狗就会跑回原来的地方(复位)。
由于本人没有学寄存器编写所以,在寄存器层面的看门狗学习就拜托各位大神了。

1.独立看门狗框图

STM32学习小记之独立看门狗(IWDG)_第1张图片

2.IWDG固件库文件的简单解读

#include "stm32f10x_iwdg.h"

/** @addtogroup STM32F10x_StdPeriph_Driver
  * @{
  */

/** @defgroup IWDG 
  * @brief IWDG driver modules
  * @{
  */ 

/** @defgroup IWDG_Private_TypesDefinitions
  * @{
  */


/** @defgroup IWDG_Private_Defines
  * @{
  */ 

/* ---------------------- IWDG registers bit mask (IWDG寄存器位掩码)----------------------------*/

/* KR register bit mask */
#define KR_KEY_Reload    ((uint16_t)0xAAAA) 
#define KR_KEY_Enable    ((uint16_t)0xCCCC)


/**
  * @brief  Enables or disables write access to IWDG_PR and IWDG_RLR registers.(@brief启用或禁用IWDG_PR和IWDG_RLR寄存器的写访问。)
  * @param  IWDG_WriteAccess: new state of write access to IWDG_PR and IWDG_RLR registers.(@param IWDG_WriteAccess: IWDG_PR和IWDG_RLR寄存器的写访问新状态。)
  *   This parameter can be one of the following values:(该参数可以是以下值之一)
  *     @arg IWDG_WriteAccess_Enable: Enable write access to IWDG_PR and IWDG_RLR registers(@arg IWDG_WriteAccess_Enable:开启IWDG_PR和IWDG_RLR寄存器的写访问)
  *     @arg IWDG_WriteAccess_Disable: Disable write access to IWDG_PR and IWDG_RLR registers(@arg IWDG_WriteAccess_Disable:关闭IWDG_PR和IWDG_RLR寄存器的写访问)
  * @retval None
  */
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess)// 开启/取消写保护
{
     
  /* Check the parameters *//*检查参数*/assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess));
  IWDG->KR = IWDG_WriteAccess;
}

/**
  * @brief  Sets IWDG Prescaler value. //设置IWDG预分频器值。
  * @param  IWDG_Prescaler: specifies the IWDG Prescaler value.
  *   This parameter can be one of the following values:
  *     @arg IWDG_Prescaler_4: IWDG prescaler set to 4  (IWDG预分频器设置为4)
  *     @arg IWDG_Prescaler_8: IWDG prescaler set to 8
  *     @arg IWDG_Prescaler_16: IWDG prescaler set to 16
  *     @arg IWDG_Prescaler_32: IWDG prescaler set to 32
  *     @arg IWDG_Prescaler_64: IWDG prescaler set to 64
  *     @arg IWDG_Prescaler_128: IWDG prescaler set to 128
  *     @arg IWDG_Prescaler_256: IWDG prescaler set to 256
  * @retval None
  */
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler)  
{
     
  /* Check the parameters */
  assert_param(IS_IWDG_PRESCALER(IWDG_Prescaler));
  IWDG->PR = IWDG_Prescaler;
}

/**
  * @brief  Sets IWDG Reload value. (设置IWDG重载值。)
  * @param  Reload: specifies the IWDG Reload value.
  *   This parameter must be a number between 0 and 0x0FFF.  (取值范围为0 ~ 0x0FFF。)
  * @retval None
  */
void IWDG_SetReload(uint16_t Reload)
{
     
  /* Check the parameters */
  assert_param(IS_IWDG_RELOAD(Reload));
  IWDG->RLR = Reload;
}
/*看门狗的溢出时间(也就是到时间就复位)的计算在后边*/
       


/**
  * @brief  Reloads IWDG counter with value defined in the reload register  //用重载寄存器中定义的值重新加载IWDG计数器
  *   (write access to IWDG_PR and IWDG_RLR registers disabled {禁用IWDG_PR和IWDG_RLR寄存器的写访问}).
  * @param  None
  * @retval None
  */
void IWDG_ReloadCounter(void) //利用这个函数,我们能实现禁止IWDG复位的操作(也就是喂狗)
{
     
  IWDG->KR = KR_KEY_Reload;
}

/**
  * @brief  Enables IWDG (write access to IWDG_PR and IWDG_RLR registers disabled). {brief启用IWDG(禁用IWDG_PR和IWDG_RLR寄存器的写访问)。}
  * @param  None
  * @retval None
  */
void IWDG_Enable(void) //IWDG库函数的初始化
{
     
  IWDG->KR = KR_KEY_Enable;
}

/**
  * @brief  Checks whether the specified IWDG flag is set or not.(@brief检查是否设置了指定的IWDG标志。)
  * @param  IWDG_FLAG: specifies the flag to check.
  *   This parameter can be one of the following values:
  *     @arg IWDG_FLAG_PVU: Prescaler Value Update on going
  *     @arg IWDG_FLAG_RVU: Reload Value Update on going
  * @retval The new state of IWDG_FLAG (SET or RESET).
  */
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG) //FlagStatus 返回值是中断标志位状态(读SR寄存器)
{
     
  FlagStatus bitstatus = RESET;
  /* Check the parameters */
  assert_param(IS_IWDG_FLAG(IWDG_FLAG));
  if ((IWDG->SR & IWDG_FLAG) != (uint32_t)RESET)
  {
     
    bitstatus = SET;  
  }
  else
  {
     
    bitstatus = RESET;
  }
  /* Return the flag status */
  return bitstatus;
}

3.IWDG溢出时间的计算

如果你手头有参考书的话大概率是这么个公式:

其中
     Tout:溢出时间
     prer:IWDG时钟预分频值(范围为0~7)
     rlr:IWDG重装载值
关于prer与rlr,这里有两个点需要get:
  (1).prer值的取法:
STM32学习小记之独立看门狗(IWDG)_第2张图片
  (2).rlr值的取法
STM32学习小记之独立看门狗(IWDG)_第3张图片

三、IWDG源文件的编写

/***************头文件*****************/
#ifndef __WDG_H
#define __WDG_H
#include "sys.h"

void IWDG_Init(u8 prer,u16 rlr);
void IWDG_Feed(void);

#endif
/***************c文件*****************/
#include "wdg.h"


void IWDG_Init(u8 prer,u16 rlr) 
{
     	
 	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  //关闭or开启写保护
	
	IWDG_SetPrescaler(prer);  //设置IWDG预分频值;
	
	IWDG_SetReload(rlr);  //设置IWDG重装载值
	
	IWDG_ReloadCounter();  //按照IWDG重装载寄存器的值重装载IWDG计数器
	
	IWDG_Enable();  //使能IWDG
}

void IWDG_Feed(void)
{
        
 	IWDG_ReloadCounter();      //重载									   
}

四、结束语

就我而言,我觉得,不论是学库函数,还是集成度更高的HAL/LL库,都应该或多或少了解一些底层的东西,这样你才能对它把握得更好。
下一篇预告:《窗口看门狗》
本文作者是个小白,文中如有谬误,还请各位大佬不吝赐教,感谢!

你可能感兴趣的:(正点原子STM32F1学习心得,stm32,单片机,嵌入式)