理论学习: 无线传感网络 --ZigBee3-2 看门狗
3-3看门狗
要求:
(3)在《3-3看门狗》实验中体验了没有启用看门狗和启用看门狗对于应用程序的影响,要求修改代码,将看门狗的溢出周期修改为0.25秒,并且修改延时,检验看门狗对于应用程序的影响。
原代码
/****************************************************************************
* 文 件 名: main.c
* 作 者: Andy
* 修 订: 2013-01-09
* 版 本: 1.0
* 描 述: 打开看门狗后,得记得喂狗,不然系统就会不停地复位了
****************************************************************************/
#include <ioCC2530.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define LED1 P1_0 // P1.0口控制LED1
/****************************************************************************
* 名 称: DelayMS()
* 功 能: 以毫秒为单位延时 16M时约为535,系统时钟不修改默认为16M
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{
uint i,j;
for (i=0; i<msec; i++)
for (j=0; j<535; j++);
}
/****************************************************************************
* 名 称: InitLed()
* 功 能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
P1DIR |= 0x01; //P1.0定义为输出
LED1 = 0; //默认LED灯为熄灭状态
}
void Init_Watchdog(void)
{
WDCTL = 0x00; //打开IDLE才能设置看门狗
WDCTL |= 0x08; //定时器间隔选择,间隔一秒
}
void FeetDog(void)
{
WDCTL = 0xa0; //清除定时器。当0xA跟随0x5写到这些位,定时器被清除
WDCTL = 0x50;
}
/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
InitLed(); //调用初始化函数
Init_Watchdog();
while(1)
{
DelayMS(300);
LED1=1;
//FeetDog(); //喂狗系统将不再主动复位,LED1灯不闪烁一直亮,
//注释FeetDog函数时系统不断复位,LED1灯闪烁
}
}
分析
将 WDCTL 改为 0x09,即将时间间隔改为 0.25s,由于原来 delay 的 300ms,大于 250ms,当 led 闪烁时,led 就已经被重置了,延时时间要小于溢出时间即小于等于 0.25s,所以将延迟
改为 200ms,完成亮灭各 200ms 的操作。
修改看门狗时长:
void Init_Watchdog(void)
{
WDCTL = 0x00; //打开IDLE才能设置看门狗
WDCTL |= 0x09; //定时器间隔选择,间隔一秒
}
修改后代码
/****************************************************************************
* 文 件 名: main.c
* 作 者: Andy
* 修 订: 2013-01-09
* 版 本: 1.0
* 描 述: 打开看门狗后,得记得喂狗,不然系统就会不停地复位了
****************************************************************************/
#include <ioCC2530.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define LED1 P1_0 // P1.0口控制LED1
/****************************************************************************
* 名 称: DelayMS()
* 功 能: 以毫秒为单位延时 16M时约为535,系统时钟不修改默认为16M
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{
uint i,j;
for (i=0; i<msec; i++)
for (j=0; j<535; j++);
}
/****************************************************************************
* 名 称: InitLed()
* 功 能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
P1DIR |= 0x01; //P1.0定义为输出
LED1 = 0; //默认LED灯为熄灭状态
}
void Init_Watchdog(void)
{
WDCTL = 0x00; //打开IDLE才能设置看门狗
WDCTL |= 0x09; //定时器间隔选择,间隔一秒
}
void FeetDog(void)
{
WDCTL = 0xa0; //清除定时器。当0xA跟随0x5写到这些位,定时器被清除
WDCTL = 0x50;
}
/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
InitLed(); //调用初始化函数
Init_Watchdog();
while(1)
{
DelayMS(200);
LED1=1;
//FeetDog(); //喂狗系统将不再主动复位,LED1灯不闪烁一直亮,
//注释FeetDog函数时系统不断复位,LED1灯闪烁
}
}