所有课程见此链接:
4.9看门狗实验
1.学习CC2530看门狗的工作方式;
2.学习看门狗功能在系统中的运行机制;
有过项目开发经验的读者对于看门狗应该并不陌生,而且看门狗对于一个系统的可靠的运行有着至关重要的作用,它会在软件程序跑飞的情况下,对系统进行复位,以保证程序重新开始正常运行,但是前提是定时喂狗。
CC2530 的看门狗控制较为简单,只涉及到一个寄存器WDCTL,其功能描述如下表4-9所示:
表4-9看门狗控制相关寄存器
系统电源模式控制寄存器PCON(0x87) |
清除计数器值Bit[7:4] |
在看门狗模式下,如果此四位在一个看门狗周期内先后写入0xA,0x5, 则清除 WDT 的值。简称喂狗。 |
|
WDT 工作模式选择寄存器Bit[3:2] |
00 |
IDLE |
|
01 |
IDLE(未使用) |
||
10 |
看门狗模式 |
||
11 |
定时器模式 |
||
看门狗周期选择寄存器Bit[1:0] |
00 |
1 秒 |
|
01 |
0.25 秒 |
||
10 |
15.625 毫秒 |
||
11 |
1.9 毫秒 |
根据表中相关寄存器的功能说明,具体进行如下配置:
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
//函数声明
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定义为输出
LED1 = 1; //LED1灯熄灭
LED2 = 1; //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();//防止程序跑飞
}
}
在定时喂狗的情况下,软件程序正常运行,D3(LED1)上电后长亮,D4(LED2)按照延时闪烁。
将喂狗程序注释掉,软件程序会按照预先设定的喂狗频率进行复位,从而导致D3(LED1)也按照喂狗频率闪烁,证明系统在不停的复位。