msp430 watchdog timer 2【原创】
0赞
上面我们提到了关于看门狗的三个寄存器下面我们来简单的认识一下
WDTCTL 控制寄存器
15 14 13 12 11 10 9 8 |
|||||||
WDTPW Read as 069h ,must be written as 05Ah |
|||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
HOLD |
NMIES |
NMI |
TMSEL |
CNTCL |
SSEL |
IS1 |
IS0 |
WDTPW Bits15-8 WDT保护字,读出为069H,写入为05AH,否则会导致系统复位PUC
HOLD Bit7 WDT停止位,该位停止看门狗
0 看门狗不禁止
1 看门狗禁止
NMIES BIT6 选择中断的边沿触发方式
0 上升沿触发NMI中断
1 下降沿触发NMI中断
NMI Bit5 选择RST/NMI引脚功能,在PUC后被复位
0 RST/NMI 引脚为复位端
1 RST/NMI 引脚为边沿触发的非屏蔽中断输入
TMSEL BIT4 工作模式选择
0 看门狗模式
1 定时器模式
CNTCL Bit3 当此位为1时,清除WDTCNT
SSEL Bit2 选择WDTCTL的时钟源
0 SMCLK
1ACLK
IS0,IS1 Bits1-0 选择看门狗定时器的定时输出。这些位选择令WDTIFG置位的WDT的时间长度,并产生一个PUC
00 WDT时钟源/32768
01 WDT时钟源/8192
10 WDT时钟源/512
11 WDT时钟源/64
IE1 中断允许寄存器1
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
|
|
NMIIE |
|
|
|
WDTIE |
NMIIE Bit4 NMI中断允许。该位允许NMI中断
0 中断禁止
1 中断允许
WDTIE Bit0 WDT中断允许位,该位允许WDTIFG的定时器模式中断,在看门狗模式下,该位不必设置。
0 中断禁止
1 中断允许
IFG1 中断标志寄存器1
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
|
|
NMIIFG |
|
|
|
WDTIFG |
NMIIFG Bit4 NMI中断标志。NMIIFG必须由软件清除。
0 没有中断刮起
1 有中断挂起
WDTIFG Bit0 WDT中断标志。看门狗模式下,WDTIFG保持置位直到被软件清除;在定时模式下,WDTIFG在进入中断服务子程序 后自动被清除。
0 没有中断挂起
1 有中断挂起
明确了看门狗定时器相关的寄存器,下面我们来看一下关于它的操作。
从上面介绍的控制位可以看出,我们可以通过WDTCTL寄存器来配置看门狗模式或者定时器模式,还可以配置RST/NMI引脚。我们需要直到WDTCTL是一个16位的,手口令保护的、可读写的寄存器,任何读或写都必须使用字指令,并且写访问还必须将写保护字05AH放到指令的高字节上,如果高字节中写入的值不是05AH,那么将产生系统复位。当读WDTCTL的值时,得到的高位字节总是069H。
将WDTCTL控制寄存器的WDTTMSEL控制位复位后,看门狗模块工作在看门狗模式,前面也说过了它会以DCOCLK为时钟源并以32ms为时长初始化。当我们使用时要么重新配置时长,要么停止或者清除看门狗来防止系统的重启。当我们将看门狗模块配置为看门狗模式时,如果对WDTCTL写入错误或者超过选定的定时时间就会导致重启。
将WDTTMSEL位置1将工作在定时器模式。该模式下将产生选定时间的周期性中断。当定时时间到达时,WDTIFG标志位将被置位,此时不会引起系统的重启。当WDTIE和GIE都置位的话,WDTIFG标志将会产生一个中断,进入与看门狗中断向量地址不同的定时器模式的中断向量地址,来执行中断服务程序。WDTIFG中断标志需要软件清除。
看门狗模块提供了一个故障保护时钟的功能,此功能用于保证在看门狗模式下,看门狗模块所用时钟不被禁止。直白一点就是说如果要进入低功耗模式,我们需要硬性的考虑看门狗模块时钟源。例如,如果ACLK是看门狗的时钟源时,我们就不能使用LPM4这种低功耗模式。
当看门狗模块用于定时器功能时是没有故障保护功能的。
对WDTCTL的写操作必须在其高字节上面写入05AH(即WDTPW),下面我们来看几条常见语句
//周期性清除一个激活的看门狗
WDTCTL = WDTPW + WDTCNTCL;
//改变定时时间
WDTCTL = WDTPW + WDTCNTL+SSEL;
//停止看门狗
WDTCTL = WDTPW + WDTHOLD;
//将WDT设置为定时器模式
WDTCTL = WDTCTL + WDTCNTCL+WDTTMSEL+WDTCTL;
4.1 利用WDT定时模式在中断函数中定时操作外设
说明:#define WDT_MDLY_32 (WDTPW+WDTTMSEL+WDTCNTCL)
void main(void)
{
WDTCTL = WDT_MDLY_32; // Set Watchdog Timer interval to ~30ms
IE1 |= WDTIE; // Enable WDT interrupt
P2DIR |= 0x01; // Set P1.0 to output direction
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 open interrupt
}
// Watchdog Timer interrupt service routine
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
P2OUT ^= 0x01; // Toggle P1.0 using exclusive-OR
}