前段时间学习了看门狗定时器的相关内容,下面对其进行整理!
看门狗其实就是当程序由于外部或者内部的影响,使程序发生异常时,对整体程序进行一个复位操作,将程序重新步入正轨,使其正确运行的一个定时器;它独自有一个32KHZ的晶振提供频率,每隔一段时间设置的时间要进行喂狗操作,不然就会触发中断,进行复位!下面我们通过分析程序来了解一下其构造:
/***********************************************
* filename: watchdog.c
* writer : geeknuo
* time : 2017-2-2
* version : 1.0
* effect : 看门狗实验
************************************************/
#include <ioCC2530.h>
//类型定义
typedef unsigned char uint8;
typedef unsigned short uint16;
//定义IO口
#define LED1 P1_0
#define LED2 P1_1
/***********************************************
* function name : delay_ms
* function : 延时函数,单位为毫秒
* prarmeter : n_ms 为延时时间,最大不超过65535
* returned value: 无
************************************************/
void delay_ms(uint16 n_ms)
{
uint16 i,j;
for (i = 0; i < n_ms; i++)
for (j = 0; j < 535; j++);
}
/***********************************************
* function name : LED_Init
* function : 配置LED相关寄存器并设置LED初始状态
* prarmeter : 无
* returned value: 无
************************************************/
void LED_Init(void)
{
P1DIR |= 0X3; //P1_0设置为输出模式
P1SEL &= ~0X3; //P1_0设置为通用io
LED1 = 1; //默认熄灭
LED2 = 1;
}
/***********************************************
* function name : WatchDog_Init
* function : 配置看门狗相关寄存器
* prarmeter : 无
* returned value: 无
************************************************/
void WatchDog_Init(void)
{
WDCTL = 0X00; //清除寄存器,同时打开IDLE,打开后才能配置看门狗;
WDCTL |= 0X08; //开启watchdog模式
WDCTL &= ~0X03; //设置定时周期:1s内如果没有及时喂狗,则产生复位
}
/***********************************************
* function name : Feet_WatchDog
* function : 进行喂狗操作
* prarmeter : 无
* returned value: 无
************************************************/
void Feet_WatchDog(void)
{
WDCTL = 0XA0; //先写入0xa0,相当于喂狗的食物
WDCTL = 0X50; //再写入0x50 完成喂狗操作;
LED2 = ~LED2; //每次喂狗指示led反转;
}
/***********************************************
* function name : main
* function : 初始化LED和看门狗,当延时在1000ms之内时,程序现象为LED灯闪烁,当延时超过1000ms时触发中断,LED不再闪烁
* prarmeter : 无
* returned value: 无
************************************************/
void main()
{
LED_Init(); //初始化LED
WatchDog_Init(); //初始化看门狗并启动;
while(1)
{
LED1 = 1; //LED1熄灭;
//delay_ms(200); //200ms
delay_ms(2000); //led不再闪烁,由于未及时喂狗,不断复位
Feet_WatchDog(); //在看门狗中断前喂狗,不会发生复位
LED1 = 0; //LED1亮;
delay_ms(200);
/*
启动看门狗和喂狗函数,并及时喂狗,程序正常执行
LED1不断闪烁,LED2闪烁表示喂狗动作;
*/
}
}
相关数据手册内容:
整体的程序在了解寄存器的功能之后,相对应该容易了解,主要是喂狗操作需要我们再分析一下:
WDCTL = 0XA0;
WDCTL = 0X50;
/*当我们配置看门狗寄存器为看门狗模式时,程序运行我们可以通过读写寄存器的第四位到第七位来进行判断程序是否出现异常;我们先写入0X50(即0101 0000),当我们在定时周期内再写入0XA0(即1010 0000),则第四位到第七位全为0时,触发定时器,将第四位到第七位清零;如果在定时周期内没有及时清零,那个定时器执行复位操作*/