打印
[牛人杂谈]

看门狗

[复制链接]
1449|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在由微控制器构成的微型计算机系统中,由于微控制器的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由微控制器控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对微控制器运行状态进行实时监测的考虑,便产生了一种专门用于监测微控制器程序运行
状态的芯片,俗称”看门狗”(watchdog)。
看门狗电路的应用,使微控制器可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和微控制器的一个I/O引脚相连,并定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在微控制器其他控制语句中间的,一旦微控制器由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不
能被执行,这个时候,看门狗电路就会由于得不到微控制器送来的信号,便在它和微控制        图12.1.1 看门狗器复位引脚相连的引脚上送出一个复位信号,使微控制器发生复位,即程序从程序存储器的起始位置开始执行,这样便实现了微控制器的自动复位。
在以前传统的8051往往没有内置看门狗,都是需要外置看门狗的,例如常用的看门狗芯片有Max813、5045、IMP706、DS1232。
例如芯片DS1232在系统工作时如下图,必须不间断的给引脚|ST输入一个脉冲系列,这个脉冲的时间间隔由引脚TD设定,如果脉冲间隔大于引脚TD的设定值,芯片将输出一个复位脉冲使微控制器复位。一般将这个功能称为看门狗,将输入给看门狗的一系列脉冲称为“喂狗”。这个功能可以防止微控制器系统死机。

虽然看门狗的好处是很多,但是其成本制约着是否使用外置看门狗抉择。不过幸运的是,现在很多微控制器都内置看门狗,例如
AVR、PIC、ARM,当然现在的M451系列微控制器也不例外,其已经内置了看门狗,而且基本上满足了项目的需要。


沙发
zhuotuzi|  楼主 | 2019-1-22 16:25 | 只看该作者
特征
        18位的向上看门狗定时器可满足用户溢出时间间隔要求。
        溢出时间间隔(24 ~218)个WDT_CLK时钟周期可选,如WDT_CLK = 10 kHz,那么溢出时间间隔是1.6 ms ~ 26.214s。
        系统复位保持时间(1/WDT_CLK)*63 。
        支持看门狗定时器复位延时周期, 包括 1026、130、18 或 3 个WDT_CLK的复位延时时间。
        通过设置CONFIG0中CWDTEN[2:0]位为1,支持芯片上电或复位条件下看门狗强制打开。
        如果时钟源选择内部低速10k时钟或LXT时钟,支持看门狗定时器溢出唤醒。

使用特权

评论回复
板凳
zhuotuzi|  楼主 | 2019-1-22 16:33 | 只看该作者
使能看门狗超时中断和超时唤醒中断,设计程序让看门狗产生3次超时中断进行喂狗,3 次过后则不执行喂狗,让系统复位。

使用特权

评论回复
地板
zhuotuzi|  楼主 | 2019-1-22 16:33 | 只看该作者
本帖最后由 zhuotuzi 于 2019-1-22 16:38 编辑



  
序号
  
函数分析
  
1
  
void  WDT_Open(uint32_t u32TimeoutInterval, uint32_t u32ResetDelay, uint32_t  u32EnableReset, uint32_t u32EnableWakeup) 位置:wdt.c
  
功能:初始化看门狗并启动计数参数:
  
u32TimeoutInterval:看门狗超时时间  u32ResetDelay:看门狗复位延迟时间 u32EnableReset:是否使能复位  u32EnableWakeup:是否使能唤醒复位
  
2
  
void  WDT_EnableInt(void) 位置:wdt.c
  
功能:使能看门狗触发中断参数:无
  
3
  
WDT_RESET_COUNTER()  位置:wdt.h
  
功能:复位看门狗计数值参数:无


使用特权

评论回复
5
zhuotuzi|  楼主 | 2019-1-22 16:39 | 只看该作者

使用特权

评论回复
6
zhuotuzi|  楼主 | 2019-1-22 16:39 | 只看该作者

使用特权

评论回复
7
zhuotuzi|  楼主 | 2019-1-22 16:41 | 只看该作者
/************************* Copyright (c) 2014 *****************************
*项目名称:看门狗超时复位
*开发平台:SmartM-M4系列开发板
****************************************************************************************/
#include "SmartM_M4.h"

/*-------------------------------------------------------*/
/*                     全局变量                          */
/*-------------------------------------------------------*/
EXTERN_C INT32         IsDebugFifoEmpty(VOID);
VOLATILE UINT32 g_unWDTINTCounts;
VOLATILE UINT8         g_bIsWDTWakeupINT;


/*-------------------------------------------------------*/
/*                        函数                           */
/*-------------------------------------------------------*/

