zigbee CC2530 系列教程 10 看门狗实验

所有课程见此链接:

zigbee CC2530 系列教程 0 课程介绍

4.9看门狗实验

4.9.1 实验目的

1.学习CC2530看门狗的工作方式;

2.学习看门狗功能在系统中的运行机制;

4.9.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();//防止程序跑飞

    }

}

4.8.3 实验效果

在定时喂狗的情况下,软件程序正常运行,D3(LED1)上电后长亮,D4(LED2)按照延时闪烁。

将喂狗程序注释掉,软件程序会按照预先设定的喂狗频率进行复位,从而导致D3(LED1)也按照喂狗频率闪烁,证明系统在不停的复位。

发布了133 篇原创文章 · 获赞 51 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/aa120515692/article/details/104007097
今日推荐