S3C2440看门狗定时器(推荐)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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));

相关文档
最新文档