S3C2440看门狗定时器(推荐)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
看门狗定时器的主要作用当程序因为干扰而跑飞后,能够使系统复位。从而防止系统跑飞,提高系统稳定性。
先来说说看门狗的工作原理:
设本系统程序完整运行一周期的时间是Tp,看门狗的定时周期为Ti,Ti>Tp,在程序正常运行时,定时器就不会溢出,若由于干扰等原因使系统不能在Tp时刻修改定时器的记数值,定时器将在Ti时刻溢出,引发系统复位,使系统得以重新运行,从而起到监控的作用。
看门狗设计步骤:
1,设置看门狗中断操作,包括全局中断操作和看门狗中断的使能,看门狗中断向量的定义。[html]view plaincopyprint?
1.#define rINTMSK (*(volatile unsigned *)0x4a000008) //Interrupt mask control
2.#define rINTSUBMSK (*(volatile unsigned *)0x4a00001c) //Interrupt sub mask
[html]view plaincopyprint?
1.//开中断
2.rINTMSK&= ~(BIT_WDT_AC97);
3.rINTSUBMSK&= ~(BIT_SUB_WDT);
2,对看门狗控制寄存器WTCON设置,包括设置预分频比例因子,分频器的分频值,中断使能,复位使能。
WTCON相关位的作用可从下图看出:
其中t_watchdog的计算方法为:
如预分频值=100; 时钟除数因子=128 ;PCLK=67.5MHz,则
定时器时钟周期t_watchdog=1/[PCLK/(预分频值+1)/时钟除数因
子]=1/[67.5*1000000/(100+1)/128]=0.0002
预分频值,时钟除数因子的范围如下:
[html]view plaincopyprint?
1.rWTCON=((100<<8)|(3<<3)); //预分频值=100; 时钟除数因子=128 ;
[html]view plaincopyprint?
1.rWTCON|=(1<<0);//允许复位
3,启动看门狗。
[html]view plaincopyprint?
1.rWTCON |= ((1<<5)|(1<<2)); //允许看门狗定时器和允许中断产生
4,喂狗,即对WTDAT看门狗数据寄存器和WTCNT看门狗计数寄存器的设置。这要在在中断发生前,重新对看门狗定时器的寄存器进行赋值,使它的定时器重新开始计时。而不至于引起系统复位。
[html]view plaincopyprint?
1.rWTDAT=20000; //WTDAT看门狗数据寄存器,看门狗定时器重载的计数值
2.rWTCNT=20000; //WTCNT看门狗计数寄存器,看门狗定时器当前计数值
3.//看门狗时钟中断周期T=WTCNT*t_watchdog=4S
watchdog.c
实现看门狗功能,防止程序跑飞:
[html]view plaincopyprint?
1.//*********************************************
2.//看门狗定时器函数
3.void watchdog_timer(void)
4.{
5.//清WatchDog中断寄存器
6.rSRCPND |=BIT_WDT_AC97;
7.rINTPND |=BIT_WDT_AC97;
8.rSUBSRCPND |= BIT_SUB_WDT;
9.
10.//建立WatchDog中断
11.pISR_WDT_AC97=(unsigned)Watchdog_ISR;
12.
13.
14.rWTCON=((100<<8)|(3<<3)); //预分频值=100; 时钟除数因子=128 ;
15.//PCLK=67.5MHz,不允许中断
16.//每个定时器时钟周期t_watchdog=1/[PCLK/(预分频值+1)/时钟除数因子]
17.// =1/[67.5*1000000/(100+1)/128]=0.0002
18.//
19.
20.//看门狗喂狗
21.rWTDAT=20000; //WTDAT看门狗数据寄存器,看门狗定时器重载的计数值
22.rWTCNT=20000; //WTCNT看门狗计数寄存器,看门狗定时器当前计数值
23.//看门狗时钟中断周期T=WTCNT*t_watchdog=4S
24.rWTCON&= ~(3); //不允许复位
25.
26.rWTCON |= ((1<<5)|(1<<2)); //允许看门狗定时器和允许中断产生
27.
28.//开中断
29.rINTMSK&= ~(BIT_WDT_AC97);
30.rINTSUBMSK&= ~(BIT_SUB_WDT);
31.while(count<11);
32.}
33.//****************************************
34.//WatchDog中断
35.void __irqWatchdog_ISR(void)
37.
38.if(rSUBSRCPND& ~ BIT_SUB_WDT)
39.{ //清除中断
40.rSUBSRCPND |=(BIT_SUB_WDT); //清除一级源中断指示寄存器相应位
41.rSRCPND |= BIT_WDT_AC97;
42.rINTPND |= BIT_WDT_AC97; //清除源中断指示寄存器相应位
43.count++; //复位次数自加
44.
45.if(count<11) ; //判断复位次数
46.else
47.{
48.//屏蔽看门狗中断
49.rINTSUBMSK |= (BIT_SUB_WDT); //屏蔽看门狗相应中断位
50.rINTMSK |= (BIT_WDT_AC97);
51.}
52.}
53.
54.if(rSUBSRCPND& ~ BIT_SUB_AC97)
55.{
56.rSUBSRCPND |=BIT_SUB_AC97;
57.rSRCPND |= BIT_WDT_AC97;
58.rINTPND |= BIT_WDT_AC97; //清除源中断指示寄存器相应位
59.}
60.}
61.//*****************************************
62./*需要复位时选用
63.void watchdog_reset(void) //看门狗复位函数
64.{
65.
66.//预分频值=100; 时钟除数因子=128 ;PCLK=67.5MHz
67.//每个定时器时钟周期t_watchdog=1/[PCLK/(预分频值+1)/时钟除数因子]
68.// =1/[67.5*1000000/(100+1)/128]=0.0002
69.//不允许中断
70.rWTCON=((100<<8)|(3<<3));