标签:
一.前言
今天,我们要通过实验学习和认识一下看门狗的使用,看门狗是为了防止防止程序跑飞的,通过不断的喂狗,使看门狗能持续监管程序的运行状态,当程序跑飞时,能及时把程序拽回来。
二.原理与分析
在CPU 可能受到一个软件颠覆的情况下,看门狗定时器(WDT)用作一个恢复的方法。当软件在选定时间间隔内不能清除WDT 时,WDT 必须就复位系统。看门狗可用于受到电气噪音、电源故障、静电放电等影响的应用,或需要高可靠性的环境。如果一个应用不需要看门狗功能,可以配置看门狗定时器为一个间隔定时器,这样可以用于在选定的时间间隔产生中断。这也是我们学习看门狗的作用,我们首先要配置WDT寄存器,WDT寄存器如下:
这次实验选用的是看门狗模式,时间间隔1秒检测一次,清除位也要配置,相当于喂狗。
三.程序
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0 //P1_0连接LED1
#define LED2 P1_1 //P1_1连接LED2
#define LED3 P1_4 //P1_4连接LED3
//函数声明 void LED_IO_Init(void); void Watchdog_Init(void); void FeetDog(void); void Delayms(uint xms);
/********************* 函 数 名 : main 功能描述 : WatchDog测试(通过注释掉“喂狗函数”来观察实验现象) 输入参数 : NONE 输出参数 : NONE 返 回 值 : NONE ****************/
void main(void)
{
LED_IO_Init(); //LED IO初始化
Watchdog_Init(); //看门狗初始化
while(1)
{
LED1=~LED1;
Delayms(1000); //通过注释测试,可以看到LCD1以少于1s的时间间隔闪烁,说明系统在不停地复位 //
FeetDog(); // 防止程序跑飞
} }
/*************** 函 数 名 : LED_IO_Init 功能描述 : LED_IO初始化函数 输入参数 : NONE 输出参数 : NONE 返 回 值 : NONE *********/
void LED_IO_Init(void)
{
P1DIR=0xff;
LED1=0; //点亮LED1
LED2=0; //点亮LED2,指示作用
LED3=1; //点亮LED3,指示作用
}
/************************ 函 数 名 : Watchdog_Init 功能描述 : 看门狗初始化函数 输入参数 : NONE 输出参数 : NONE 返 回 值 : NONE *************************/
void Watchdog_Init(void)
{
WDCTL = 0x00; //这是必须的,打开IDLE才能设置看门狗
WDCTL |= 0x08; //时间间隔一秒,看门狗模式
}
/************************ 函 数 名 : FeetDog 功能描述 : 喂狗函数 输入参数 : NONE 输出参数 : NONE 返 回 值 : NONE ************************/
void FeetDog(void) { WDCTL = 0xa0; WDCTL = 0x50; }
/*************************** 函 数 名 : Delayms 功能描述 : 毫秒延时 输入参数 : xms:延时时间,如 i=xms 即延时i/2毫秒 输出参数 : none 返 回 值 : none ***********************/
void Delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=587;j>0;j--);
}
四.总结
通过上面这个程序,我们可以看出,主程序里一直在执行FeetDog()这个函数,也就是说一直在喂狗,使看门狗不进行复位,如果没有喂狗这个函数,看门狗就要咬人了,也就是让程序不断的复位,从头开始执行,看门狗在实际项目应用中,还是很常见的,希望大家多多理解。
标签:
原文地址:http://www.cnblogs.com/sjsxk/p/5351440.html