打印
[Zigbee]

CC2530看门狗

[复制链接]
856|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gwsan|  楼主 | 2019-8-2 11:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1 理论分析
1.1 CC2530 看门狗简介
在 CPU 可能受到一个软件颠覆的情况下,看门狗定时器(WDT)用作一个恢复的方法。当软件在选定时间间隔内不能清除 WDT 时,WDT 必须就复位系统。看门狗可用于受到电气噪音、电源故障、静电放电等影响的应用,或需要高可靠性的环境。如果一个应用不需要看门狗功能,可以配置看门狗定时器为一个间隔定时器,这样可以用于在选定的时间间隔产生中断。

看门狗定时器的特性如下:

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

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

CC2530 看门狗有 2 种模式:看门狗模式和定时器模式,下面分别介绍。


使用特权

评论回复
评论
dirtwillfly 2019-8-3 20:46 回复TA
感谢分享 
dirtwillfly 2019-8-3 20:46 回复TA
感谢分享 

相关帖子

沙发
gwsan|  楼主 | 2019-8-2 11:22 | 只看该作者
1、看门狗模式
在系统复位之后,看门狗定时器就被禁用。要设置 WDT 在看门狗模式,必须设置WDCTL.MODE[1:0]位为 10 。然后看门狗定时器的计数器从 0 开始递增。在看门狗模式下,一旦定时器使能,就不可以禁用定时器,因此,如果 WDT 位已经运行在看门狗模式下,再往 WDCTL.MODE[1:0]写入 00 或 10 就不起作用了。WDT 运行在一个频率为 32.768 kHz(当使用 32 kHz XOSC)的看门狗定时器时钟上。这个时钟频率的超时期限等于 1.9ms,15.625 ms,0.25 s 和 1s,分别对应 64,512,8192 和 32768 的计数值设置。如果计数器达到选定定时器的间隔值,看门狗定时器就为系统产生一个复位信号。

如果在计数器达到选定定时器的间隔值之前,执行了一个看门狗清除序列,计数器就复位到 0,并继续递增。看门狗清除的序列包括在一个看门狗时钟周期内,写入 0xA到 WDCTL.CLR[3:0],然后写入 0x5 到同一个寄存器位。如果这个序列没有在看门狗周期结束之前执行完毕,看门狗定时器就为系统产生一个复位信号。

当看门狗模式下,WDT 使能,就不能通过写入 WDCTL.MODE[1:0]位改变这个模式,且定时器间隔值也不能改变。
在看门狗模式下,WDT 不会产生一个中断请求。

使用特权

评论回复
板凳
gwsan|  楼主 | 2019-8-2 11:22 | 只看该作者
2、定时器模式
要在一般定时器模式下设置 WDT,必须把 WDCTL.MODE[1:0]位设置为 11。定时器就开始,且计数器从 0 开始递增。当计数器达到选定间隔值,定时器将产生一个中断请求(IRCON2.WDTIF/IEN2.WDTIE) 。

在定时器模式下,可以通过写入 1 到 WDCTL.CLR[0]来清除定时器内容。当定时器被清除, 计数器的内容就置为 0。 写入 00 或 01 到 WDCTL.MODE[1:0]来停止定时器,并清除它为 0。

定时器间隔由 WDCTL.INT[1:0]位设置。在定时器操作期间,定时器间隔不能改变,且当定时器开始时必须设置。在定时器模式下,当达到定时器间隔时,不会产生复位。注意如果选择了看门狗模式,定时器模式不能在芯片复位之前选择。

使用特权

评论回复
地板
gwsan|  楼主 | 2019-8-2 11:23 | 只看该作者
2 实验详解
2.1实验目的
1)、了解 CC2530 看门狗功能;
2)、学会使用看门狗功能。

2.2实验设备
硬件:PC 机一台 ZB2530(底板、核心板、仿真器、USB 线) 一套
软件:win7 系统,IAR 8.20 集成开发环境

使用特权

评论回复
5
gwsan|  楼主 | 2019-8-2 11:23 | 只看该作者
2.3实验相关电路图

图1 LED电路图

使用特权

评论回复
6
gwsan|  楼主 | 2019-8-2 11:23 | 只看该作者
2.4实验分析

相关寄存器WDCTL 如下表所示:

