1, 看门狗定时器概述

看门狗定时器(WDT)是 MSP430 系列单片机中常用的一种部件。
在工业现场,往往会由于供电电源、空间电磁干扰或其他原因引起强烈的干扰噪声。这些干扰作用于
数字器件,极易使其产生误动作,从而失去应有的控制功能,引起 MSP430 发生“程序跑飞”事故。若不
进行有效的处理,程序就不能回到正常的状态,从而失去应有的控制功能。
看门狗定时器正是为了解放这类问题而产生的,尤其是在具有循环结构的程序任务中更为有效。
在正常操作器件,一次 WDT 定时时间到,将产生一次器件复位。如果通过编制程序使 WDT 定时时
间稍大于程序执行一遍所用的时间时,并且程序执行过程中都有对看门狗定时器清零的指令,使计数器重
新计数,则程序正常执行时,就会在 WDT 定时时间到达之前对 WDT 清零,不会产生 WDT 溢出,如果由
于干扰使程序跑飞,则不会在 WDT 定时时间到达之前执行 WDT 清零指令,WDT 就会产生溢出,从而产
生系统复位 CPU 需用重新运行用户程序,这样程序就可以又恢复正常运行状态。
MSP430 看门狗除了具有上述系统监测的特定用途之外,还可以作为内部定时器来使用,当选择的时
间到达之后,和其他定时器一样产生一个定时中断。此外 WDT 还可以被完全停止活动以支持超低功耗应

2 看门狗定时器结构

 

ups bios 看门狗 msp430 看门狗_ups bios 看门狗

3 看门狗定时器寄存器

[1] WDTCTL 看门狗控制寄存器

 

ups bios 看门狗 msp430 看门狗_寄存器_02

WDTCTL 由两部分组成:
高 8 位是对 WDT 操作的控制命令。要写入操作 WDT 的控制命令,出于安全原因必须先正确写入高字节
看门狗口令。口令位 5AH,如果口令写错将导致系统复位。
读 WDTCTL 时,不需要口令,可直接读取地址 120H 中的内容,读出数据低字节位 WDTCTL 的值,高字
节始终位 69H。WDTCTL 除了看门狗定时器的控制位之外,还有两个用于设置 NMI 引脚功能。
WDTISx:选择看门狗定时器的计时输出
其中 T 是 WDTCNT 的输入时钟源周期。
0 T×2
15
1 T×2
13
2 T×2
9
3 T×2
6
WDTSSEL:选择 WDTCNT 的时钟源
0 SMCLK
1 ACLK
由 WDTISx 及 WDTSSEL 位便可确定 WDT 定时时间,因此通过软件对计数器设置不同的初始值就可实现
不同时间的定时。与其他定时器不同之处在于,WDT 最多只能定时 8 种和时钟源相关的时间。
 

WDTCNTCL:看门狗计数器清零位
0: 无操作
1: 将 WDTCTL 的值清零
当该位为 1 时,清除 WDTCNT。
WDTTMSEL:工作模式选择
0 看门狗模式;
1 定时器模式。
WDTNMI:选择 RST/NMI 引脚功能(在 PUC 后被复位)
0 RST/NMI 引脚为复位端;
1 RST/NMI 引脚为边沿触发的非屏蔽中断输入。
WDTNMIES:选择中断的边沿触发方式
0 WDT 功能激活;
1 时钟禁止输入,计数停止。
WDTHOLD:停止看门狗计数器
0 WDT 功能激活
1 时钟禁止输入,计数停止

 [2] WDTCNT 计数单元

 WDTCNT 时 16 位增计数器,由于 MSP430 所选定的时钟电路产生的固定周期脉冲信号对计数器进行加法计数。如果计数器事先被预置的初始状态不同,那么从开始计数到计数溢出为止的时间就不同。WDTCNT不能直接通过软件直接通过软件存取,必须通过看门狗定时器的控制寄存器 WDTCTL 来控制。

[3] IE1 中断允许寄存器

 

ups bios 看门狗 msp430 看门狗_引脚_03

