什么是看门狗呢

看门狗是一条狗吗?显然不是,它其实是一种外设只不过呢这种外设有点看门狗的意思。试想一下有个人家里比较富,而且有一些宝贵的古董在院子里,但是呢他家里还没有有到能请得起一个保安,这时候它怎么办养一条狗还是养的起的。对吧,假设有人想要闯入他家进行偷东西,这时候这个狗是不是就会叫,叫声就是一种信号,如果这个时候主人听见这条狗在叫那么说明什么是不是说明不正常,这个时候主人就会过来查看,就会避免古董被盗,对吧?你该说了这条狗跟看门狗定时器有什么关系,其实在很多单片机的内部都有看门狗定时器,看门狗定时器的作用就跟这个差不多。只不过呢它是监视程序是否异常的一条狗

什么是程序异常呢?

程序是按照人设定的指令按照人的设计意图进行执行的代码,程序异常就是没有按照人设计的意图进行的时候。一般来说,看门狗定时器是一种若在特定时间范围内未从处理器接收到周期性脉冲讯号,就会发出重设输出讯号的一种装置。这有点向那个看门狗,平常没事狗会给你看家,有坏人入侵时候它会叫,突然有一天这条狗挂了,那就没得叫了,为啥狗会挂呢,因为你十天没有给它吃的,你要是周期性的给它点食物,那么它有坏人过来就会叫这叫正常,如果你长时间不给它吃的超过十天那么就是不正常对吧,它就会挂掉不给你看门了,有坏人也不会叫,这时候就出事了,为了保证出事后我们能及时发现不造成巨大损失我们这时候就需要再开一局那就是我们经常说的重启。

为什么需要两个看门狗

如果程序跑飞后又跑回正常或者跑乱的程序正好执行了刷新看门狗这样独立看门狗是不能检查到并复位芯片的
窗口看门狗:限制了喂狗时间 如果程序跑飞并且在限制的时间段喂狗是很困难的从而保证了程序的正常运行

单片机如何才能重启?

复位可以使单片机重启
硬件复位:复位按键进行
上电复位:断电重启 这种很不方便还需要人为操作
软件复位:通过复位命令进行 产品开发常用
看门狗复位:属于软件复位
看门狗定时器本质是递减计数器,这个递减计数器一旦减到0,看门狗就会将程序进行复位。正常工作情况,不会让这个计数器减到0 (喂狗操作 保证狗活着就不会复位)

STM32的看门狗定时器有两个

  1. 独立看门狗 IWDG
  2. 窗口看门狗 WWDG

相同点:

两个都可以用于检测并解决由软件错误导致的故障,产生系统复位。

不同点:

当计数器达到给定的超时值时,窗口型看门狗定时器会触发一个中断。独立看门狗不会产生这个中断

应用场景也不同

IWDG 最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。
WWDG 最适合那些要求看门狗在精确计时窗口起作用的应用程序。

时钟源对比:
独立看门狗时钟来源是LSI(低速内部时钟)

窗口看门狗是APB外设时钟来源取决于PCLK1.

装载值范围的不同
独立看门狗定时器是12位递减计数器

窗口看门狗是6位递减计数器

既然两者的时钟来源不同,而且计数值装载的内容也不通,那就说明二者最大不喂狗时间一定不同

对于独立看门狗:
内部时钟范围比较大 拨动范围在30KHz到60KHz之间,最大频率,最小分频,最大计数。能得到一个最小喂狗时间
最小频率 ,最大分频, 最大装载值。能得到一个最大喂狗时间(狗的生存周期)

Tout=((4×2^prer) ×rlr) /32Khz
独立看门狗由内部专门的 32Khz 低速时钟(LSI)驱动。
其中 Tout 为看门狗溢出时间(单位为 s);
prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7;
(4×2^prer)整体为实际预分频值,预分频值可取值为4/8/16/32/64/128/256。
rlr 为看门狗的重装载值(IWDG_RLR 的值);

对于窗口看门狗:

以30MHz为例。APB1时钟频率是30MHz,计数频率是PCLK1的4096分子1在根据WDGTB[1:0]这两个位来决定分频系数是否还要乘以 1 2 4 8

以预分频为4为例

0x3F+1 = 64
1831 = 30M/(4096*4)

图上给的是周期计算 ,寄存器描是频率描述。

频率 = 周期的倒数

看门狗的复位条件不同:

独立看门狗复位条件是计数到0进行 使能位打开的情况下
窗口看门狗的复位条件则是 T6位发送1到0的变化 或者 在非窗口期进行了写操作(也可以理解成喂狗操作)
所谓喂狗就是给计数器重装载值装载一个数值。

独立看门狗喂狗
操作的是寄存器写入一个特定的数值
窗口看门狗喂狗
操作的是CR寄存器 写入一个介于0x00-0x7F之前的数值 写入的时机非常关键 过早过迟都不行 因为过早过迟都会引起程序的复位

如何来判断这个早和迟呢

在T6>W6的的时候写就属于过早 在T6<W6的时候就是合适,在计数器值小于0x30的时候再去写就是过迟,也会复位

总结:窗口看门狗有两种情况会产生复位

1,喂狗时间大于窗口上限值

2,计数器值从0x40减到0x3F

如果启动看门狗并且允许中断,当递减计数器等于0x40时,会产生唤醒中断EWI,它可以用于喂狗避免WWDG复位

窗口看门狗相关库函数


窗口看门狗相关配置步骤

实例代码


以上程序实现:

程序初始化LED点亮延时300ms熄灭

