裸奔程序之看门狗定时器

发布者:Alisallll最新更新时间:2016-06-08 来源: eefocus关键字:裸奔程序  看门狗定时器 手机看文章 扫描二维码
随时随地手机看文章
WATCHDOG定时器简介:

        WATCHDOG定时器也可以像一般的16位定时器一样用于产生周期性中断,也可以用于发出复位信号以重启时常的系统。它的结构与PWM很相似,如下图所示:

裸奔程序之看门狗定时器

      从上图我们可以发现,WATCHDOG 定时器先经过8位预分频将PCLK分频后,被再次分频得到4种频率,16分频、32分频、64分频、128分频,WATCHDOG 定时器可以通过设置 WTCON[4:3]来决定工作在哪种频率之下,WTCHT 寄存器按照其工作频率减1计数,当达到0时,可以产生中断信号,可以输出复位信号。在第一次使用WATCHDOG 定时器时,需要往WTCNT 寄存器中写入初始计数值,以后在计数值到达0时,自动从WATDAT 寄存器中装入,重新开始下一个计数值。

     使用WATCHDOG定时器的“WATCHDOG 功能”时,在正常的程序中,必须不断重新设置WTCNT 寄存器,使之不为0,这样可以保证系统不被重启,这就是所谓的“喂狗”啦。当程序崩溃时不能正常“喂狗”,计数值达到0后系统将被重启,这样程序将重新运行。

     有关WATCHDOG  定时器的寄存器只有3个。我们来简单介绍一下:

1、WTCON  寄存器(WATCHDOG TIMER CONTROL)

      用于设置分频系数,选择工作频率,决定是否使能中断,是否启用WATDOG 功能(即是否输出复位信号),WATCHDOG 定时器的工作频率可以通过下面这个公式计算:
      WATCHDOG 定时器工作频率 = PCLK / {prescaler +1 } / {divider value }

      {prescaler value } = 0~255,   {divider value} = 16,32,64,128。

裸奔程序之看门狗定时器
 

2、WTDAT 寄存器(WATCHDOG TIMER DATA)

        WTDAT 寄存器被用来决定WATCHDOG 定时器的超时周期,在定时器启动后,当计数达到0时,WTDAT 寄存器的值会自动传入 WTCNT 寄存器。不过,第一次启动WATCHDOG 定时器时,WTDAT 寄存器的值不会自动传入WTNT寄存器,这就需要首先在WTNT装入初值啦。

裸奔程序之看门狗定时器
 

3、WTCNT 寄存器(WATCHDOG TIMR COUNT)

       在启动WATCHDOG 定时器前,必须往WTCNT这个寄存器写入初始计数值。启动定时器后,它减1计数,当计数值达到0时,如果中断被使能的话,就会发出中断请求;如WATCHDOG功能被使能的话,将会发出复位信号,装载 WTDAT寄存器的值并重新计数。

裸奔程序之看门狗定时器

 注意:

          当使能中断的时候,WATCHDOG定时器中断是有次级中断源的,初始化中断的时候需要格外注意。

————————————————————————————————————————————

下面开始讲解main.c程序:

#include "2440addr.h"
#include "Option.h"


#define  LED1_ON (rGPBDAT &=~(1<<5))
#define  LED1_OFF (rGPBDAT |=(1<<5) )
#define  LED2_ON (rGPBDAT &=~(1<<6))
#define  LED2_OFF (rGPBDAT |=(1<<6))
#define  LED3_ON (rGPBDAT &=~(1<<7))
#define  LED3_OFF (rGPBDAT |=(1<<7))
#define  LED4_ON (rGPBDAT &=~(1<<8))
#define  LED4_OFF (rGPBDAT |=(1<<8))

void __irq Wdt_Int(void);

void Delay(void)
{
int i;
for(i=0;i<1000000;i++);
}

void Main(void)
{
     rGPBCON &=~((3<<10)|(3<<12)|(3<<14)|(3<<16)); //对GPBCON[10:17]清零
     rGPBCON |=((1<<10)|(1<<12)|(1<<14)|(1<<16)); //设置GPB5~8为输出
     rGPBUP &=~((1<<5)|(1<<6)|(1<<7)|(1<<8));  //设置GPB5~8的上拉功能
     rGPBDAT |=(1<<5)|(1<<6)|(1<<7)|(1<<8);   //关闭LED

     rGPBCON |=1; //输出
     rGPBUP |=0;
     rGPBDAT|=0; //关闭蜂鸣器

     rWTDAT=50000; //设置看门狗定时器超时时间为4秒(50÷12.5)
     rWTCNT=50000;
     rWTCON=(249<<8)|(1<<5)|(0<<3)|(1<<2);//预分频值为249,使能看门狗,分频系数为16,中断使能

     rSRCPND |=BIT_WDT_AC97;
     rINTPND |=BIT_WDT_AC97;
     rSUBSRCPND |= BIT_SUB_WDT; //清除中断标志
    
     rINTMSK &= ~(BIT_WDT_AC97); 
     rINTSUBMSK &= ~(BIT_SUB_WDT);//开中断
   
     pISR_WDT_AC97=(unsigned)Wdt_Int;//设置中断程序入口
     while(1)
    {
          LED1_ON;Delay();LED1_OFF;
          LED2_ON;Delay();LED2_OFF;
          LED3_ON;Delay();LED3_OFF;
          LED4_ON;Delay();LED4_OFF;
          rWTCNT=50000; //喂狗 没喂狗蜂鸣器很响
   }
}

void __irq Wdt_Int(void)
{
      rSRCPND |=BIT_WDT_AC97;
      rINTPND |=BIT_WDT_AC97;
      rSUBSRCPND |= BIT_SUB_WDT; //清除中断标志
      rGPBDAT =1;
      Delay();                         //  from  2440lib.c
      rGPBDAT =0; //蜂鸣器响一段时间
}

