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

日期: 2024-11-08 04:00:47|浏览: 13|编号: 108227

友情提醒:信息内容由网友发布,请自鉴内容实用性。

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

一、看门狗介绍

CPU 可能受到软件颠覆的情况下,使用看门狗定时器 (WDT) 作为恢复方法。当软件无法在所选时间间隔内清除 WDT 时,WDT 必须重置系统。该看门狗可用于受电气噪声、电源故障、静电放电等影响的应用,或需要高可靠性的环境。如果应用程序不需要 功能,则可以将 计时器配置为间隔计时器,该计时器可用于按选定的间隔生成中断。

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

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

2. 看门狗模式

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

WDT 在频率为 32 的看门狗定时器时钟上运行(使用 32KHz XOSC 时)。此 clock 的超时周期等于 1.9ms、15.625ms、0.25s、1s。分别对应于 64、512、8192 和 32768 的计数值设置。

如果计数器达到所选定时器的间隔值,则看门狗定时器会为系统生成一个复位信号。如果在计数器达到所选计时器的间隔值之前执行看门狗清除序列,则计数器将重置为 0 并继续递增。看门狗清除序列包括在看门狗 clock cycle内将0xA写入 WDCTL。CLR[3:0],然后将0x5写入同一个寄存器位。如果在看门狗周期结束之前未执行序列,则看门狗定时器会为系统生成一个 reset 信号。

在 模式下启用 WDT 时,无法通过写入 WDCTL 来更改它。MODE[1:0] 位,并且无法更改 TIMER 值。

在看门狗模式下,WDT 不会生成中断请求。

看门狗工作示意图:

2.1 看门狗分类

2.2 使用看门狗模式

#include
#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();
    }
  
  }
}

3. 定时器模式

要在正常计时器模式下设置 WDT,请使用 WDCTL.MODE[1:0] 位必须设置为 11。计时器启动,计数器从 0 开始递增。当计数器达到选定的间隔值时,计时器将生成中断请求 (.WDTIF/IEN2 的。WDTIE)。

在定时器模式下,可以通过向 WDCTL 写入 1 来清除定时器内容。CLR[0] 的 CLR[0]。清除计时器后,计数器的内容将设置为 0。将 00 或 01 写入 WDCTL。MODE[1:0] 停止计时器并将其清除为 0。

计时器间隔由 WDCTL.INT [1:0] 位设置。在计时器操作期间,计时器间隔无法更改,必须在计时器启动时设置。在定时器模式下,当达到定时器间隔时,不会重置系统。

请注意,如果选择了 模式,则在芯片复位之前无法选择 timer 模式。

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

当我们的程序不需要看门狗时,我们可以把看门狗看作是一个计时器,如果我们想在比赛中找到速度,我们可以使用看门狗计时器来实现定时间隔,这比其他计时器更方便。

#include
#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
#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 - 看门狗定时器控制

提醒:请联系我时一定说明是从浚耀商务生活网上看到的!