嵌入式开发第47天(看门狗定时器的原理)

来源:互联网 发布:多媒体图像处理算法 编辑:程序博客网 时间:2024/05/16 09:12

看门狗定时器有两个作用:

1、看门狗复位

可以设置看门狗定时器的计数值,计数值在看门狗的工作频率下不断的减1,当计数值减到0,看门狗就会产生一个复位信号,造成了整个系统的复位。

例如:

看门狗的工作频率设置成1000Hz,看门狗的计数值设置成10000;这样计数值每1ms减一次1,当10秒后计数值减到0。系统就会产生复位信号,系统重启。

系统正常工作的时候,我们应该10秒钟内(计数值减到0之前)重新给计数值赋一个初始值,防止系统重启,这个过程叫“喂狗”。

当系统运行出错,程序“跑飞”的时候,“喂狗”程序也停止工作,这样会出现10s之内不能喂狗,系统就会重启,让系统重新开始工作,恢复到正常工作状态。

简述:当系统受到干扰而产生死机(后者程序跑飞)的时候,看门狗可以让系统重启,重新开始工作。

 

2、普通的定时器(51单片机的定时器)

普通的定时器主要是用来计时。会产生周期性的中断,我们可以设置定时器的周期。

例:

我们可以设置定时器的工作频率1000HZ,定时器的计数值设置成1000;这样当打开定时器中断,并开启定时器后,计数值就每1ms减一次1,当计数值减到0,就会生成一个中断,会执行一个中断服务程序,在中断服务程序中开始计时。计数值会自动的恢复到1000,开始下一个周期,周而复始.....

 

=========================================================

一、看门狗的框图

 

分频有什么用?

上章讲到时钟源的由来,他是由芯片外的晶振产生时钟源,通过倍频器,使得24mhz频率提高到1000MHZ,然后通过分频,分到的看门狗的PCLK_PSYS=66MHZ.

然后经过看门狗的分频器二次分频 得到一个基准频率。

这个所谓的基准频率,指的就是看门狗的基准周期,也就是现实生活中的一秒等于频率的多少mhz

这里得到的2022就代表着 生成2022频率的时间代表1秒。

WTCON =(0xfe<<8);// 设置第一次分频值255

WTCON |=(0x3<<3); //设置第二次分频值128 , 66000000/(254+1)/128 = 2022

 

程序设计

1、看门狗的复位功能

我们设置看门狗的复位时间10s,观察10s内没有喂狗,系统复位......

 

//看门狗

#define WTCON (*(volatile unsigned int *)0xE2700000)

#define WTDAT (*(volatile unsigned int *)0xE2700004)

#define WTCNT (*(volatile unsigned int *)0xE2700008)

#define WTCLRINT (*(volatile unsigned int *)0xE270000C)

 

1)看门狗的初始化

WTCON =(0xfe<<8);// 设置第一次分频值255

WTCON |=(0x3<<3); //设置第二次分频值128 , 66000000/(254+1)/128 = 2022

WTCON &=~(1<<2); //设置看门狗中断 关

WTCON |=(1<<0); //设置复位开关 开

WTCNT  =20220;//设置时间量,20220 代表10s ,10秒内若不喂狗。就会产生复位

WTDAT  =20220;  //复位时间10s.

 

2)打开看门狗

WTCON |=(1<<5); //设置看门狗使能位

 

3)喂狗

WTCNT=WTDAT;  //喂狗

 

看门狗的复位时间一般都是秒级的。

 

--------------------------------------------------------------------------------

2、普通定时器功能

设置看门狗定时器的周期是10ms,利用看门狗定时器进行计时,使LED1400ms翻转一次。

1)中断控制器的初始化

int_init();

 

2)看门狗中断的初始化

 intc_setvectaddr(NUM_WDT, isr_wdt);  //看门狗中断的安装

 

3)看门狗定时器的初始化

void wdt_init(void)

{

WTCON =(0xfe<<8);// 设置第一次分频值255

WTCON |=(0x3<<3); //设置第二次分频值128 , 66000000/(254+1)/128 = 2022

 

WTCON |=(1<<2); //设置看门狗中断 开

WTCON &=~(1<<0); //设置复位开关 关

WTCNT  =20;

WTDAT  =20;  //定时周期10ms.

}

 

4)打开看门狗中断

intc_enable(NUM_WDT);

 

5)启动看门狗

WTCON |=(1<<5); //设置看门狗使能位

 

当定时周期到了的时候,会执行中断服务程序:

void isr_wdt(void)

{

sum++; //10mssum=sum+1

if(sum==40) //400ms

{

GPJ2DAT ^= (0x1<<0); //翻转LED1

sum=0; //0,准备下一次400ms的计数

}

WTCLRINT=1; //清看门狗的中断

intc_clearvectaddr(); //清中断控制器的中断

}

0 0
原创粉丝点击