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