[ZigBee] 12、ZigBee之看门狗定时器——饿了就咬人的GOOD DOG

引言:硬件中的看门狗,不是门卫的意思,而是一只很凶的狗!如果你不按时喂它,它就会让系统重启!这反而是我们想要的功能~

1、看门狗概述

  看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个数字,程序开始运行后看门狗开始倒计数。如果程序运行正常,过一段时间CPU应发出指令让看门狗复位,重新开始倒计数。如果看门狗减到0就认为程序没有正常工作,强制整个系统复位。因此可以用看门狗防止程序在跑飞的时候回不到正常模式。

  看门狗可用于受到电气噪音、电源故障、静电放电等影响的应用,或需要高可靠性的环境。如果一个应用不需要看门狗功能,可以配置看门狗定时器为一个间隔定时器,这样可以用于在选定的时间间隔产生中断。

  The features of the Watchdog Timer are as follows:

● 四个可选的定时器间隔
● 看门狗模式
● 定时器模式
● 在定时器模式下产生中断请求

  WDT 可以配置为一个看门狗定时器或一个通用的定时器。WDT 模块的运行由WDCTL 寄存器控制。看门狗定时器包括一个15 位计数器,它的频率由32kHz 时钟源规定。注意用户不能获得15 位计数器的内容。在all power modes下,15 位计数器的内容保留,且当重新进入active mode,看门狗定时器继续计数。

2、看门狗模式

  当系统重启后看门狗定时器失能。To start the WDT in watchdog mode, the WDCTL.MODE[1:0] bits must be set to 10. The Watchdog Timer counter then starts incrementing from 0. When the timer is enabled in watchdog mode, it is not possible to disable the timer. Therefore, writing 00 or 01 to WDCTL.MODE[1:0] has no effect if the WDT is already operating in Watchdog mode.

  WDT 运行在一个频率为32.768 kHz(当使用32 kHz XOSC时)的看门狗定时器时钟上。这个时钟频率的超时期限等于1.9ms,15.625 ms,0.25 s 和1s,分别对应64,512,8192 和32768 的计数值设置。

  当计数器达到设定的计数值时,看门狗会对系统产生一个reset信号,如果在计数器到达设定值之前执行了看门狗clear序列,counter的值会被重置为0,并会继续递增。看们狗的clear序列包含:writing 0xA to WDCTL.CLR[3:0], followed by writing 0x5 to the same register bits within one watchdog clock period. 如果这个完整序列不能在watch dog时期结束前完成,看门狗就会产生一个系统reset信号。

  When the WDT has been enabled in watchdog mode, it is not possible to change the mode by writing to the WDCTL.MODE[1:0] bits and the timer interval value can not be changed.

3、定时器模式

  To start the WDT in timer mode, the WDCTL.MODE[1:0] bits must be set to 11. The timer is started and the counter starts incrementing from 0. When the counter reaches the selected interval value, the timer produces an interrupt request  (IRCON2.WDTIF/IEN2.WDTIE).

  In timer mode, it is possible to clear the timer contents by writing a 1 to WDCTL.CLR[0]. When the timer is cleared, the content of the counter is set to 0. Writing 00 or 01 to WDCTL.MODE[1:0] stops the timer and clears it to 0.

  The timer interval is set by the WDCTL.INT[1:0] bits. The interval cannot be changed during timer operation, and should be set when the timer is started. In timer mode, a reset is not produced when the timer interval has been reached.

  注意:如果看门狗模式被选择,那只能等到芯片reset之后定时器模式才能被选择。

4、工程DEMO

main code:

 1 /****************************************************************************
 2 * 文 件 名: main.c
 3 * 描    述: 打开看门狗后,得记得喂狗,不然系统就会不停地复位了
 4 ****************************************************************************/
 5 #include <ioCC2530.h>
 6
 7 typedef unsigned char uchar;
 8 typedef unsigned int  uint;
 9
