一、实验介绍
看门狗定时器是一个计数器。给看门狗定时器设定一个定时器间隔值,程序运行时看门狗定时器开始从0计数,若看门狗定时器计数到给定的定时器间隔值时,认为是程序进入卡死状态,则强制复位系统;如哦程序正常运行,则CPU隔一段时间复位一次看门狗定时器,使其重新从0计数。
看门狗可用于受到电气噪音、电源故障、静电放电等影响的应用,或需要高可靠性的环境。如果一个应用不需要看门狗功能,可以配置看门狗定时器为一个间隔定时器,这样可以用于在选定的时间间隔产生中断。
门狗定时器的特性如下:
- 四个可选的定时器间隔;
- 看门狗模式;
- 定时器模式;
- 在定时器模式下产生中断请求。
看门狗可以配置为一个看门狗定时器或一个通用的定时器。看门狗定时器模块的运行由WDCTL寄存器控制。看门狗定时器包括一个15位计数器,它的频率由32kHz时钟源规定。注意用户不能获得15位计数器的内容。在所有供电模式下,15位计数器的内容保留,且当重新进入主动模式,看门狗定时器继续计数。
二、实验目的
- 通过本实验连接CC2530的看门狗功能的运用。
三、实验设备
3.1、硬件设备
- ZIGBEE开发板
- SmartRF04EB仿真器
3.2、软件环境
- IAR Embedded Workbench for 8051集成开发环境
四、实验原理
4.1、看门狗模式
系统复位后看门狗定时器被禁用。
通过配置WDCTL的第3、2位为10可以设置为看门狗模式,此时看门狗定时器开始从0计数。
如果看门狗定时器运行在看门狗模式,就无法禁用定时器,即如果再次往WDCTL寄存器的第3、2位写入00或01将被视为无效。
在看门狗模式下,看门狗定时器使能,就无法通过配置WDCTL寄存器后2位改变模式,且给定的定时器间隔值无法被修改。在该模式下,看门狗定时器不会产生中断请求。
4.2、定时器模式
通过配置WDCTL寄存器的第3、2位为11可将看门狗定时器设置为定时器模式。
定时器从0开始,当达到给定的定时器间隔值时,看门狗定时器产生一个中断请求,该中断标志可以从IRCON2寄存器的第4位查看,IEN2寄存器的第5位可以设置看门狗定时器中断使能。
在定时器模式下,通过往WDCTL寄存器的第4位写入1来消除定时器内容,此时计数内容更改为0。当往WDCTL寄存器的第3、2位写入00或01时可以停止定时器并把计数内容消除为0。
定时器间隔值由WDCTL后2为设置,看门狗定时器工作期间,定时器间隔值无法被修改。在定时器模式下,当计数达到定时器间隔值时,系统不会像处于看门狗模式那样被复位。
4.3、相关寄存器
看门狗定时器的一切操作都由WDCTL寄存器控制。
WDCTL定时器的第1、0位为定时器间隔值的选择。当写入00时,看门狗定时器将计数大概1s,根据不同模式做出不同指令。
WDCTL定时器的第3、2位为看门狗定时器模式的选择。当处于定时器模式时,写入00或01可以停止定时器。当从定时器模式转换为看门狗模式时,需要停止看门狗定时器,再启动看门狗定时器并设置为看门狗模式。
WDCTL定时器的第7-4位用于清除定时器。当看门狗定时器处于定时器模式时,写入0001可以清除计数内容,而此时定时器不会停止。当看门狗定时器处于看门狗模式时,先写入1010再写入0101可以实现“喂狗”,即清除计数内容。

五、实验演示
本实验将讨论在看门狗模式下观察“喂狗”与“不喂狗”LED的现象。
在本实验演示开始前,分别创建wdt.c和wdt.h文件。
首先在wdt.c文件内初始化看门狗定时器。将看门狗定时器配置为看门狗模式且定时器间隔值设置为1s,然后是往WDCTL寄存器的第7-4位分别写入1010和0101实现“喂狗”操作。
#include "headfile.h"
void wdt_init(void)
{
WDCTL |= 0x08; //0000 1000 看门狗模式 定时器间隔值为1s
}
void wdtfeet(void) //喂狗操作
{
WDCTL = 0xA0;
WDCTL = 0x50;
}
对应更新wdt.h文件:
#ifndef __WDT_H__
#define __WDT_H__
#include "headfile.h"
void wdt_init(void);
void wdtfeet(void);
#endif
接着我们在main.c内初始化看门狗定时器。此时我们来看一下如果我们不进行喂狗:
void main(void)
{
led_init();
wdt_init(); //初始化看门狗定时器
while(1)
{
delayms(500);
LED1 = 1;
}
}
可以看到,LED1每0.5s更改一次状态。这是因为我们设置看门狗定时器的定时器间隔值为1s,所以看门狗定时器计数到定时器间隔值就认为此时程序进入卡死状态,所以进行系统复位。
当我们执行喂狗操作时:
void main(void)
{
led_init();
wdt_init(); //初始化看门狗定时器
while(1)
{
delayms(500);
LED1 = 1;
wdtfeet(); //喂狗
}
}
我们可以看到,LED1在我们上电后0.5s后保持点亮。这是因为我们每0.5s即进行一次“喂狗”操作,使看门狗定时器的计数内容每0.5s就清0一次,以致于计数内容达不到定时器间隔值,所以不会认为程序进入卡死状态,所以不会复位系统。
我们可以把延时的时间改为1.5s,可以观察到不论进不进行“喂狗”操作,LED1始终保持熄灭状态,这是因为我们延时的时间已经超过了定时器间隔值,导致看门狗在延时时间未达时就进行了系统复位,使LED1保持在灭的状态。
有疑问可以加入QQ群交流:324611467
503

被折叠的 条评论
为什么被折叠?



