STM32—独立看门狗(IWDG)


独立看门狗(IWDG)

  • STM32—独立看门狗(IWDG)
  • 独立看门狗(IWDG)
    • IWDG 简介
    • IWDG 功能框图剖析
      • 独立看门狗时钟
      • 计数器
      • 重装载寄存器
      • 键寄存器
    • 怎么用 IWDG
    • 独立看门狗所用到的库函数
    • 独立看门狗操作步骤
    • 相关代码如下

独立看门狗(IWDG)

大家想要了解窗口看门狗(WWDG)的也可以去看我的另一篇文章——》 窗口看门狗(WWDG)

IWDG 简介

STM32 有两个看门狗,一个是独立看门狗另外一个是窗口看门狗,独立看门狗号称宠物狗,窗
口看门狗号称警犬 。独立看门狗用通俗一点的话来解释就是一个 12 位的递减计数器,当计数器的值从某个值一直减到 0 的时候,系统就会产生一个复位信号,即 IWDG_RESET。**如果在计数没减到 0 之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。**看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。

IWDG 功能框图剖析

独立看门狗比较简单,当然它的安全性没有窗口看门狗高。下面就介绍一下这两个狗狗。

独立看门狗时钟

独立看门狗是由专门的低速总线进行驱动,即LSI总线时钟频率40KHz),它可以在主时钟故障的情况下仍然可以工作(或许这就是把这只狗成为独立看门狗的原因吧)。独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。

计数器

独立看门狗的计数器是一个 12 位的递减计数器,最大值为 0XFFF,当计数器减到 0 时,会产生
一个复位信号:IWDG_RESET,让程序重新启动运行,如果在计数器减到 0 之前刷新了计数器的
值的话,就不会产生复位信号,重新刷新计数器值的这个动作我们俗称喂狗。

重装载寄存器

重装载寄存器是一个 12 位的寄存器,里面装着要刷新到计数器的值,这个值的大小决定着独立看门狗的溢出时间。超时时间 Tout = (4*2^prv) / 40 * rlv (s) , prv 是预分频器寄存器的值, rlv 是重装载寄存器的值 。

键寄存器

在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗,但是0XAAAA并不是装入计数器中的值,真正装入计数器中的值是我们根据分频系数和我们需要的超时时间来计算好的), 自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位。如果程序异常,就无法正常喂狗,从而系统复位。

通过写往键寄存器写 0XCCC 来启动看门狗是属于软件启动的方式,一旦独立看门狗启动,它就
关不掉,只有复位才能关掉。

怎么用 IWDG

独立看门狗一般用来检测和解决由程序引起的故障,比如一个程序正常运行的时间是 50ms,在
运行完这个段程序之后紧接着进行喂狗,我们设置独立看门狗的定时溢出时间为 60ms,比我们
需要监控的程序 50ms 多一点,如果超过 60ms 还没有喂狗,那就说明我们监控的程序出故障了,
跑飞了,那么就会产生系统复位,让程序重新运行。

独立看门狗所用到的库函数

下面是独立看门狗所用到的库函数

void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);//设置预分频系数:写PR
void IWDG_SetReload(uint16_t Reload);//设置重装载值:写RLR
void IWDG_ReloadCounter(void);//喂狗:写0xAAAA到KR
void IWDG_Enable(void);//使能看门狗:写0xCCCC到KR
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);//状态:重装载/预分频 更新

独立看门狗操作步骤

由于预分频寄存器和重装载寄存器具有写保护,所以我们在设置这两个寄存器的值的时候,需要先取消写保护。

1) 取消寄存器写保护(向 IWDG_KR 写入 0X5555)

​ 这个函数非常简单, 顾名思义就是开启/取消写保护,也就是使能/失能写权限。

 void IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//开启/取消写保护