窗口看门狗从0x7F开始递减计数,上窗口为0x5F,下窗口为0x7F

计数器到达0x40进入提前唤醒中断,

在中断函数中进行喂狗操作,计数器翻转(从0x7F重新计数),LED1翻转

以此循环。。.

翻转频率为从0x7F计数到0x40,翻转时间可以根据公式计算

正常喂狗:

LED0亮300ms之后熄灭,LED1不断闪烁

喂狗失败(注释掉喂狗函数):

程序不断复位,LED0闪烁
  例子来自电子发烧友文章,链接:
  http://m.elecfans.com/article/677558.html

初出茅庐的小李第92篇博客之看门狗总结相关推荐

  1. 初出茅庐的小李第3篇博客《5G物联网及NB-IoT技术详解》读书笔记1

    初出茅庐的小李第3篇博客 <5G物联网及NB-IoT技术详解>读书笔记1 在Mculover666那里白嫖了一本书,不要问我咋白嫖的,我也不知道- 为什么要写这样的笔记? 因为我白嫖的时候 ...

  2. 初出茅庐的小李第113篇博客项目笔记之机智云智能浇花器实战(2)-基础Demo实现

    初出茅庐的小李第112篇博客项目笔记之机智云智能浇花器实战(1)-基础Demo实现 接(1) 继电器实现 继电器原理图 继电器采用的是5V继电器,控制端是RELAY-1 继电器代码实现 #includ ...

  3. 初出茅庐的小李第39篇博客之转载一篇有关unistd.h的介绍文章

    转载一篇文章 mask一下好找 unistd.h在unix中类似于window中的windows.h! #ifdef WIN32 #include <windows.h> #else #i ...

  4. 初出茅庐的小李第19篇博客之广和通G510模块接入机智云平台

    2020年5月1日劳动节 为什么要说一下这个日期,因为我上一次玩(学)G510模组是去年2019年5月1日,由于种种原因吧,一直也没有机会再次操作,而且不幸的一件事情就是,我还把上次搞的代码搞丢了,也 ...

  5. 初出茅庐的小李第73篇博客之offsetof(type, member-designator)使用

    offsetof(type, member-designator) 这是一个宏定义包含在<stddef.h>里,它的作用是用来计算一个结构成员相对于结构开头的字节偏移量. 说到这里我先来补 ...

  6. 初出茅庐的小李第86篇博客之Modbus协议总结

    Modbus协议来源 Modbus协议的由来 Mod,取自英文单词" Modicon",Modicon 中文翻译为莫迪康,是美国一家自动化公司的名字,现在这家公司被法国的施耐德电气 ...

  7. 初出茅庐的小李第59篇博客之测试Modbus协议的继电器

    1, Modbus RTU指令详解 发送: FF 05 00 00 FF 00 99 E4 字段 含义 注释 FF 设备地址 范围1-255,默认255 05 功能码 写单个线圈 00 00 继电器地 ...

  8. 初出茅庐的小李第114篇博客项目笔记之机智云智能浇花器实战(3)-基础Demo实现

    机智云智能浇花器实战(3)-基础Demo实现 链接:机智云智能浇花器实战(2)-基础Demo实现 BH1750光照传感器原理图 BH1750传感器代码 #include "bh1750.h& ...

  9. 初出茅庐的小李第36篇博客之读取旋转编码器正反转状态(arduino uno 测试)

    旋转编码器的引脚 CLK(A相) DATA(B相) SWITCH VCC GND 工作原理 旋转编码器的工作原理以及如何在Arduino中使用 https://www.yiboard.com/thre ...

最新文章

  1. 【Java代码实现】递归两大经典问题-----“汉诺塔问题” 与 “青蛙跳台阶问题” 讲解
  2. VB.NET网络是否联通Function
  3. 项望烽:iOS App开发的那些事儿
  4. C#数组解决约瑟夫环问题
  5. linux之file命令总结
  6. 【渝粤教育】 国家开放大学2020年春季 1009离散数学(本) 参考试题
  7. try-catch 异常处理的执行过程
  8. dump文件 linux,linux使用MAT分析dump文件
  9. Navicat15安装教程超详细步骤
  10. 读KVM虚拟化技术实战与原理解析
  11. Laya1.0Matter.js案例之牛顿摆
  12. Python:实现greedy knapsack贪婪的背包算法(附完整源码)
  13. 魔方(14)133魔方、一阶鬼魔魔方、双心魔方
  14. 四层PCB核心板制作6——BGA引脚扇出与电路扇孔
  15. docker搭建企业级habor仓库
  16. 超搞笑,超拽的句子...
  17. selenium+python抓取微博时遇到“展开全文”
  18. 启发式查询树优化实例
  19. MBR10200FAC-ASEMI塑封肖特基二极管MBR10200FAC
  20. proteus中继电器怎么找_proteus中这个开关在哪

热门文章

  1. 从零开始的单片机学习(九)
  2. 【数学建模之Python】12.追赶法求解三对角方程组
  3. python内置函数range(a、b、s)的作用_python中,内置函数range(a,b,s)的作用是产生一个整数序列,从a到b....
  4. Hexo主题模版推荐简约大方美丽的主题搭建教程
  5. 【超分辨率图像重建】基于POCS超分辨率图像重建算法的MATLAB仿真
  6. 一步一步实现一个Java树形结构体方法
  7. 图标网站收集(ICO、PNG)
  8. 【微语】第五周(12.14~12.20)
  9. OpenCV角点检测
  10. 马!马上看~ 推荐给学绘画的人的电影