/****************************************
*函数名称:main
*输    入:无
*输    出:无
*功    能:函数主体
******************************************/
INT32 main(VOID)
{

        PROTECT_REG
        (
                /* 系统时钟初始化 */
                SYS_Init(PLL_CLOCK);

                /* 使能看门狗时钟 */
                CLK_EnableModuleClock(WDT_MODULE);

                /* 看门狗时钟源为内部低速10KHzRC*/
                CLK_SetModuleClock(WDT_MODULE, CLK_CLKSEL1_WDTSEL_LIRC, 0);

                /* 串口0初始化波特率为115200bps */       
                UART0_Init(115200);
        )


        printf("+----------------------------------------+\n");
        printf("|    WDT Time-out Wake-up Sample Code    |\n");
        printf("+----------------------------------------+\n\n");

        /* 检查复位是否看门狗复位导致 */
        if(WDT_GET_RESET_FLAG() == 1)
        {
                WDT_CLEAR_RESET_FLAG();
                printf("*** System has been reset by WDT time-out event ***\n\n");
                while(1);
        }

        /* 使能看门狗NVIC中断 */
        NVIC_EnableIRQ(WDT_IRQn);

        /* 受保护的寄存器都进行解锁 */
        SYS_UnlockReg();

        g_unWDTINTCounts = g_bIsWDTWakeupINT = 0;
       
        /* 设置看门狗超时时间为2^14次方看门狗时钟周期,看门狗延迟复位为18个看门狗时钟周期,启动看门狗计数 */               
        WDT_Open(WDT_TIMEOUT_2POW14, WDT_RESET_DELAY_18CLK, TRUE, TRUE);

        /* 使能看门狗触发中断 */
        WDT_EnableInt();

        while(1)
        {
                /* 系统进入掉电模式前必须对受保护的寄存器进行解锁,因为改写PWRCTL寄存器需要对其解锁 */
                SYS_UnlockReg();
               
                printf("\nSystem enter to power-down mode ...\n");
               
                /* 检查是否所有打印信息已经结束 */
                while(IsDebugFifoEmpty() == 0);
               
                /* 系统进入掉电模式 */                       
                CLK_PowerDown();

                /* 检查当前看门狗是否触发了超时中断和唤醒中断 */
                while(g_bIsWDTWakeupINT == 0);

                g_bIsWDTWakeupINT = 0;
               
                /* 打印当前看门狗触发中断的次数 */
                printf("System has been waken up done. WDT interrupt counts: %d.\n\n", g_unWDTINTCounts);
        }
}


/*-------------------------------------------------------*/
/*                   中断服务函数                        */
/*-------------------------------------------------------*/
VOID WDT_IRQHandler(VOID)
{
        if(g_unWDTINTCounts < 3)
        {       
                /* 看门狗复位计数值亦即喂狗 */
                WDT_RESET_COUNTER();                       
        }
       
        /* 检查当前看门狗触发的中断是否超时中断 */
        if(WDT_GET_TIMEOUT_INT_FLAG() == 1)
        {
                /* 清除看门狗超时中断标志位 */
                WDT_CLEAR_TIMEOUT_INT_FLAG();

                g_unWDTINTCounts++;
        }

        /* 检查当前看门狗触发的中断是否超时唤醒中断 */               
        if(WDT_GET_TIMEOUT_WAKEUP_FLAG() == 1)
        {
                /* 清除看门狗超时唤醒中断标志位 */
                WDT_CLEAR_TIMEOUT_WAKEUP_FLAG();

                g_bIsWDTWakeupINT = 1;
        }
}



使用特权

评论回复
8
jiekou001| | 2019-1-22 17:13 | 只看该作者
#ifndef __SMARTM_M4_H__
#define __SMARTM_M4_H__

/*
  ----------------------------------------------------

                       系统
  
  ----------------------------------------------------
*/
#include "stdio.h"
#include "M451Series.h"
#include "Common.h"
#include "Typedef.h"



/*
  ----------------------------------------------------

                       外设
  
  ----------------------------------------------------
*/
#include "wdt.h"



/*
  ----------------------------------------------------

                       配置
  
  ----------------------------------------------------
*/

#define PLL_CLOCK   72000000UL



#endif



使用特权

评论回复
9
mintspring| | 2019-1-22 23:55 | 只看该作者
用中文说明一下,立马就懂了。

使用特权

评论回复
10
598330983| | 2019-1-23 10:19 | 只看该作者
可以讨论一下跟窗口看门狗的对比。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

197

主题

3263

帖子

7

粉丝