9.0 看门狗定时器WDT

来源:互联网 发布:建一个淘宝白菜群佣金 编辑:程序博客网 时间:2024/05/01 23:02
实例7---看门狗定时器WDT-----程序目的:如何应用WDT的看门狗模式与定时器模式
在工业现场,往往会由于供电电源、空间电磁干扰或其他原因引起强烈的干扰噪声。这些干极易使单片机产生误动作,从而失去应有的控制功能,引起MSP430发生“程序跑飞”事故。若不进行有效的处理,程序就不能回到正常的状态,从而失去应有的控制功能。看门狗定时器的工作原理很简单,只要是在规定时间内没有进行“喂狗”操作,则会产生一个非屏蔽中断,使系统复位,从而能够让程序从头开始运行。在MSP430单片机,看门狗有两种工作模式,分别是看门狗模式与定时器模式。

1.0 看门狗模式
在正常操作器件,一次WDT 定时时间到,将产生一次器件复位。如果通过编制程序使WDT 定时时间稍大于程序执行一遍所用的时间,并且程序执行过程中都有对看门狗定时器清零的操作(俗称喂狗),使计数器重新计数,则程序正常执行时,就会在WDT定时时间到达之前对WDT清零,不会产生WDT溢出,如果由于干扰使程序跑飞,则不会在WDT定时时间到达之前执行WDT清零指令,WDT就会产生溢出,从而产生系统复位CPU 需用重新运行用户程序,这样程序就可以又恢复正常运行状态。下面我们来看有关看门狗的寄存器:
  • WDTCTL:看门狗控制寄存器

  • 这个寄存器是16位的寄存器,在复位后的初始值为0x6900,。需要注意的就是WDTPW,这个是看门狗访问的安全口令,读取时总是为0x69,写入是必须是0x5A,如果不是0x5A则导致系统复位,有时我们需要人为复位系统时,我们也可以故意写错指令,则立马复位,相当于实现软复位。
  • 还需要注意就是WDTSSEL位,此位是WDT的时钟源选择,置0时为SMCLK,置1时为ACLK,所以在设置时间时一定要注意时钟源的选择。
  • IE1:中断使能寄存器1

  • IFG1:中断标志寄存器1


下面我们就是上个看门狗实例,在前面的system.c这个文件里,已经写有看门狗的开启及关闭函数,这节我们直接调用即可,主要我们来看主函数
#include <msp430f249.h>
#include "msp430type.h"
#include "system.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "exti.h"
#include "uart.h"

//主函数
void main(void)
{        
        Wdt_Off();//关闭看门狗
        Clock_Init();//系统时钟初始化
        Led_Init();//led灯初始化
        Key_Init();//按键初始化
        Uart0_Init();//串口0初始化 波特率9600
        
        _BIS_SR(GIE);//使能总中断
        
        printf("发生看门狗复位,请按下按键1进行喂狗!\r\n");
        Wdt_On();//打开看门狗
        
        while(1)
        {
                if(Kek_Scan() == 1) WDTCTL = WDT_ARST_1000;//清零计数器->喂狗
                LED_L;//点亮led灯                
        }
}

从主函数中看的出来,如果在1000ms内没有按下按键1喂狗,则会导致系统复位,一旦复位我们就可以接收到一段字符串,我们看下上位机


如果在1000ms内不断的按下按键1则不会导致复位,这个过程就是采取有效的喂狗操作,如果没有按下按键1则认为程序出故障,从而导致复位。在很多的实际应用中,可以说看门狗是必不可少的。

2.0 定时器模式
当不用做看门狗时,我们可以设置为内部定时器使用,但是仅有4中分频值,也就是说只有4种时间延时。
下面我们看程序,新建wdt.c与wdt.h文件

//WDT定时器底层驱动文件

#include <msp430f249.h>
#include "led.h"
#include "wdt.h"

//看门狗定时器模式初始化-默认ACLK时钟
//Mode:1:定时1000ms 2:定时250ms 3:定时16ms 4:定时1.9ms
void Wdt_Time_Init(u8 Mode)
{
        IE1 |= WDTIE;//使能WDT中断
        switch(Mode)
        {
        case 1:
                WDTCTL = WDT_ADLY_1000;//定时器模式,定时1000ms
                break;
        case 2:
                WDTCTL = WDT_ADLY_250;//定时器模式,定时250ms
                break;
        case 3:
                WDTCTL = WDT_ADLY_16;//定时器模式,定时16ms
                break;
        case 4:
                WDTCTL = WDT_ADLY_1_9;//定时器模式,定时1.9ms
                break;
        default:
                break;                
        }
}

//看门狗定时器中断
#pragma vector=WDT_VECTOR
__interrupt void WDT_ISR(void)
{
        LED_HL;//翻转led灯状态
}


//WDT定时器底层驱动头文件

#ifndef __WDT_H
#define __WDT_H

#include "msp430type.h"

//看门狗定时器模式初始化-默认ACLK时钟
void Wdt_Time_Init(u8 Mode);

#endif


主函数
#include <msp430f249.h>
#include "msp430type.h"
#include "system.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "exti.h"
#include "uart.h"
#include "wdt.h"

//主函数
void main(void)
{        
        Wdt_Off();//关闭看门狗
        Clock_Init();//系统时钟初始化
        Led_Init();//led灯初始化
        Key_Init();//按键初始化
        Uart0_Init();//串口0初始化 波特率9600
        Wdt_Time_Init(1);//初始化看门狗定时器,并定时1000ms
        
        _BIS_SR(LPM3_bits + GIE);//SCG1+SCG0+CPUOFF,使能总中断
}
从程序中看出,关闭了看门狗模式,然后初始化为定时器模式,并且定时1000ms,使能了定时中断,在中断函数里进行LED灯亮灭操作,也就是1秒操作一次。注意程序最后一行设置单片机进入LPM3低功耗模式并打开了总中断。

看门狗的时期内WDT课程完结。源程序:[attach]202797[/attach][attach]202798[/attach]   学习讨论Q群:167390222     2014年7月6日

0 0
原创粉丝点击