STM32学习小记之独立看门狗(IWDG)
Posted 修灯泡的老张
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32学习小记之独立看门狗(IWDG)相关的知识,希望对你有一定的参考价值。
独立看门狗(库函数)
注:本文程序基于STM32F10X版本编写
一、独立看门狗(IWDG)的作用
根据《STM32中文参考手册》,STM32F10X内置了两个看门狗,一个是独立看门狗(IWDG),另一个是窗口看门狗(WWDG)。
看门狗在百度百科中给出的解释是:“看门狗,又叫 watchdog,从本质上来说就是一个定时器电路,一般有一个输入和一个输出,其中输入叫做喂狗,输出一般连接到另外一个部分的复位端,一般是连接到单片机。 看门狗的功能是定期的查看芯片内部的情况,一旦发生错误就向芯片发出重启信号。看门狗命令在程序的中断中拥有最高的优先级。”
二、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值的取法:
(2).rlr值的取法
三、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库,都应该或多或少了解一些底层的东西,这样你才能对它把握得更好。
下一篇预告:《窗口看门狗》
本文作者是个小白,文中如有谬误,还请各位大佬不吝赐教,感谢!
以上是关于STM32学习小记之独立看门狗(IWDG)的主要内容,如果未能解决你的问题,请参考以下文章