zigbee 看门狗
zigbee吧
全部回复
仅看楼主
level 5
绝零残冰 楼主
再好的操作系统,不管是现在的Win7还是以后Win8、Win9,总会出现BlueScreen的时候,更何况是小小的单片机呢~ 电气噪声、电源故障、静电放电等不可预知的原因,都可能造成嵌入式系统的运行出现异常。  而看门狗(Watch Dog),准确的说应该是看门狗定时器,则正是专门用来监测单片机程序运行状态的电路结构。其基本原理是:启动看门狗定时器后,它就会从0开始计数,若程序在规定的时间间隔内没有及时对其清零,看门狗定时器就会复位系统(相当于重启电脑),如下图所示(word画的,画得比较eggache~):
  下面我们就来介绍简单的看门狗应用方法:怎么放狗?怎么喂?若不喂,会出现什么情况?
二、看门狗的故事(1)实验简介  若喂狗,系统正常运行;若不喂狗,系统不断重启。
(2)程序流程图
(3)实验源码及剖析/*
实验说明:看门狗实验,若不喂狗,系统一直重启。
*/
#include <ioCC2430.h>
#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
void xtal_init(void)
{
SLEEP &= ~0x04; //都上电
while(!(SLEEP & 0x40)); //晶体振荡器开启且稳定
CLKCON &= ~0x47; //选择32MHz 晶体振荡器
SLEEP |= 0x04;
}
/*LED初始化
-------------------------------------------------------*/
void led_init(void)
{
P1SEL = 0x00; //P1为普通 I/O 口
P1DIR |= 0x0F; //P1.0 P1.1 P1.2 P1.3 输出
led1 = 1; //关闭所有LED
led2 = 1;
led3 = 1;
led4 = 1;
}
/*看门狗初始化
-------------------------------------------------------*/
void watchdog_Init(void)
{
WDCTL = 0x00; //看门狗模式,时间间隔一秒
WDCTL |= 0x08; //启动看门狗
}
/*喂狗程序
-------------------------------------------------------*/
void FeetDog(void)
{
WDCTL = 0xa0;
WDCTL = 0x50;
}
/*延时函数(小于1秒。读者可以想一下,若大于1秒,会出现什么情况)
-------------------------------------------------------*/
void Delay(void)
{
unsigned int n;
for(n=50000;n>0;n--);
for(n=50000;n>0;n--);
for(n=50000;n>0;n--);
for(n=50000;n>0;n--);
for(n=50000;n>0;n--);
for(n=50000;n>0;n--);
for(n=50000;n>0;n--);
}
/*主函数
-------------------------------------------------------*/
void main(void)
{
xtal_init();
led_init();
watchdog_Init();
Delay();
led1 = 0; //点亮led1
while(1)
{
FeetDog(); //喂狗指令(加入后系统不复位,小灯不闪烁;若注释,则系统不断复位,小灯每隔1s闪烁一次)
}
}
  从上面的源码可以看出,看门狗的操作方法非常简单,整个过程仅涉及一个新的SFR,即 WDCTL。下面给出CC2430中文手册里对其的具体描述:
  看门狗的使用可以总结为:选择模式 → 选择定时器间隔 → 放狗 → 喂狗
  (1)选择模式:
  看门狗定时器有两种模式,即“看门狗模式”和“定时器”模式。
  在定时器模式下,它就相当于普通的定时器,达到定时间隔会产生中断(你可以在ioCC2430.h文件中找到其中断向量为WDT_VECTOR);在看门狗模式下,当达到定时间隔时,不会产生中断,取而代之的是向系统发送一个复位信号。
  本实验中,通过 WDCTL.MODE=0 来选择为看门口模式。
  (2)选择定时间隔:
  如上图所示,有四种可供选择的时钟周期,为了测试方便,我们选择时间间隔为1s(即令 WDCTL.INT=00 )。
  (3)放狗:
  令 WDCTL.EN=1 ,即可启动看门狗定时器。
  (4)喂狗:
定时器启动之后,就会从0开始计数。在其计数值达到32768之前(即<1s),若我们用以下代码喂狗:
WDCTL = 0xa0;
WDCTL = 0x50;
则定时器的计数值会被清0,然后它会再次从0x0000开始计数,这样就防止了其发送复位信号,表现在开发板上就是:LED1会一直亮着,不会闪烁;
  若我们不喂狗(即把此代码注释掉),那么当定时器计数达到32768时,就会发出复位信号,程序将会从头开始运行,表现在开发板上就是:LED1不断闪烁,闪烁间隔为1s。(注:喂狗程序一定要严格与上述代码一致,顺序颠倒/写错/少写一句都将起不到清0的作用。
http://www.gbblxy.com/forum.php?mod=viewthread&tid=5262&extra=page%3D1
2015年07月27日 02点07分 1
level 8
CC2530的看门狗不能停,低功耗时不建议用
2015年08月02日 09点08分 2
为什么说低功耗不能用
2015年08月17日 01点08分
回复
�����б�
:要不停喂看门狗
2015年08月17日 02点08分
回复 铁血烈鹰 :这也是 如果 出现死机 还有休眠 为什么发二次数据 也不知出现什么问题
2015年08月17日 03点08分
level 6
这是真的吗?向高手们学习了。。。。
2015年08月24日 17点08分 3
1