2) 设置独立看门狗的预分频系数和重装载值
设置好看门狗的分频系数 prer 和重装载值就可以知道看门狗的喂狗时间(也就是看门狗溢
出时间),该时间的计算方式为:Tout=((4× 2^prer) × rlr) /40
其中 Tout 为看门狗溢出时间(单位为 ms); prer 为看门狗时钟预分频值(IWDG_PR 值),
范围为 0~7; rlr 为看门狗的重装载值(IWDG_RLR 的值);
比如我们设定 prer 值为 4, rlr 值为 625,那么就可以得到 Tout=64× 625/40=1000ms,这样,
看门狗的溢出时间就是 1s, 只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不
会导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准
确的 40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。

 void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值

3) 重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)
库函数里面重载计数值的函数是:

void IWDG_ReloadCounter(); //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器

通过这句,将使 STM32 重新加载 IWDG_RLR 的值到看门狗计数器里面。 即实现独立看门
狗的喂狗操作。

4) 启动看门狗(向 IWDG_KR 写入 0XCCCC)

库函数里面启动独立看门狗的函数是:

void IWDG_Enable(); //使能 IWDG

通过这句,来启动 STM32 的看门狗。 注意 IWDG 在一旦启用,就不能再被关闭!想要关闭,只能重启,并且重启之后不能打开 IWDG,否则问题依旧,所以在这里提醒大家,如果不用 IWDG 的话,就不要去打开它,免得麻烦。通过上面 4 个步骤,我们就可以启动 STM32 的看门狗了,使能了看门狗,在程序里面就必须间隔一定时间喂狗,否则将导致程序复位。利用这一点,我们将通过一个 LED 灯来指示程序是否重启,来验证 STM32 的独立看门狗。

相关代码如下

wdg.c

#include "wdg.h"
//初始化独立看门狗
//prer:分频数: 0~7  (只有低3位有效!)
//分频因子=4*2^prer.但最大值只能是256!
//rlr:重装载寄存器值: 0~2047 (低11位有效!)
//时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms).
void IWDG_Init(u8 prer,u16 rlr)
{   IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  //使能对寄存器IWDG_PR和IWDG_RLR的写操作/*@arg IWDG_Prescaler_4: IWDG prescaler set to 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*/IWDG_SetPrescaler(prer);  //设置IWDG预分频值:设置IWDG预分频值为64IWDG_SetReload(rlr);  //设置IWDG重装载值IWDG_ReloadCounter();  //按照IWDG重装载寄存器的值重装载IWDG计数器IWDG_Enable();  //使能IWDG
}
//喂独立看门狗
void IWDG_Feed(void)
{   IWDG_ReloadCounter();//喂狗
}

wdg.h

#ifndef __WDG_H
#define __WDG_H
#include "sys.h"void IWDG_Init(u8 prer,u16 rlr);
void IWDG_Feed(void);#endif

main.c

在配置看门狗后, LED0 将常亮,如果 WK_UP 按键按下,就喂狗,只要 WK_UP 不停的按,
看门狗就一直不会产生复位,保持 LED0 的常亮,一旦超过看门狗定溢出时间(Tout)还没按,
那么将会导致程序重启,这将导致 LED0 熄灭一次。

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "wdg.h"int main(void){       delay_init();            //延时函数初始化    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(115200);  //串口初始化为115200LED_Init();           //初始化与LED连接的硬件接口KEY_Init();          //按键初始化    delay_ms(500);      //让人看得到灭IWDG_Init(4,625);    //与分频数为64,重载值为625,溢出时间为1s    LED0=0;              //点亮LED0while(1){if(KEY_Scan(0)==WKUP_PRES){IWDG_Feed();//如果WK_UP按下,则喂狗}delay_ms(10);};
}

给那些看完的朋友,奖励一个 赤赤博客-后端+前端,觉得不错的话可以推荐给身边的朋友哟!

