MSP430学习笔记-看门狗

WDTCTL 看门狗控制寄存器

15到8
WDTPW read as 069h,must be written as 05ah
7 6 5 4 3 2 1到0
WDTHOLD WDTNMIES WDTNMI WDTTMSEL WDTCNTCL WDTSSEL WDTISx

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 种和时钟源相关的时间。
下表列出了 WDT 可选的定时时间(晶振为 32.768KHz,SMCLK=1MHz)。

WDTSSEL WDTIS1 WDTIS0 定时时间/ms 输入时钟源周期
0 1 1 0.064 Tsmclk×2的6次方
0 1 0 0.51 Tsmclk×2的9次方
1 1 1 1.95 Taclk×2的6次方
0 0 1 8.19 Tsmclk×2的13次方
1 1 0 15.63 Taclk×2的9次方
0 0 0 32.77 Taclk×2的15次方
1 0 1 250 Taclk×2的13次方
1 0 0 1000 Taclk×2的15次方

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

WDTCNT 计数单元

15-8
WDTCNT
7-0
WDTCNT

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

IE1 中断允许寄存器

7 6 5 4 3 2 1 0
NMIIE WDTIE

WDTIE:看门狗定时器模式中断允许控制位
0 看门狗定时器中断禁止
1 看门狗定时器中断允许
NMIIE:非屏蔽中断允许控制位
0 禁止非屏蔽中断
1 允许非屏蔽中断

IFG1 中断标志寄存器

7 6 5 4 3 2 1 0
NMIIFG WDTIFG

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

看门狗定时器操作

用户可以通过 WDTCTL 寄存器中的 WDTTMSEL 和 WDTHOLD 控制位设置 WDT 工作在看门狗模式、定
时器模式和低功耗模式。

看门狗模式

由于在上电复位或系统复位时,WDTCNT 和 WDTCL 两寄存器内容被全部清除(晶振为 32768Hz,
SMCLK=1MHz):
复位后,工作在看门狗模式,以 ACLK 为时钟,WDT 定时时间为 32ms。
上述情况将导致 WDT 的运行自动进入看门狗模式。
所以,用户软件一般都需要进行如下操作:

  • 进行 WDT 的初始化:设置合适的时间(通过 SSEL、IS0、IS1 位来选定)。
  • 周期性的对 WDTCNT 清零:防止 WDT 溢出,保证 WDT 的正确使用。
  • 在看门狗模式下,如果计数器超过了定时时间,就会产生复位和激活系统上电清除信号,系统从上电 复位的地址重启动。
  • 如果系统不用看门狗功能,应该在程序开始处禁止看门狗功能。

定时器模式
WDTCTL 的 WDTTMSEL 位置位选择定时器模式。这一模式产生选定时间的周期性中断。定时时间
可以通过 WDTCTL 的 WDTCNCTL 位置位来开始。

  • 改变定时时间而不同时清楚 WDTCNT 将导致不可预料的系统立即复位或中断。定时时间可以通过 WDTCTL 的 CNCTL 位置位来开始。

  • 如果先后分别进行清除和定时时间选择,则可能立即引起不可预料的系统复位或中断。

  • 另外,在终场工作时。改变时钟源可能导致 WDTCNT 额外的计数时钟。

低功耗模式
当系统不需要 WDT 做看门狗和定时器时,可关闭 WDT 以减小功耗。
控制位 WDTHOLD=1 时关闭 WDT,这时看门狗停止工作。

看门狗定时器头文件定义

在 msp430x14x.h 头文件中定义如下:

/************************************************************ * WATCHDOG TIMER ************************************************************/ 
#define WDTCTL_ (0x0120) /* Watchdog Timer Control */
DEFW( WDTCTL , WDTCTL_) 
/* The bit names have been prefixed with "WDT" */ 
#define WDTIS0 (0x0001) 
#define WDTIS1 (0x0002) 
#define WDTSSEL (0x0004) 
#define WDTCNTCL (0x0008) 
#define WDTTMSEL (0x0010) 
#define WDTNMI (0x0020) 
#define WDTNMIES (0x0040) 
#define WDTHOLD (0x0080) 
#define WDTPW (0x5A00) 
/* WDT-interval times [1ms] coded with Bits 0-2 */ 
/* WDT is clocked by fMCLK (assumed 1MHz) */ 
#define WDT_MDLY_32 (WDTPW+WDTTMSEL+WDTCNTCL) /* 32ms interval (default) */ 
#define WDT_MDLY_8 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0) /* 8ms " */
#define WDT_MDLY_0_5 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1) /* 0.5ms " */
#define WDT_MDLY_0_064 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms " */
/* WDT is clocked by fACLK (assumed 32KHz) */ 
#define WDT_ADLY_1000 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL) /* 1000ms " */
#define WDT_ADLY_250 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0) /* 250ms " */
#define WDT_ADLY_16 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms " */
#define WDT_ADLY_1_9 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)/* 1.9ms " */
/* Watchdog mode -> reset after expired time */ 
/* WDT is clocked by fMCLK (assumed 1MHz) */ 
#define WDT_MRST_32 (WDTPW+WDTCNTCL) /* 32ms interval (default) */
#define WDT_MRST_8 (WDTPW+WDTCNTCL+WDTIS0) /* 8ms " */
#define WDT_MRST_0_5 (WDTPW+WDTCNTCL+WDTIS1) /* 0.5ms " */
#define WDT_MRST_0_064 (WDTPW+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms " */
/* WDT is clocked by fACLK (assumed 32KHz) */ 
#define WDT_ARST_1000 (WDTPW+WDTCNTCL+WDTSSEL) /* 1000ms " */
#define WDT_ARST_250 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS0) /* 250ms " */
#define WDT_ARST_16 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms " */
#define WDT_ARST_1_9 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0) /* 1.9ms " */

上述定义中 WDT_MRST_32 的定义里面包括了(WDTPW+WDTCNTCL),
所以我们使用 WDT 的时候可以直接写成下面的形式:
做定时器用:
WDTCTL = WDT_ADLY_1000; // 以 ACLK 延迟 1000ms
WDTCTL = WDT_MDLY_32; // 以 SMCLK 延迟 32ms
// 记得要开 IE1 中的 WDTIE 和_EINT();
做看门狗用:
WDTCTL = WDT_ARST_1000; // 以 ACLK 设定 1000ms 的看门狗
WDTCTL = WDT_MRST_32; // 以 SMCLK 设定 32ms 的看门狗
// 由于在看门狗的定义里面包含 WDTCNCTL
// 所以需要喂狗的时候只需要再写一边 WDTCTL = WDT_MRST_32; 就行了

                                ——摘自《MSP430 系列十六位超低功耗单片机 教学实验系统实验教程》
                                         赵建 谢楷 沈雪亮 张宝 梁海军 杨乐林 庹明光 徐常志 编写

你可能感兴趣的:(msp430)