|
计时器模式
将WDCTL.MODE[1:0]设置为11,WDT处于计时器模式。一旦设定WDCTL.MODE[1:0]为11,计数器就开始从0计数,当计数值达到设定的的计数值(32768、8192、512或者64),便会产生看门狗中断请求,IEN2.WDTIE看门狗中断使能的情况下,IRCON2.WDTIF看门狗中断标志位变为1。注意中断使能信号放在WDCTL.MODE[1:0]配置前面,不然计数器开始计时了,还没有开中断。
在计数器模式下,WDCTL.CLR[0]为1则清除计数器,然后从0开始计数,并不会停止计数器,WDCTL.MODE[1:0]设置为00,计数器停止工作并且计数值清0。在计数器工作的时候,写入
WDCTL.INT[1:0] 无效,定时时间间隔无法改变,当计数器达到设定值时,并不会产生系统复位信号。如果定时器不够用的时候可以用该定时器,但是定时的时间只有4种选择。
计时器模式
示例:WDT处于计时器模式,中断方式,LED灯闪烁,0.25s状态改变一次
复制代码
1 /******************************************************************************
2 *文 件 名:WDT.c
3 *作 者:陈照
4 *时 间:2015-06-01
5 *版 本:1.0
6 *描 述:WDT计时器模式
7 ******************************************************************************/
8 #include
9
10 typedef unsigned char uchar;
11 typedef unsigned int uint;
12
13 #define LED1 P1_0
14
15 /******************************************************************************
16 *函 数 名:Delay1ms
17 *功 能:延时1ms
18 *入口参数:uiDelay,延时参数,值越大,延时越长
19 *出口参数:无
20 ******************************************************************************/
21 void Delay1ms(unsigned int uiDelay)
22 {
23 unsigned int i,j;
24 for(i = 0; i < uiDelay; i++)
25 {
26 for(j = 0;j < 1322; j++);
27 }
28 }
29
30 /****************************************************************
31 *函 数 名:InitClock
32 *功 能:系统时钟初始化
33 *入口参数:无
34 *出口参数:无
35 *****************************************************************/
36 void InitClock(void)
37 {
38 CLKCONCMD &= ~(1 << 6); //选择32MHz晶振
39 while(CLKCONSTA & (1 << 6)); //等待时钟稳定
40 CLKCONCMD &= ~0x47; //系统时钟和定时器时钟都是32M
41 }
42
43 /******************************************************************************
44 *函 数 名:InitLED
45 *功 能:LED灯初始化
46 *入口参数:mode,mode为1则点亮所有LED,mode为0则熄灭所有LED
47 *出口参数:无
48 ******************************************************************************/
49 void InitLED(uchar mode)
50 {
51 P1SEL &= ~0x01; //P1.0设置为通用I/O口
52 P1DIR |= 0x01; //P1.0设置为输出
53 LED1 = mode; //LED灯亮熄控制
54 }
55
56 /******************************************************************************
57 *函 数 名:Init_Watchdog
58 *功 能:看门狗初始化
59 *入口参数:无
60 *出口参数:无
61 ******************************************************************************/
62 void Init_Watchdog(void)
63 {
64 WDCTL = 0x00; //打开IDLE 才能设置计时器间隔时间
65 WDCTL |= 0x0d; //设定为计时器模式,定时器间隔为0.25秒
66 }
67
68 /******************************************************************************
69 *函 数 名:WDT_ISR
70 *功 能:WDT计时器模式中断服务程序
71 *入口参数:无
72 *出口参数:无
73 ******************************************************************************/
74 #pragma vector = WDT_VECTOR
75 __interrupt void WDT_ISR(void)
76 {
77 WDTIF = 0; //看门狗中断清除
78 LED1 = ~LED1; //定时时间到,LED状态翻转
79 }
80
81 /******************************************************************************
82 *程序入口函数
83 ******************************************************************************/
84 int main(void)
85 {
86 InitClock(); //时钟初始化,32MHz
87 InitLED(0); //LED初始化,熄灭LED1
88 IEN2 |= 0x20; //看门狗中断使能
89 EA = 1; //开总中断
90 Init_Watchdog(); //看门狗初始化
91
92 while(1)
93 {
94 };
95 }
|
|