STM32—独立看门狗(IWDG)相关推荐

  1. cubeIDE开发, stm32独立看门狗IWDG的CubeMX配置及HAL库底层实现分析

    一.STM32 的IWDG简介 2.1 看门狗原理 看门狗本质上就是一种计数器,和我们现实生活中一炷香现象.沙漏现象等是同理的,计数器一般有两种做法,一种是递增,超过固定阀值报警:一种是递减,通常值降 ...

  2. STM32 - 独立看门狗IWDG - 使用注意事项+代码

    一.包含头文件 #include "stm32f10x_iwdg.h" 二.设置 独立看门狗 的超时时间 1.配置代码 /** 设置 IWDG 的超时时间* Tout(ms) = ...

  3. 【STM32】stm32独立看门狗(IWDG)

    stm32独立看门狗(IWDG) 0x01 IWDG简介 0x02 IWDG主要性能 0x03 IWDG寄存器配置 0x01 IWDG简介 STM32F10xxx内置两个看门狗,(独立看门狗和窗口看门 ...

  4. stm32专题三十四:独立看门狗 IWDG

    独立看门狗简介 IWDG结构框图 (1)独立看门狗时钟 独立看门狗的时钟由独立的 RC 振荡器 LSI 提供, 即使主时钟发生故障它仍然有效,非常独立. LSI 的频率一般在 30~60KHZ 之间, ...

  5. STM32F103五分钟入门系列(十三)独立看门狗IWDG

    参考:STM32F103五分钟入门系列(十三)独立看门狗IWDG 作者:自信且爱笑' 发布时间:2021-07-31 19:50:28 网址:https://blog.csdn.net/Curnane ...

  6. STM32F1笔记(六)独立看门狗IWDG

    STM32F1内置了两个看门狗,独立看门狗IWDG和窗口看门狗WWDG,可以用来检测和解决由软件错误引起的故障. IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精 ...

  7. STM32独立看门狗(宠物狗)

    一.前言 ······在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系 ...

  8. stm32独立看门狗和rtc闹钟

    独立看门狗 1.独立看门狗概述 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会 ...

  9. STM32 独立看门狗实验

    一.STM32 独立看门狗简介 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效.这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 ...

最新文章

  1. python常用命令汇总-python中pip工具常用命令汇总
  2. 数字图像处理:第三章 灰度直方图
  3. rust语法丑陋_抛出异常–缓慢而丑陋
  4. CF 1174 D. Ehab and the Expected XOR Problem 异或技巧
  5. excel按条件查询mysql_Excel中实现多条件查找的15种方法
  6. 2006-我都做了什么!
  7. CocoaPods集成ShareSDK
  8. 10-4 用select进行调度
  9. ivy java_Ivy 在eclipse里的配置
  10. dependency-check-maven安全漏洞扫描工具介绍
  11. system verilog语法(一)
  12. 《炬丰科技-半导体工艺》Micro-LED 显示器量化生产关键技术
  13. 手把手教学linux上扩容和缩减swap分区。
  14. 背单词App开发日记3
  15. 仿淘宝 阿里云登录 密码和扫码切换登录
  16. 腾讯视频弹幕屏蔽js
  17. 做程序界中的死神,提升斩魂刀
  18. 基于ROCKCHIP的ubuntu-base根文件系统构建
  19. vpwm的控制变频_变频器调速控制方式和PWM脉宽调整技术有什么不同
  20. MVC框架的学习总结

热门文章

  1. JVM—7—垃圾回收概述及相关算法
  2. Windows java,jdk安装与环境变量配置 详细教程(图)
  3. 跨境早报| 2020美国电商高退货率品类有哪些?速卖通发布重要物流通知!
  4. [前端]-jquery插件bxslider用法实例分析
  5. 记录下第一次发表CSDN(打印乘法口诀表)
  6. 【GeoTools】geotools-20 读取、写入shape文件
  7. Layui 时间戳转日期格式
  8. 设计模式-对象行为型模式
  9. 学成案例——banner模块和精品模块制作
  10. c语言 操作系统原理,操作系统原理 第2版