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

单片机在运行中死机了,你或许只能按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

你可能感兴趣的:(STM32,单片机,stm32,嵌入式硬件)