一、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.9ms,15.625ms,0.25s,1s。分别对应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-看门狗定时器控制