表1看门狗定时器控制

使用特权

评论回复
7
gwsan|  楼主 | 2019-8-2 11:24 | 只看该作者
按照表格寄存器内容,我们对WDCTL 具体配置可如下:

WDCTL = 0x00; //打开IDLE 才能设置看门狗
WDCTL |= 0x08; //定时器间隔选择,间隔一秒
停止喂狗:
WDCTL = 0xa0; //清除定时器。当0xA 跟随0x5 写到这些位,定时器被清除
WDCTL = 0x50;

使用特权

评论回复
8
gwsan|  楼主 | 2019-8-2 11:25 | 只看该作者
2.5参考代码
/**Includes*********************************************************************/
#include <ioCC2530.h>

/**宏定义***********************************************************************/
//定义数据类型
#define uint unsigned int
//定义IO口
#define LED1  P1_0
#define LED2  P1_1

/**函数声明*********************************************************************/
void InitLEDIO(void);
void Init_Watchdog(void);
void SET_MAIN_CLOCK(int source) ;
void FeetDog(void);
void Delay(uint xms);

使用特权

评论回复
9
gwsan|  楼主 | 2019-8-2 11:26 | 只看该作者
/**
  * @brief     主函数
  * @param     None
  * @retval    None
  */
void main(void)
{       
  SET_MAIN_CLOCK(0) ;
  InitLEDIO();
  Init_Watchdog();
        
  Delay(1000);
               
  LED1= 0;               
  LED2= 0;      

  while(1)
  {
    FeetDog();       
  }       
  //喂狗指令(加入后系统不复位,LED1和LED2不再闪烁)
}

使用特权

评论回复
10
gwsan|  楼主 | 2019-8-2 11:27 | 只看该作者
/**
  * @brief     LED初始化
  * @param     None
  * @retval    None
  */
void InitLEDIO(void)
{
    P1DIR |= 0x03;  //P10、P11定义为输出
    LED1 = 1;
    LED2 = 1;
    //LED灯初始化为关   
}

使用特权

评论回复
11
gwsan|  楼主 | 2019-8-2 11:27 | 只看该作者
/**
  * @brief     初始化看门狗
  * @param     None
  * @retval    None
  */
void Init_Watchdog(void)
{
  WDCTL = 0x00;
       
  //时间间隔一秒,看门狗模式
  WDCTL |= 0x08;
}

使用特权

评论回复
12
gwsan|  楼主 | 2019-8-2 11:28 | 只看该作者
/**
  * @brief     设置时钟模式
  * @param     None
  * @retval    None
  */
void  SET_MAIN_CLOCK(int source)
{                                 
      
  if(source)
  {                             
    CLKCONCMD |= 0x40;          /*RC*/               
    while(!(CLKCONSTA &0X40));  /*待稳*/           
  }                                       
      
  else
  {  
    CLKCONCMD &= ~0x47;        /*晶振*/            
      
    while((CLKCONSTA &0X40));  /*待稳*/  
  }                                       
}

使用特权

评论回复
13
gwsan|  楼主 | 2019-8-2 11:29 | 只看该作者
/**
  * @brief     喂狗
  * @param     None
  * @retval    None
  */
void FeetDog(void)
{       
  WDCTL = 0xa0;
  WDCTL = 0x50;
}

使用特权

评论回复
14
gwsan|  楼主 | 2019-8-2 11:29 | 只看该作者
/**
  * @brief     延时函数
  * @param     xms 延时大小
  * @retval    None
  */
void Delay(uint xms)
{
   uint i,j;
    for(i=xms;i>0;i--)
     for(j=587;j>0;j--);   
}


注意:如果将模式改为定时器模式就不需要喂狗,系统会自动清零。
//定时器模式
WDCTL |= 0x0d;

使用特权

评论回复
15
gwsan|  楼主 | 2019-8-2 11:29 | 只看该作者
2.6实验现象
如果FeetDog();注释掉,LED1 LED2不断闪烁,系统不断复位。
如果FeetDog();不注释,LED1 LED2不闪烁 ,系统不复位了。

使用特权

评论回复
16
parameters| | 2019-8-6 14:46 | 只看该作者
感谢楼主分享!了解学习一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

3426

帖子

1

粉丝