【CC2530裸机开发-----看门狗定时器】

一、CC2530看门狗介绍

在CPU可能受到一个软件颠覆的情况下,看门狗定时器(WDT)用作一个恢复的方法。当软件在选定时间间隔内不能清除WDT时,WDT就必须复位系统。看门狗可用于受到电气噪音电源故障静电放电等影响的应用,或需要高可靠性的环境。如果一个应用不需要看门狗功能,可以配置看门狗定时器为一个间隔定时器,这样可以用于在选定的时间间隔产生中断。

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

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

WDT可以配置为一个看门狗定时器或一个通用的定时器。WDT模块的运行由WDCTL寄存器控制。看门狗定时器包括一个15位计数器,它的频率由32KHz时间源规定。

二、看门狗模式

系统复位之后,看门狗定时器就被禁用。要设置WDT在看门狗模式,必须设置WDCTL.MODE[1:0]位为10。然后看门狗定时器的计数器从0开始递增。在看门狗模式下,一旦定时器使能,就不可以禁用定时器,因此,如果WDT位已经运行在看门狗模式下,再向WDCTL.MOED[1:0]写入00或10就不起作用了。

WDT运行在一个频率为32.768KHz(当使用32KHz XOSC)的看门狗定时器时钟上。这个时钟频率的超时期限等于1.9ms15.625ms0.25s1s。分别对应64,512,8192和32768的计数值设置。

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

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

在看门狗模式下,WDT不会产生一个中断请求

看门狗工作示意图:

2.1 看门狗分类

2.2 看门狗模式的使用
#include<iocc2530.h>

#define D4 P1_1
#define D6 P1_4

void delay(unsigned int t)
{
  while(t--);
}

void in_prot()
{
  P1SEL &=~0X1B;
  P1DIR |=0X1B;
  P1 &=~0X1B;
}

void in_wdt()
{
  WDCTL =0X08;		//设置看门狗模式,定时器间隔1s
}

void wdt_dog()		//喂狗操作
{
  WDCTL  |=0XA0;
  WDCTL  |=0x50;
}

void led()
{
  P1 |=0X1B;
  delay(60000);
  delay(60000);
  P1 &=~0X1B;
  delay(60000);
  delay(60000);
}

void food_dog()
{
  D4=1;
  delay(60000);
  delay(60000);
  D4=0;
  delay(60000);
  delay(60000);
  wdt_dog();
}

void dog()
{
  D6=1;
  delay(60000);
  delay(60000);
  D6=0;
  delay(60000);
  delay(60000);
}

unsigned int i;
void main()
{
  in_prot();
  led();
  in_wdt();
  while(1)
  {
    for(i=0;i<8;i++)
    {
      food_dog();
    }
    for(i=0;i<8;i++)
    {
      dog();
    }
  
  }
}

三、定时器模式

要在一般定时器模式下设置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]位设置。在定时器操作期间,定时器间隔不能改变,且当定时器开始时必须设置。在定时器模式下,当达到定时器间隔时,不会产生系统复位。

注意如果选择了看门狗模式,定时器模式不能在芯片复位之前选择。

3.1 看门狗定时器1秒周期性闪烁

当我们的程序不需要看门狗时,可以把看门狗看成一个定时器,比赛中求速度的话可以使用看门狗定时器来实现定时间隔,比其它定时器方便。

#include<iocc2530.h>

#define D4 P1_1

void in_prot()
{
  P1SEL &=~0X1B;
  P1DIR |=0x1B; 
  P1 &=~0X1B;
}

void WDT()
{
  WDCTL =0X0D; //配置看门狗模式以及间隔时间
  IEN2 |=0X20;  //看门狗的中断控制为为5   0010 0000
  EA=1;         //打开总中断
}

#pragma vector = WDT_VECTOR 	//WDT中断服务函数
__interrupt void WDT_more()
{
  WDTIF=0;            //清除标志位
  D4=~D4;
}

void main()
{
  in_prot();
  WDT();
  while(1)
  {}
}

3.2 看门狗定时器定时发串口
#include<iocc2530.h>

#define D3 P1_0

void in_prot()
{
  P1SEL &=~0X1B;
  P1DIR |=0X1B;
  P1 &=~0x1B;
}

void in_wdt()
{
  WDCTL = 0X0C;
}

void in_clock()
{
  CLKCONCMD &=~0X40;
  while(CLKCONSTA & 0X40);
  CLKCONCMD &=~0X07;
}

void in_UART0()
{
  PERCFG &=~0X01;
  P0SEL |= 0X0C;
  U0BAUD =59;
  U0GCR =7;
  U0UCR |=0X80;
  U0CSR |=0XC0;
}

void uart0_sendbyte(unsigned char byte)
{
  U0DBUF=byte;
  while(UTX0IF==0);
  UTX0IF=0;
}

void uart0_sendstring(unsigned char *p)
{
  while(*p !='\0')
  {
    uart0_sendbyte(*p++);
  }
}

void main()
{
  in_prot();
  in_clock();
  in_wdt();
  in_UART0();
  while(1)
  {
    if(WDTIF==1)
    {
      D3=1;
      WDTIF=0;
      uart0_sendstring("Hello world\r\n");
      D3=0;
    }
  }
}

四、看门狗定时器相关寄存器

WDCTL-看门狗定时器控制

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值