ZigBee开发(9)--基础实验看门狗

看门狗,眼熟的名字。无论在普通的 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(); //喂狗,防止程序跑飞
  }
}
原文地址:https://www.cnblogs.com/tianxxl/p/9873455.html