一篇文章搞定嵌入式看门狗watch dog概述与示例代码

   日期:2020-10-01     浏览:149    评论:0    
核心提示:硬件中的看门狗,不是门卫的意思,而是一只很凶的狗!如果你不按时喂它,它就会让系统重启!这反而是我们想要的功能。

硬件中的看门狗,不是门卫的意思,而是一只很凶的狗!如果你不按时喂它,它就会让系统重启!这反而是我们想要的功能。

       看门狗功能:CPU在执行软件时对跑飞的一种恢复方式。


       

1、看门狗概述

防止系统跑飞(软件颠覆)

       看门狗可用于受到电气噪音、电源故障、静电放电等影响(造成软件运行进入死循环,或者死掉)的应用,或需要高可靠性的环境。
       看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个数字,程序开始运行后看门狗开始倒计数。

  1. 运行正常情况:
           如果程序运行正常,过一段时间CPU应发出指令让看门狗复位(喂狗指令:程序语句是分散地放在单片机其他控制语句中间的),重新开始倒计数。
  2. 运行异常情况:
           一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。
           如果看门狗减到0就认为程序没有正常工作,强制整个系统复位。因此可以用看门狗防止程序在跑飞的时候回不到正常模式。相当于网络中的TTL(TIME TO LIFE就是能够活多久,防止一个包在网络中长时间乱窜)

       

2、看门狗模式(向系统发送RESET,不会产生中断)

       WDT 可以配置为一个看门狗定时器或一个通用的定时器。WDT 模块的运行由WDCTL 寄存器控制。 当系统重启后看门狗定时器失能。
       WDT 运行在一个频率为32.768 kHz(当使用32 kHz XOSC时)的看门狗定时器时钟上。这个时钟频率的超时期限等于1.9ms,15.625 ms,0.25 s 和1s,分别对应64,512,8192 和32768 的计数值设置。
       当计数器达到设定的计数值时,看门狗会对系统产生一个reset信号,如果在计数器到达设定值之前执行了看门狗clear序列,counter的值会被重置为0,并会继续递增。看门狗的clear序列包含:writing 0xA to WDCTL.CLR[3:0], followed by writing 0x5 to the same register bits within one watchdog clock period. 如果这个完整序列不能在watch dog时期结束前完成,看门狗就会产生一个系统reset信号。
       

       

3、定时器模式(产生中断信号)

       To start the WDT in timer mode, the WDCTL.MODE[1:0] bits must be set to 11. The timer is started and the counter starts incrementing from 0. When the counter reaches the selected interval value, the timer produces an interrupt request (IRCON2.WDTIF/IEN2.WDTIE).
       In timer mode, it is possible to clear the timer contents by writing a 1 to WDCTL.CLR[0]. When the timer is cleared, the content of the counter is set to 0. Writing 00 or 01 to WDCTL.MODE[1:0] stops the timer and clears it to 0.
       The timer interval is set by the WDCTL.INT[1:0] bits. The interval cannot be changed during timer operation, and should be set when the timer is started. In timer mode, a reset is not produced when the timer interval has been reached.
       注意:如果看门狗模式被选择,那只能等到芯片reset之后定时器模式才能被选择。

       

4、工程DEMO

 
#include <ioCC2530.h>
#define uchar unsigned char
#define uint unsigned int 
#define LED1 P1_0 // P1.0口控制LED1
#define LED2 P1_1 // P1.1口控制LED2

void DelayMS(uint msec)
{  
    uint i,j;    
    for (i=0; i<msec; i++)
        for (j=0; j<535; j++);
}


void InitLed()
{ 
    P1DIR |= 0x03;      //P1.0、P1.1定义为输出
    LED1 = 1;           //默认LED灯为熄灭状态
    LED2 = 0;//系统复位时候,红灯闪烁一次
    DelayMS(100);
    LED2=1;
}
void Init_Watchdog() 
{  
	WDCTL = 0x00;         //0000 0000 进入IDLE模式,必须进入IDLE才能写周期
    WDCTL |= 0x08;      //0000 1000选择看门狗模式,定时器间隔选择,间隔一秒
}
void FeetDog() //喂狗
{  
    WDCTL = 0xa0; //清除定时器。1010 0000当0xA跟随0x5写入,表示喂狗
    WDCTL = 0x50;     //0101 0000
}
void main()
{ 
InitLed();        //调用初始化函数
//此处让红绿灯连闪3次,表示启动
Init_Watchdog();

    while(1)
    {  
      DelayMS(5000);            
      //绿灯亮
      FeetDog();     //喂狗系统将不再主动复位,绿灯闪
                       //注释FeetDog函数时系统不断复位,红灯闪烁
    //关闭绿灯
    }
} 


void Init_Watchdog(void) 
{  
    WDCTL = 0x00;       //打开IDLE才能设置看门狗
    WDCTL |= 0x08;      //定时器间隔选择,间隔一秒
}




 
void FeetDog(void) 
{  
    WDCTL = 0xa0;       //清除定时器。当0xA跟随0x5写到这些位,定时器被清除
    WDCTL = 0x50; 
    LED2 = 0;           //系统不复位LED2灯长亮
}

       
       因此,整个工程的意思是:初始化看门狗并设置1s钟的喂狗期限,如果整个工程执行过程中超过1s不喂狗,看门狗timer就会产生一个系统reset信号让系统重置。因此代码中69行如果注释掉喂狗,带来的结果就是系统不断重启LED2不断闪烁;如果喂狗则红灯不亮。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服