程序在主程序中没有连续改变小灯的状态,而在开始运行时将系统复位,点亮再复位。实验现象是一只小灯不断闪烁,这是因为程序中启动了看门狗,看门狗时间长度为1 秒,如果 1 秒内没有复位看门狗的话,系统将复位。系统复位后再次开启看门狗,1 秒后复位。
WDCTL(看门狗定时器控制寄存器)
7:4 CLR[3:0] 看门狗复位(喂狗),先写0xa 再写0x5 复位看门狗,两次写入不超过0.5个看门狗周期,读出为0000
3 EN 看门狗定时器使能位,在定时器模式下写0 停止计数,在看门狗模式下写0 无效
0 停止计数
1 启动看门狗/ 开始计数
2 MODE 看门狗定时器模式
0 看门狗模式
1 定时器模式
1:0 INT[1:0] 看门狗时间间隔选择
00 1 秒
01 0.25 秒
10 15.625 毫秒
11 1.9毫秒
(以32.768K 时钟计算)
void Init_IO(void);
函数原型:
1 void Init_IO(void) 2 { 3 P1DIR = 0x03; 4 led1 = 1; 5 led2 = 1; 6 }
函数功能:将P10,P11 设置为输出控制LED 。
void Init_Watchdog(void);
函数原型:
1 void Init_Watchdog(void) 2 { 3 WDCTL = 0x00; 4 //时间间隔一秒,看门狗模式 5 WDCTL |= 0x08; 6 //启动看门狗 7 }
函数功能:以看门狗模式启动看门狗定时器,看门狗复位时隔1 秒。
void Init_Clock(void);
函数原型:
1 void Init_Clock(void) 2 { 3 CLKCON = 0X00; 4 }
函数功能:将系统时钟设为晶振,低速时钟设为晶振,程序对时钟要求不高,不用等待晶振稳定。
1 //main.c 2 3 # include <ioCC2430.h> 4 5 #define uint unsigned int 6 7 #define led1 P1_0 8 #define led2 P1_1 9 10 void Init_IO(void) 11 { 12 P1DIR = 0x03; 13 led1 = 1; 14 led2 = 1; 15 } 16 17 void Init_Watchdog(void) 18 { 19 WDCTL = 0x00; 20 //时间间隔一秒,看门狗模式 21 WDCTL |= 0x08; 22 //启动看门狗 23 } 24 25 void Init_Clock(void) 26 { 27 CLKCON = 0X00; 28 } 29 30 void Delay(void) 31 { 32 uint n; 33 for(n=50000;n>0;n--); 34 for(n=50000;n>0;n--); 35 for(n=50000;n>0;n--); 36 for(n=50000;n>0;n--); 37 for(n=50000;n>0;n--); 38 for(n=50000;n>0;n--); 39 for(n=50000;n>0;n--); 40 } 41 42 void main(void) 43 { 44 Init_Clock(); 45 Init_IO(); 46 Init_Watchdog(); 47 48 led1=0; 49 Delay(); 50 led2=0; 51 while(1) 52 { 53 54 } //喂狗指令(加入后系统不复位,小灯不闪烁) 55 }