无线传感网络 --ZigBee3-2 看门狗

看门狗的使用

看门狗是在软件跑飞的情况下CPU自恢复的一个方式,当软件在选定的时间间隔内不能置位看门狗定时器(WDT),WDT就复位系统。看门狗可用于电噪声,电源故障或静电放电等恶劣工作环境或高可靠性要求的环境。如果系统不需要应用到看门狗,则WDT可配置成间隔定时器,在选定时间间隔内产生中断。WDT的特性如下:4个可选择的时间间隔看门狗定时器模式下产生中断请求时钟独立于系统时钟,WDT包括一个15位定时/计数器,它的频率由32.768KHz的晶振决定。用户不能查看计数器的值工作于各个电源模式。让用户了解几种看门狗定时器的使用。
在这里插入图片描述
1、看门狗概述
在CPU可能受到一个软件颠覆的情况下,看门狗定时器(WDT)用作一个恢复的方法。当软件在选定时间间隔内不能清除WDT时,WDT必须就复位系统。看门狗可用于受到电气噪音、电源故障、静电放电等影响的应用,或需要高可靠性的环境。如果一个应用不需要看门狗功能,可以配置看门狗定时器为一个间隔定时器,这样可以用于在选定的时间间隔产生中断。看门狗定时器的特性如下:

  • 四个可选的定时器间隔
  • 看门狗模式
  • 定时器模式
  • 在定时器模式下产生中断请求

WDT可以配置为一个看门狗定时器或一个通用的定时器。WDT模块的运行由WDCTL寄存器控制。看门狗定时器包括一个15位计数器,它的频率由32kHz时钟源规定。注意用户不能获得15位计数器的内容。在所有供电模式下,15位计数器的内容保留,且当重新进入主动模式,看门狗定时器继续计数。

看门狗模式

在系统复位之后看门狗定时器就被禁用。要设置WDT在看门狗模式必须设置WDCTLMODE[1:0]位为10。然后看门狗定时器的计数器从0开始递增。在看门狗模式下,一旦定时器使能,就不可以禁用定时器,因此,如果WDT位已经运行在看门狗模式下,再往WDCTLMODE[1:0]写入00或10就不起作用了。
WDT运行在一个频率为32768kHz(当使用32kHzxosC)的看门狗定时器时钟上。这个时钟频率的超时期限等于19ms,15625ms,025s和1,分别对应64,512,8192和32768的计数值设置。
如果计数器达到选定定时器的间隔值,看门狗定时器就为系统产生一个复位信号。如果在计数器达到选定定时器的间隔值之前,执行了一个看门狗清除序列,计数器就复位到0,并继续递增。看门狗清除的序列包括在一个看门狗时钟周期内写入0xA到WDCTLCLR[3:0],然后写入0x5到同一个寄存器位。如果这个序列没有在看门狗周期结束之前执行完毕,看门狗定时器就为系统产生一个复位信号。
当看门狗模式下,WDT使能,就不能通过写入WDCTLMODE[1:01位改变这个模式,且定时器间隔值也不能改变。
在看门狗模式下,WDT不会产生一个中断请求

定时器模式

要在一般定时器模式下设置WDT,必须把WDCTLMODE[1:01位设置为11。定时器就开始,且计数器从0开始递增。当计数器达到选定间隔值,定时器将产生一个中断请求(IRCON2.WDTIF/IEN2.WDTIE )在定时器模式下,可以通过写入1到WDCTL.CLR[0]来清除定时器内容。当定时器被清除,计数器的内容就置为0写入00或01到WDCTLMODE[1:01来停止定时器,并清除它为0。
定时器间隔由WDCTLINT[1:0]位设置。在定时器操作期间,定时器间隔不能改变,且当定时器开始时必须设置。在定时器模式下,当达到定时器间隔时,不会产生复位。注意如果选择了看门狗模式,定时器模式不能在芯片复位之前选择。
注意:如果看门狗模式被选择,那只能等到芯片reset之后定时器模式才能被选择。

相关寄存器

在这里插入图片描述
在这里插入图片描述

寄存器配置

按照表格寄存器内容,我们对WDCTL具体配置可如下:

/*喂狗配置:*/
WDCTL=0x00; //打开IDLE才能设置看门狗 
WDCTL|=0x08; //定时器间隔选择,间隔一秒 
/*停止喂狗:*/
WDCTL = Oxa0; //清除定时器。当OxA跟随0x5写到这些位,定时器被清除 
WDCTL=Ox50;

源码分析

/****************************************************************************
* 文 件 名: main.c
* 作    者: Andy
* 修    订: 2013-01-09
* 版    本: 1.0
* 描    述: 打开看门狗后,得记得喂狗,不然系统就会不停地复位了
****************************************************************************/
#include <ioCC2530.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define LED1 P1_0       // P1.0口控制LED1


/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时 16M时约为535,系统时钟不修改默认为16M
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{ 
    uint i,j;
    
    for (i=0; i<msec; i++)
        for (j=0; j<535; j++);
}

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x01;      //P1.0定义为输出
    LED1 = 0;           //默认LED灯为熄灭状态
}


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

void FeetDog(void) 
{ 
    WDCTL = 0xa0;       //清除定时器。当0xA跟随0x5写到这些位,定时器被清除
    WDCTL = 0x50; 
}

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
    InitLed();		//调用初始化函数
    Init_Watchdog();

    while(1)
    {         
        DelayMS(300);
        LED1=1; 
               
        //FeetDog();     //喂狗系统将不再主动复位,LED1灯不闪烁一直亮,
                       //注释FeetDog函数时系统不断复位,LED1灯闪烁
    }
}

整个工程的意思是:
初始化看门狗并设置1s种的喂狗期限,如果整个工程执行过程中超过1s并且没有喂狗,看门狗timer就会产生一个系统reset信号让系统重置。D1默认是熄灭状态,正常工作时应该一直是点亮,由于没有喂狗系统一直重启所以一熄一亮造成D1闪烁:如果喂狗则D1和D2常亮。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值