10 #define LED1 P1_0       // P1.0口控制LED1
11 #define LED2 P1_1       // P1.1口控制LED2
12
13
14 /****************************************************************************
15 * 名    称: DelayMS()
16 * 功    能: 以毫秒为单位延时 16M时约为535,系统时钟不修改默认为16M
17 * 入口参数: msec 延时参数,值越大,延时越久
18 * 出口参数: 无
19 ****************************************************************************/
20 void DelayMS(uint msec)
21 {
22     uint i,j;
23
24     for (i=0; i<msec; i++)
25         for (j=0; j<535; j++);
26 }
27
28 /****************************************************************************
29 * 名    称: InitLed()
30 * 功    能: 设置LED灯相应的IO口
31 * 入口参数: 无
32 * 出口参数: 无
33 ****************************************************************************/
34 void InitLed(void)
35 {
36     P1DIR |= 0x03;      //P1.0、P1.1定义为输出
37     LED1 = 1;           //默认LED灯为熄灭状态
38     LED2 = 1;
39 }
40
41
42 void Init_Watchdog(void)
43 {
44     WDCTL = 0x00;       //打开IDLE才能设置看门狗
45     WDCTL |= 0x08;      //定时器间隔选择,间隔一秒
46 }
47
48 void FeetDog(void) //喂狗
49 {
50     WDCTL = 0xa0;       //清除定时器。当0xA跟随0x5写到这些位,定时器被清除
51     WDCTL = 0x50;
52     LED2 = 0;           //系统不复位LED2灯长亮
53 }
54
55 /****************************************************************************
56 * 程序入口函数
57 ****************************************************************************/
58 void main(void)
59 {
60     InitLed();        //调用初始化函数
61     Init_Watchdog();
62
63     while(1)
64     {
65         //LED1 = ~LED1;   //仅指示作用。
66         DelayMS(300);
67         LED2=0;
68
69         //FeetDog();     //喂狗系统将不再主动复位,LED2长亮
70                        //注释FeetDog函数时系统不断复位,LED2灯闪烁
71     }
72 }

其中42~46行用于看门狗初始化:

42 void Init_Watchdog(void)
43 {
44     WDCTL = 0x00;       //打开IDLE才能设置看门狗
45     WDCTL |= 0x08;      //定时器间隔选择,间隔一秒
46 }

第44行令WDCTL为0是因为下表WDCTL中关于MODE介绍——MODE[1:0]是用来模式选择,这两位用来在Watchdog模式或Timer模式启动看门狗定时器。其中有个主意说明“如果在timer模式想切换到看门狗模式,第一步需要停止WDT,然后才能在看门狗模式启动WDT。当处在看门狗模式,向这些位写数据是无效的”。因此向MODE中写00是使让看门狗处于IDLE模式(停止timer),接着才能启动WDT。

第45行是设置INT,选择超期时限为1s(即设置INT[1:0]=00)

第48~53行是喂狗的函数,其中第50、51行设置设置WDCTL为0xa0,紧接着设置为0x50,使一个clear序列,用于清除定时器(第2节红色字体部分由介绍)

48 void FeetDog(void)
49 {
50     WDCTL = 0xa0;       //清除定时器。当0xA跟随0x5写到这些位,定时器被清除
51     WDCTL = 0x50;
52     LED2 = 0;           //系统不复位LED2灯长亮
53 }

因此,整个工程的意思是:初始化看门狗并设置1s种的喂狗期限,如果整个工程执行过程中超过1s不喂狗,看门狗timer就会产生一个系统reset信号让系统重置。因此代码中69行如果注释掉喂狗,带来的结果就是系统不断重启LED2不断闪烁;如果喂狗则LED2常亮。

Zigbee系列文章:

[ZigBee] 1、 ZigBee简介

[ZigBee] 2、 ZigBee开发环境搭建

[ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭

[ZigBee] 4、ZigBee基础实验——中断

[ZigBee] 5、ZigBee基础实验——图文与代码详解定时器1(16位定时器)(长文)

[ZigBee] 6、ZigBee基础实验——定时器3和定时器4(8 位定时器)

[ZigBee] 7、ZigBee之UART剖析(ONLY串口发送)

[ZigBee] 8、ZigBee之UART剖析·二(串口收发)

[ZigBee] 9、ZigBee之AD剖析——AD采集CC2530温度串口显示

[ZigBee] 10、ZigBee之睡眠定时器

[ZigBee] 11、ZigBee之睡眠定时器二

PS:如果您觉得还不错,点个赞,让更多人受益~

@beautifulzzzz 2016-07-20 continue~  
e-mail:[email protected] 
sina:http://weibo.com/beautifulzzzz?is_all=1

时间: 2024-07-29 06:55:08

[ZigBee] 12、ZigBee之看门狗定时器——饿了就咬人的GOOD DOG的相关文章

s3c2440看门狗定时器

S3C2440A 的看门狗定时器是用于当其由于噪声和系统错误引起的故障干扰时恢复控制器的工作.它也可以被用作普通 16 位内部定时器来请求中断服务.看门狗定时器产生 128 个 PCLK 周期的复位信号. 看门狗比较简单 ,在2440文档上才2页介绍. 看门狗定时器只使用 PCLK 作为其时钟源.预分频 PCLK 频率来产生相应看门狗定时器时钟,再将其结果频率分频. 看到了,跟前面的timer一样也是利用PCLK作为时钟源,可以使用以下等式来计算看门狗定时器的频率和每个定时器时钟周期的持续时间:

S5PV210时钟,看门狗定时器

晶振:时钟源(操作主要有两个,倍频,分频) A8的时钟源: 时钟域,每个时钟域(不同的最高频率和最低频率)管理着不同的电路模块: 不同的时钟域对应不同电路模块表 时钟电路:懂得看时钟电路(时钟源选择开关配置(MUX_apll),倍频的配置(APLL),分频的配置(DIV_apll)) 更具体可参看arm,007笔记 -------------------------------------------------------------------------------------------

给NIOS II CPU增加看门狗定时器并使用

给NIOS II CPU增加看门狗定时器并使用 ? 配置看门狗定时器: 设置计时溢出时间为1秒 计数器位宽为32位 勾选No Start/Stop control bits 勾选Fixed period 不勾选Readable snapshot 勾选System reset on timeout.(Watchdog) 不勾选Timeout Pulse (1 clock wide) 这部分配置可以参见"Embedded Peripheral IP User Guide.pdf"中Inte

LPC1768的看门狗定时器使用

void wwdg_init(void) { LPC_SC->PCLKSEL0 |= (3<<0);//分频数为八分频 LPC_WDT->WDCLKSEL &= ~(3<<0); LPC_WDT->WDCLKSEL |= (1<<0);//设置wdt时钟为apb LPC_WDT->WDCLKSEL |= (1<<31);//锁定时钟源 LPC_WDT->WDTC = 0xffff;//设定重载值 LPC_WDT->

zigbee学习之路(十一):看门狗

一.前言 今天,我们要通过实验学习和认识一下看门狗的使用,看门狗是为了防止防止程序跑飞的,通过不断的喂狗,使看门狗能持续监管程序的运行状态,当程序跑飞时,能及时把程序拽回来. 二.原理与分析 在CPU 可能受到一个软件颠覆的情况下,看门狗定时器(WDT)用作一个恢复的方法.当软件在选定时间间隔内不能清除WDT 时,WDT 必须就复位系统.看门狗可用于受到电气噪音.电源故障.静电放电等影响的应用,或需要高可靠性的环境.如果一个应用不需要看门狗功能,可以配置看门狗定时器为一个间隔定时器,这样可以用于

CC2541蓝牙学习——看门狗

看门狗是在软件跑飞的情况下CPU自恢复的一个方式,看门狗分为硬狗和软狗,硬狗就是由专门的看门狗硬件电路实现看门狗功能,看门狗芯片也比较多,比如DS1232,除了看门狗功能外还有电源电压监测功能.软狗就是由软件实现的看门狗功能,现在很多CPU都自带了软狗,很难说硬狗好还是软狗好,如果软狗够用,尽量使用软狗简化设计,看门狗说白了就是一个定时器!,当软件在选定的时间间隔内不能置位看门狗定时器(WDT),WDT就复位系统.看门狗可用于电噪声,电源故障或静电放电等恶劣工作环境或高可靠性要求的环境.如果系统

第三十七天:Tiny驱动开发之看门狗中断

1.    看门狗原理 Watchdog原理上就是一个定时器.定时器timer对时钟进行计数,当定时器溢出时,产生复位信号,使得整个系统复位.在程序或嵌入式系统中,需要 定期的对看门狗timer进行复位重新计数,定时器不会溢出复位系统,从而保证系统的正常运行.当某种原因(例如干扰)引起程序跑飞或者进入死循环时,程 序不能定期的复位看门狗timer, 计数溢出产生复位信号,导致系统复位. 设本系统程序完整运行一周期的时间是T1,看门狗的定时周期为T2,T2>T1,在程序运行一周期后就修改定时器的计

Part5核心初始化_lesson3---关闭看门狗

1.看门狗---作用 2.看门狗工作方式 3.原理图 时钟源来自于PCLK经过分频器,经过选择器,输出到作为看门狗定时器,WTDAT为一个预载值,当它计数为零的时候,还没有给WTDAT赋值,那么它会发出一个重启信号RESET. 找到S3C6410X文件,找到里面的watch dog章节, 关闭代码如下: start.s代码:

(4)MSP430F5529 看门狗的设置

看门狗定时器(Watchdog Timer(WDT_A))实际上是一个特殊的定时器,即可以用来作为看门狗使用,也可以用作定时器. 所谓的看门狗功能,是指可以监控程序是否由于某些干扰或者错误而跑飞.其原理就是发生故障的时间满足规定的定时时间后,产生一个非屏蔽中断,使系统复位.这样当在调试程序或预计程序在某个地方可能瞬时发生错误时(如外部电路干扰),选用设置看门狗定时中断可以避免程序跑飞. 当然,它也可以用作一般的定时功能. 不过实际上,由于看门狗定时器(作看门狗使用时)需要很严密的设置(否则程序容