看门狗定时器实际上是一个特殊的定时器,它的的功能是当程序运行发生故障时序时能使系统从新启动。其原理就是发生的故障的时间满足规定的定时时间后,产生一个非屏蔽中断,使系统的复位。这样当在调试程序或预计程序运行在某段内部可能瞬时发生时序错误时(如外部电路干扰)选用设置看门狗定时中断可以避免程序跑飞看门狗的定时时间可以通过WDTCTL中的低三位(SSEL、IS1、IS0)选择,当系统时钟为1MHz时,最大可设置为1秒钟,最小可设置64微秒。 WDTCTL是一个16位寄存器,其高字节为口令,口令为5AH,当对它写入操作时必须写口令才能操作,否则会导致系统复位。
另外该模块还具有定时器的功能。你可通过TMSET位进行选择。你可通过设置CNTCL来使WDTCNT从0开始计数。其定时按选定的时间周期产生中断请求。
当WDT工作在定时器模式时,WDTCTL中断标志位在定时间到时置位,因该模式下定时器中断源是单源的,当得到中断服务时其WDTCTL标志位复位。
WDTCNT计数单元
这是16位增计数器,由MSP430所选定的时钟电路产生的固定周期时钟信号对计数器进行加法计数。如果计数器事先被预置的初始状态不同,那么从开始计数到计数溢出为止所用的时间就不同。WDTCNT不能直接通过软件存取,必须通过看门狗定时器的控制寄存器WDTCTL来控制。
WDTCTL控制寄存器
15--8
7 6 5 4 3 2 1 0
口令
HOLD NMIES NMI TMSEL CNTCL SSEL IS1 IS0
WDTCTL由高8位口令和低8位控制命令组成。要写入操作WDT的控制命令,出于安全原因必须先正确写入高字节看门狗口令。口令为5AH,如果口令写错将导致系统复位。读WDTCTL时不需要口令。这个控制寄存器还可以用于设置NMI引脚功能。
ISO,IS1 选择看门狗定时器的定时输出。其中T是WDTCNT的输入时钟源周期。
0 T x 2(15)
1 T x 2(13)
2 T x 2(9)
3 T x 2(6)
SSEL 选择WDTCNT的时钟源
0 SMCLK
1 ACLK
由IS0,IS1,SSEL3可确定WDT定时时间。WDT最多只能定时8种和时钟源相关的时间。下表列出了WDT可选的定时时间(晶体为32768HZ,SMCLK=1MHZ)。
WDT的定时时间表 |
SSEL |
IS1 |
IS0 |
定时时间/ms |
0 |
1 |
1 |
0.056 |
Tsmclk x 2(6) |
0 |
1 |
0 |
0.5 |
Tsmclk x 2(9) |
1 |
1 |
1 |
1.9 |
Taclk x 2(6) |
0 |
0 |
1 |
8 |
Tsmclk x 2(13) |
1 |
1 |
0 |
16 |
Taclk x 2(9) |
0 |
0 |
0 |
32 |
Tsmclk x 2(15) (PUC复位后的值) |
1 |
0 |
1 |
250 |
Taclk x 2(13) |
1 |
0 |
0 |
1000 |
Taclk x 2(15) |
|
|
|
|
|
|
|
|
CNTCL 当该位为1时,清除WDTCNT。
TMSEL 工作模式选择
0 看门狗模式
1 定时器模式
NMI 选择RST/NMI引脚功能,在PUC后被复位。
0 RST/NMI引脚为复位端
1 RST/NMI 引脚为边沿触发的非屏蔽中断输入。
NMIES 选择中断的边沿触发方式
0 上升沿触发NMI中断
1 下降沿触发NMI中断
HOLD 停止看门狗定时器工作,降低功耗。
0 WDT功能激活
1 时钟禁止输入,计数停止
还是个简单例子:
#include "msp430x22x4.h"
/*************************************************************************/
//看狗门WDT计数器清零子程序
void clear_wdt (void)
{
WDTCTL = WDTPW + WDTCNTCL; //看门狗计数器清零(WDTCTL=0x5A08)
}
/*************************************************************************/
//主程序
void main(void)
{
unsigned int i;
WDTCTL = WDTPW + WDTHOLD; //先关看门狗(WDTCTL=0x5A80)
P1DIR |= BIT1; //使P1.1为输出
P1OUT |= BIT1; //关LED
for(i=0;i<60000;i++); //延时
P1OUT &= ~BIT1; //开LED
for(i=0;i<60000;i++); //延时
WDTCTL = WDTPW; //开看门狗(WDTCTL=0x5A00)
for(i=0;i<10;i++)
{
clear_wdt (); //不断清零,使狗无法复位
}
;
}
[
本帖最后由 ddllxxrr 于 2011-3-4 06:48 编辑 ]