WDTIE:看门狗定时器模式中断允许控制位

  0 看门狗定时器中断禁止

  1 看门狗定时器中断允许

NMIIE:非屏蔽中断允许控制位

  0 禁止非屏蔽中断

  1 允许非屏蔽中断

[4] IFG1 中断标志寄存器

ups bios 看门狗 msp430 看门狗_寄存器_04

WDTIFG:看门狗定时器模式中断标志
  0 无看门狗定时器中断标志
  1 有看门狗定时器中断标志
NMIIFG:非屏蔽中断标志
  0 无非屏蔽中断标志
  1 有非屏蔽中断标志

4 看门狗定时器操作

用户可以通过 WDTCTL 寄存器中的 WDTTMSEL 和 WDTHOLD 控制位设置 WDT 工作在看门狗模式、定
时器模式和低功耗模式。
[1] 看门狗模式
由于在上电复位或系统复位时,WDTCNT 和 WDTCL 两寄存器内容被全部清除(晶振为 32768Hz,
SMCLK=1MHz):
复位后,工作在看门狗模式,以 ACLK 为时钟,WDT 定时时间为 32ms。
上述情况将导致 WDT 的运行自动进入看门狗模式。
所以,用户软件一般都需要进行如下操作:
n 进行 WDT 的初始化:设置合适的时间(通过 SSEL、IS0、IS1 位来选定)。
n 周期性的对 WDTCNT 清零:防止 WDT 溢出,保证 WDT 的正确使用。
n 在看门狗模式下,如果计数器超过了定时时间,就会产生复位和激活系统上电清除信号,系统从上电
复位的地址重启动。
n 如果系统不用看门狗功能,应该在程序开始处禁止看门狗功能。
[2] 定时器模式

WDTCTL 的 WDTTMSEL 位置位选择定时器模式。这一模式产生选定时间的周期性中断。定时时间
可以通过 WDTCTL 的 WDTCNCTL 位置位来开始。
改变定时时间而不同时清楚 WDTCNT 将导致不可预料的系统立即复位或中断。定时时间可以通过
WDTCTL 的 CNCTL 位置位来开始。
如果先后分别进行清除和定时时间选择,则可能立即引起不可预料的系统复位或中断。
另外,在终场工作时。改变时钟源可能导致 WDTCNT 额外的计数时钟。

5,看门狗定时器示例程序

例:使用看门狗定时器功能产生一个方波(周期的取反 P1.0)。

1 #include <msp430f169.h>
 2 #define uchar unsigned char
 3 #define uint  unsigned int
 4 uchar flag = 0;
 5 /**
 6  *  系统时钟初始化,外部8M晶振
 7  */
 8 void Clock_Init()
 9 {
10     uchar i;
11     BCSCTL1&=~XT2OFF;                 //打开XT2振荡器
12     BCSCTL2|=SELM1+SELS+DIVS0+DIVS1;              //MCLK为8MHZ,SMCLK为1MHZ
13     do{
14         IFG1&=~OFIFG;                   //清除振荡器错误标志
15         for(i=0;i<100;i++)
16             _NOP();
17     }
18     while((IFG1&OFIFG)!=0);           //如果标志位1,则继续循环等待
19     IFG1&=~OFIFG;
20 }
21 
22 /**
23  * main.c
24  */
25 void main(void)
26 {
27     uchar time =0;
28     WDTCTL = WDTPW + WDTTMSEL + WDTCNTCL;    // 定时32ms
29     IE1 = WDTIE;
30     P6DIR = BIT0;
31     _EINT();
32     while(1)
33     {
34         while(flag)
35         {
36             flag = 0;
37             time++;
38             if(time==16)
39             {
40                 P1OUT = (~P1OUT&BIT0);
41                 time =0;
42             }
43         }
44 
45     }
46 }
47 /*
48  * 中断函数
49  */
50 #pragma vector = WDT_VECTOR;
51 __interrupt void WDT_LED()
52 {
53     flag = 1;
54 }