CC2530看门狗实验

来源:互联网 发布:淮南网络推广 编辑:程序博客网 时间:2024/05/02 14:19

看门狗的作用:CPU在执行软件时对跑飞的一种恢复方式,当软件在选择时间间隔内未清除看门狗,看门狗就会复位系统。用于电噪声电源故障静电放电等高可靠要求下。

      

      

                       

 

    看门狗芯片和单片机的一个I/O引脚相连,I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位



系统软件"看门狗"的设计思路: 1.看门狗定时器T0的设置。在初始化程序块中设置T0的工作方式,并开启中断和计数功能。系统Fosc=12 MHzT016位计数器,最大计数值为(216次方)-1=65535T0输入计数频率是.Fosc/12,溢出周期为(65 535+1)/1=65536(μs) 2.计算主控程序循环一次的耗时。考虑系统各功能模块及其循环次数,本系统主控制程序的运行时间约为16.6ms。系统设置"看门狗"定时器T0定时30 ms(T0的初值为65536-30 000=35 536)。主控程序的每次循环都将刷新T0的初值。如程序进入"死循环"T0的初值在30ms内未被刷新,这时"看门狗"定时器T0将溢出并申请中断。 3.设计T0溢出所对应的中断服务程序。此子程序只须一条指令,即在T0对应的中断向量地址(000BH)写入"无条件转移"命令,把计算机拖回整个程序的第一行,对单片机重新进行初始化并获得正确的执行顺序看门狗也有对计算机危害之处。

看门狗定时器四个特性:

4个可选时间间隔

看门狗模式

定时器模式

定时器模式下中断请求产生

 




CLKCONCMD:时钟频率控制寄存器。

D7

D6

D5~D3

D2~D0

32KHZ时间振荡器选择

系统时钟选择

定时器输出标记

系统主时钟选择

D7位为32KHZ时间振荡器选择,,0为32KRC震荡,1为32K晶振。默认为1。
D6位为系统时钟选择。0为32M晶振,1为16M RC震荡。当D7位为0时D6必须为1。
D5~D3为定时器输出标记。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为 1MHZ,110为500KHZ,111为250KHZ。默认为001。需要注意的是:当D6为1时,定时器频率最高可采用频率为16MHZ。
D2~D0:系统主时钟选择:000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为1MHZ,110为500KHZ,111为250KHZ。当D6为1时,系统主时钟最高可采用频率为16MHZ。

 

 



# include <ioCC2530.h>

#define uint unsigned int

#define led1  P1_0
#define led2  P1_1

void Init_IO(void)     //初始化IO
{
P1DIR = 0x03;
led1 = 1;
led2 = 1;
}


void Init_Watchdog(void)    //初始化看门狗
{
WDCTL = 0x00;
//时间间隔一秒,看门狗模式
WDCTL |= 0x08;
//启动看门狗
}


void FeetDog(void)         //不给把看门狗的计数清0,就会引起计数溢出中断,对应的看门狗中断服务程序就会产生系统复位
{
WDCTL = 0xa0;//复
WDCTL = 0x50;//位看门狗
}


void Init_Clock(void)  //将系统时钟设置为晶振,低速时钟为晶振,程序对时钟要求不高,不用等待晶振稳定,参考时钟的为文章
{
CLKCONCMD = 0X00;
}


void Delay(void)
{
uint n;
for(n=50000;n>0;n--);
for(n=50000;n>0;n--);
for(n=50000;n>0;n--);
for(n=50000;n>0;n--);
for(n=50000;n>0;n--);
for(n=50000;n>0;n--);
for(n=50000;n>0;n--);
}


void main(void)
{
Init_Clock();
Init_IO();
Init_Watchdog();


led1=0;
Delay();
led2=0;
while(1)
{
        //  Delay();Delay();Delay();Delay();   使喂狗时间超时验证系统复位
          
          FeetDog();
} //喂狗指令(加入后系统不复位,小灯不闪烁)
}
0 0
原创粉丝点击