当前位置: 首页 > news >正文

【看门狗】我说的是定时器不是狗啊

单片机在运行中死机了,你或许只能按2下电源键(重启)或1下复位键。

这里简单说一下重启和复位:

从RESET引脚复位,只有MCU复位。而外设看情况,有的可能会有MCU同步复位或者重新初始化。也有可能一些保持复位前的状态,如果有I2C转GPIO,输出亮灯,复位后没有重新初始化的,就保持原来的状态。

从Reset脚复位的叫硬件复位,也可以通过程序复位的叫软件复位,这两种都是热启动。

如果断电再打开的,叫冷启动。冷启动完全可以替代热启动,但热启动不一定能替代冷启动。

为了防止单片机死机(跑飞),可以使用看门狗(属于硬件复位的范畴),即Watch Dog Timer吗,其本质是Timer即定时器。

看门狗的作用机制可以简单概括为:

  1. 给看门狗定时器设置一个定时时间(这个时间取决于你的业务代码运行的时间);
  2. 看门狗启动,并开始计时,从定时时间依次递减到0,或者从0递加到定时值;
  3. 在主循环中,先清除看门狗的计数值(即喂狗),然后执行我们的业务代码;
  4. 代码运行一次后,喂狗,再一次执行;
  5. 如果业务代码执行过程中,看门狗计数值就到了设定值(程序本应该在看门狗设定的时间内运行完的,现在说明程序运行出问题了,需要复位),那么单片机就会复位。

看下面这个伪代码就可以理解:

...
IDG_Init(4,500);  //初始化看门狗
while(1)
{IWD_Feed(); //喂狗work();     //我们的业务代码
}
...

一般情况下我们都设置喂狗时间为1s,当有特别的任务需要进行检测时需要根据特定的任务进行设置喂狗时间,假设有一个非常重要的进程,需要及时的进行检测,这里就要设置特定的时间,比如100ms一次喂狗等操作。

此外,由于使用看门狗,出现问单片机会复位,在特定的场景下,你可能需要设置相应的数据保存-恢复机制。

看门狗的分类:

  1. CPU内部自带的看门狗:此类看门狗一般是将一个芯片中的定时器来作为看门狗,通过程序的初始化,写入初值,设定溢出时间,并启动定时器。程序按时对定时器赋初值(或复位),以免被咬。这种看门狗是可以被禁用的(只要停止这个定时器即可)。大部分CPU都内置看门狗,硬件原理可参考各芯片数据手册。
    优点:可以通过程序改变溢出时间;可以随时禁用
    缺点:需要初始化;如果程序在初始化、启动完成前跑飞或在禁用后跑飞,看门狗就无法复位系统,这样看门狗的作用就没有了,系统恢复能力降低。

  2. 独立的看门狗芯片:这种看门狗主要有一个用于喂狗的引脚(一般与CPU的GPIO相连)和一个复位引脚(与系统的RESET引脚相连),如果没有在一定时间内改变喂狗脚的电平,复位引脚就会改变状态复位CPU。此类看门狗一上电就开始工作,无法禁用。现在常用的芯片有:CAT705/CAT706、IMP706等等,溢出时间在1.6秒左右。
    优点:无须配置,上电即用。无法禁用,系统必须按时喂狗,系统恢复能力高。
    缺点:无法灵活配置溢出时间,无法禁用,灵活性降低。

stm32的独立看门狗和窗口看门狗:

  1. 独立看门狗
    根据内部看门狗时钟频率,装载寄存器定一个时间值,比如是1000,那么独立看门狗就会按照时钟频率,从1000开始向下每隔一个时钟周期减1,如果在减到0之前,你用程序代码重新向向下计数器里面写1000(喂狗),那么定时器会重新从1000开始向下递减。如果在减到0的时候,你还没有喂狗(用新的数值覆盖计数器),就会产生复位信号。
  2. 窗口看门狗
    根据系统时钟频率,装载一个初始值到向下计数器(假设还是1000),并且设置一个窗口值(小于装载到计数器的初始值,假设是500),窗口看门狗一般会定死窗口下线值是64。计数器从1000开始向下减,在减到500之前(1000到500间),是不允许你去喂狗的,一旦喂狗,就会产生复位信号。只有计数器值减到上限值之后(500到64),才允许你去喂狗。当计数器减到下限值(64到0之间),如果喂狗,也会产生复位信号,当减到0之后,自动产生复位信号。所以窗口看门狗实际上就是设置一个窗口(上下限),在这个范围内,你才允许你去喂狗,只要不在这个范围之内,都会复位。
  3. 区别
    (1)窗口看门狗计时时间比独立看门狗精准; 窗口看门狗使用的是系统时钟源。
    (2)窗口看门狗严格限定喂狗时间段,独立看门狗则是只要没有到时间,都能喂狗。

————————————————

参考文章:https://blog.csdn.net/weibo1230123/article/details/83927007
参考文章:http://t.csdn.cn/4Vwrc

http://www.lryc.cn/news/43347.html

相关文章:

  • 24万字智慧城市顶层设计及智慧应用解决方案
  • 跨境电商卖家工具——跨境卫士内容介绍
  • Redis 常用基本命令
  • 【Leetcode】队列的性质与应用
  • 开启新航路,拓尔思发力AIGC市场 | 爱分析调研
  • RK3568平台开发系列讲解(调试篇)Linux 内核的日志打印
  • hadoop之MapReduce框架原理
  • JavaEE简单示例——SpringMVC的简单数据绑定
  • 耗时的同步请求自动转异步请求
  • React常见的hook
  • Oracle集群管理ASM-扩容磁盘组报错ora-15137
  • TryHackMe-biteme(boot2root)
  • vue开发常用的工具有哪些
  • 数组,排序,查找
  • redis中序列化后的对象后当如何修改
  • 膜拜!阿里自爆十万字Java面试手抄本,脉脉一周狂转50w/次
  • Yolov5改进: Yolov5-FasterNet网络推理加速
  • 在ubuntu下安装五笔输入法(百度输入法)
  • python自动发送邮件(html、附件等),qq邮箱和网易邮箱发送和回复
  • 数学-快速幂
  • DevEco鸿蒙应用开发-第一个App
  • 又一款全新的基于 GPT4 的 Python 神器Cursor,关键还免费
  • CSS的浮动(下)
  • 软件测试-性能测试流程
  • 【python实操】年轻人,别用记事本保存数据了,试试数据库吧
  • 铁威马NAS教程之利用docker快速搭建个人在线书库
  • 504. 七进制数——【Leetcode每日一题】
  • RocketMQ源码(24)—DefaultMQPushConsumer延迟消息源码
  • 计算机视觉知识点(一)——交并比(IoU)及其若干改进
  • 一篇文章教你从零到一搭建自动化测试框架(附视频教程+源码)