看门狗,眼熟的名字。无论在普通的 51,还是高级的 ARM。都离不开他的身影。
一个完整的系统总需要一个看门狗,在你程序跑飞的时候帮你一把,使系统重新进入工作状态。它无疑是世界上最忠诚的狗。不过可千万别忘了喂它。
CC2530 的看门狗很简单,只需要配置 1 个寄存器 WDCTL。功能如下表所示: (详细参考 CC2530 datasheet.pdf)
按照表格寄存器内容,我们对 WDCTL 具体配置可如下:
Init_Watchdog: WDCTL = 0x00; //这是必须的,打开 IDLE 才能设置看门狗 WDCTL |= 0x08; //时间间隔一秒,看门狗模式 FeedDog: WDCTL = 0xa0; //按寄存器描述来喂狗 WDCTL = 0x50;
完整代码:
/************************************** 程序描述:打开看门狗后,得记得喂狗,不然 系统就会不停地复位了。把喂狗注 释掉观察 LED1 现象 **************************************/ #include <ioCC2530.h> #define uint unsigned int #define uchar unsigned char //定义控制 LED 灯的端口 #define LED1 P1_0 #define LED2 P1_1 //定义 LED2 为 P11 口控制 //函数声明 void Delayms(uint xms); //延时函数 void InitLed(void); //初始化 P1 口 /**************************** //延时函数 *****************************/ void Delayms(uint xms) //i=xms 即延时 i 毫秒 { uint i,j; for(i=xms;i>0;i--) for(j=587;j>0;j--); } /**************************** //初始化程序 *****************************/ void InitLed(void) { P1DIR |= 0x03; //P1_0、 P1_1 定义为输出 P1INP |= 0X03; //打开下拉 LED1 = 0; //LED1 灯熄灭 LED2 = 0; //LED2 灯熄灭 } void Init_Watchdog(void) { WDCTL = 0x00; //这是必须的,打开 IDLE 才能设置看门狗 WDCTL |= 0x08; //时间间隔一秒,看门狗模式 } void FeetDog(void) { WDCTL = 0xa0; WDCTL = 0x50; } /*************************** //主函数 ***************************/ void main(void) { InitLed(); //调用初始化函数 Init_Watchdog(); LED1=1; while(1) { LED2=~LED2; //仅指示作用。 Delayms(300); LED1=0; //通过注释测试,观察 LED1,系统在不停复位。 FeetDog(); //喂狗,防止程序跑飞 } }