Zigbee之旅(八):几个重要的CC2430基础实验——看门狗

一、承上启下

  再好的操作系统,不管是现在的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的作用。)

CC2430 小贴士

做两点额外说明:

(1)在 看门狗模式 下,若看门狗定时器已经使能,则对WDCTL.EN置0是无效的(即此位不能起到停止定时器的作用);

(2)在 定时器模式 下,可以对WDCTL.CLR[0]写1来对定时器清零;写0到使能位WDCTL.EN将停止定时器,而写1到使能位将重新启动定时器从0x0000开始运行。

(4)实验结果:

  若加上FeedDog函数,运行代码,发现LED1一直亮着(系统不复位);

  若注释掉FeedDog函数,运行代码,发现LED1以1s的间隔闪烁(系统每隔1s复位一次)。

三、结语

  本节介绍了看门狗定时电路的原理和使用方法。在实际应用中,若需要较高的可靠性,则可将看门狗运用到系统中。当系统因某种原因出现停机状况(不能喂狗了)时,没人喂的狗就会狂吠起来:“主人,有异常,有异常!”

  对一个无线传感器网络来说,其运行时功耗的高低,是性能评价的至关重要的一方面。下一节,我们来讨论关于CC2430系统睡眠,以及其中断唤醒。

Zigbee之旅(八):几个重要的CC2430基础实验——看门狗相关推荐

  1. Zigbee之旅(九):几个重要的CC2430基础实验——系统睡眠及中断唤醒

    Zigbee之旅(九):几个重要的CC2430基础实验--系统睡眠及中断唤醒 一.承上启下 这一篇,我们来讨论一下CC2430的睡眠功能及唤醒方法.在实际运用中的CC2430节点一般是靠电池来供电,因 ...

  2. 《ZigBee开发笔记》第五部分 外设篇 - 基础实验 第1章CC2530温度传感器DS18B20

    1 理论分析 1.1概述 DS18B20 是 DALLAS 最新单线数字温度传感器,新的"一线器件"体积更小.适用电压更宽.更经济.Dallas 半导体公司的数字化温度传感器 DS ...

  3. 嵌入式成长轨迹54 【Zigbee项目】【CC2430基础实验】【系统睡眠工作状态】

    本实验在小灯闪烁10 次以后进入低功耗模式 PM3 .CC2430 一共有4 种功耗模式,分别是PM0,PM1,PM2,PM3,以 PM3 功耗最低. SLEEP (0xBE) - Sleep mod ...

  4. 嵌入式成长轨迹53 【Zigbee项目】【CC2430基础实验】【串口时钟PC显示】

    void InitT1(void) : 函数原型: 1 void InitT1(void) 2 { 3 T1CCTL0 = 0X44; 4 //T1CCTL0 (0xE5) 5 //T1 ch0 中断 ...

  5. 嵌入式成长轨迹37 【Zigbee项目】【CC2430基础实验】【自动闪烁】

    最为简单的代码,只用到一个寄存器P1DIR.因为点亮的led灯(p1.0和p1.1)的管脚是p1的,要输出就得将这两个管脚设置为输出管脚.该寄存器用0~8对应1.0~1.8管脚. 1 //main.c ...

  6. 嵌入式成长轨迹52 【Zigbee项目】【CC2430基础实验】【在PC用串口收数并发数】...

    在PC上从串口向 CC2430发任意长度为 30 字节的字串,若长度不足 30 字节,则以"#"为字串末字节,CC2430在收到字节后会将这一字串从串口反向发向 PC,用串口助手可 ...

  7. 《ZigBee开发笔记》第五部分 外设篇 - 基础实验 第4章 CC2530热释电红外传感器

    1理论分析 HC-SR501人体红外感应模块 是基于红外线技术的自动控制产品.灵敏度高.可靠性强.超低功耗,超低电压工作模式.广泛应用于各类自动感应电器设备,尤其是干电池供电的自动控制产品. 2实验详 ...

  8. 《ZigBee开发笔记》第五部分 外设篇 - 基础实验 第2章 CC2530温湿度传感器DHT11

    1理论分析 1.1 DHT11 介绍 DHT11 数字温湿度传感器,如图所示,是一款含有已校准数字信号输出的温湿度复合传感器.它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓 ...

  9. 《ZigBee开发笔记》第五部分 外设篇 - 基础实验 第5章 CC2530继电器模块

    1理论分析 1.1概述 继电器(relay)是一种电控制器件,是当输入量(激励量)的变化达到规定要求时,在电气输出电路中使被控量发生预定的阶跃变化的一种电器.它具有控制系统(又称输入回路)和被控制系统 ...

最新文章

  1. [Cocoa]为已有的XCode工程创建Git仓库
  2. 使用mybatis向oracle数据库插入数据异常
  3. SpringSecurity快速入门
  4. LeetCode 823. 带因子的二叉树(动态规划)
  5. python多标签分类_如何通过sklearn实现多标签分类?
  6. JEECG十二个开源项目下载大全
  7. JSP中鼠标禁用代码
  8. MyBatis返回插入的数据主键
  9. CA SDK 使用简介
  10. Load Average (系统负载)
  11. 快手sig签名和did egid的注册(操作太快了,请稍微休息一下)
  12. 案例分享|水下光通信系统
  13. 百钱买百鸡问题的解法与思路
  14. 小节标题不跟着章节变化,教你彻底解决
  15. python核心编程 第3版_Python核心编程(第3版)PDF高清晰完整中文版
  16. 安卓项目查手机电量功能_Android获取手机电池电量用法实例
  17. http,https
  18. 消除Mac Word文档生成目录中的灰色底纹
  19. SLAM之camera(Intel RealSense D435)调试第一弹:Win10平台下getting started
  20. 053试题 21 / 198 /200 / 289/355/363/650/700 - duplicate database

热门文章

  1. Qt单元测试工具 QTestlib
  2. C#重写RichBox控件获取RTF格式的内容
  3. 开源网安受邀参加2023澳门万讯论坛,引领软件安全领域国产化替代浪潮
  4. 你需要启用steam社区界面功能以进行购买_GTA5OL:名钻赌场豪劫新手如何购买与安装图文教程...
  5. WordPress主题添加鼠标点击特效
  6. 不花钱使用google keyword planner(关键字规化器)
  7. 凯文凯利给年轻人的建议
  8. hy3208中文参数_HY-MOSFET-产品目录表
  9. asp.net 客户端msgbox用法
  10. 面向对象学不会看不懂?一文详解面向对象知识点总结