—————————————————————————————————————————————

     我们首先来看main函数,进入main函数之后,首先是设置LED1~4对应管脚为输出、使能上拉、关闭全部LED。(前面四句)

     接着三句是设置蜂鸣器控制管脚GPB0为输出、使能上拉、关闭蜂鸣器。

     我们先来看这句  rWTCON=(249<<8)|(1<<5)|(0<<3)|(1<<2);//预分频值为249,使能看门狗,分频系数为16,中断使能

     通过WATCHDOG 定时器工作频率 = PCLK / {prescaler +1 } / {divider value }

     {prescaler value } = 0~255, {divider value} = 16,32,64,128。

     计算求得WATCHDOG工作频率为12500Hz,即每秒钟计数12500次。

     再回头来看看上面那二句就很清楚的知道是定时器4秒的意思啦。

     rWTDAT=50000; //设置看门狗定时器超时时间为4秒(50÷12.5)
     rWTCNT=50000;

     接下来是清除中断标志,注意WATCHDOG是有次级中断源的,所以需要清除二个中断挂起寄存器。

     rSRCPND |=BIT_WDT_AC97;
     rINTPND |=BIT_WDT_AC97;
     rSUBSRCPND |= BIT_SUB_WDT; //清除中断标志

     接下来是打开中断,也是打开二个中断允许寄存器。

     rINTMSK &= ~(BIT_WDT_AC97); 
     rINTSUBMSK &= ~(BIT_SUB_WDT);//开中断

     接下来是设置中断的起始地址,将中断服务程序的起始地址映射到内存。

     pISR_WDT_AC97=(unsigned)Wdt_Int;//设置中断程序入口

     我们进入中断服务程序看看:

——————————————————————————————————————————————

void __irq Wdt_Int(void)
{
      rSRCPND |=BIT_WDT_AC97;
      rINTPND |=BIT_WDT_AC97;
      rSUBSRCPND |= BIT_SUB_WDT; //清除中断标志
      rGPBDAT =1;   //蜂鸣器响
      Delay();
      rGPBDAT =0; //蜂鸣器响一段时间
}

——————————————————————————————————————————————

      进入中断服务程序后,首先清楚中断标志,接着让蜂鸣器响一下,接着关闭。

      最后进入死循环,前面四句是循环点亮LED灯,接着重新赋值给WTCNT,实现喂狗功能。

      rWTCNT=50000; //喂狗 没喂狗蜂鸣器很响

——————————————————————————————————————————————

到这里,我们WATCHDOG 定时器的讲解结束啦。

关键字:裸奔程序  看门狗定时器 引用地址:裸奔程序之看门狗定时器

上一篇:S5PC100看门狗定时器
下一篇:MSP430看门狗定时器

推荐阅读最新更新时间:2024-03-16 14:56

TQ2440裸奔程序:EINT中断按键测试程序
今天 与大家分享TQ2440裸奔程序。 //========================================= // NAME: main.c // DESC: TQ2440流水灯测试程序 // 板载LED为PB //========================================= #define U32 unsigned int #define _ISR_STARTADDRESS 0x33ffff00 #define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x20)) #define pISR_EINT1 (*(unsigned *)(_IS
[单片机]
定时器看门狗和RTC
什么是定时器(timer) 1.定时器是SoC中常见外设 1、定时器与计数器。计数器是用来计数的(每隔一个固定时间会计一个数);因为计数器的计数时间周期是固定的,因此到了一定时间只要用计数值×计数时间周期,就能得到一个时间段,这个时间段就是我们定的时间(这就是定时器了)。 2、定时器/计数器作为SoC的外设,主要用来实现定时执行代码的功能。定时器相对于SoC来说,就好像闹钟相对于人来说意义一样。 2.定时器有什么用 1、定时器可以让SoC在执行主程序的同时,可以(通过定时器)具有计时功能,到了一定时间(计时结束)后,定时器会产生中断提醒CPU,CPU会去处理中断并执行定时器中断的ISR。从而去执行预先设定好的事
[单片机]
Cortex-M3 (NXP LPC1788)之看门狗定时器对Flash编程的影响
这两天在学习窗口式看门狗模块,之前一直调试的很happy,今天早上突然就进入不了调试模式,而且无法擦除Flash,无法下载程序。郁闷了半天,以为是Keil软件和Ulink出了问题,在另外个电脑上重载,问题依旧。准备用ISP进行尝试,使用FlashMagic软件,进行读取芯片的ID,一直报警autobaud错误,进他提示的网页看下也没有什么有用的信息。 仔细看了数据手册,在Flash存储器章节看到如下信息。引导加载器(boot loader)控制芯片复位后的初始化操作,并提供对Flash存储器进行编程的工具。包括ISP,通过引导加载器软件和UART0串口片上Flash存储器进行编程或在编程。IAP,应用终端用户的应用代
[单片机]
STM32 HAL库学习系列第11篇---定时器TIM---看门狗基本配置及使用
基本配置 使用cube配置溢出时间 记住准时喂狗 独立看门狗: /* IWDG 1s 超时溢出 */ MX_IWDG_Init(IWDG_PRESCALER_64,625); /* 启动独立看门狗 */ HAL_IWDG_Start(&hiwdg); LED1_ON; /* while部分是我们在项目中具体需要写的代码,这部分的程序可以用独立看门狗来监控 * 如果我们知道这部 分代码的执行时间,比如是50ms,那么我们可以设置独立看门狗的 * 溢出时间是60ms,比50ms多一点, 如果要被监控的程序没有跑飞正常执行的话,那么 * 执行完毕之后就会执行喂狗的程序,如果程序跑飞
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved