前言:
看门狗,眼熟的名字。无论在普通的 51,还是高级的 ARM。都离不开他的身影。一个完整的系统总需要一个看门狗,在你程序跑飞的时候帮你一把,使系统重新进入工作状态。它无疑是世界上最忠诚的狗。不过可千万别忘了喂它。
关于看门狗的详细原理介绍见我的另一篇文章
实验功能: 演示打开看门狗后没有喂狗系统不断复位的情况。
实验讲解: CC2530 的看门狗很简单,只需要配置 1 个寄存器 WDCTL。功能如下表所示: (详细参考 CC2530 datasheet.pdf)
按照表格寄存器内容,我们对 WDCTL 具体配置可如下:
Init_Watchdog:
WDCTL = 0x00; //这是必须的,打开 IDLE 才能设置看门狗
WDCTL |= 0x08; //时间间隔一秒,看门狗模式
FeedDog:
WDCTL = 0xa0; //按寄存器描述来喂狗
WDCTL = 0x50;
完整程序:
/*描述:打开看门狗后,得记得喂狗,不然
系统就会不停地复位了。
**************************************/
#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();//防止程序跑飞
}
}
实验现象:
如果不执行喂狗,则系统将不断复位,会导致绿灯常灭。如果执行喂狗,则绿灯闪烁。