原理:看门狗自己有个硬件计数器,看门狗开启后,计数器就开始计数,当计数为0时触发,触发事件有两个:系统复位和中断,可设置屏蔽。

  在计数器计数到0之前,程序可以重新设置计数器中的数值,称之喟狗。计数器的值设置完后,计数器重新用新的数值开始计数。

  看门狗开启后,由于应用程序挂了或系统当机了就会使得喟狗操作不再执行,计数器计数到0时就产生中断或复位。

喟狗时间=(((预分频设置值+1)*分频系数)/PCLK) *计数器值

主要设置2个寄存器:WTCON和WTCNT。另外WTDAT里面的值是给看门狗开启后第一次自动赋值给WTCNT的,之后不再从WTDAT赋值给WTCNT,必须手动更新WTCNT的值,此操作为喟狗。

关键驱动代码:

#define  IOCTL_WDG_OPEN     0x20    //    打开看门狗
#define  IOCTL_WDG_CLOSE    0x21    //    关闭看门狗
#define  IOCTL_WDG_FEED     0x22    //    喟狗
BOOL
WDG_IOControl(
              DWORD Handle,
              DWORD dwIoControlCode,
              PBYTE pInBuf,
              DWORD nInBufSize,
              PBYTE pOutBuf,
              DWORD nOutBufSize,
              PDWORD pBytesReturned
              )
{
    switch(dwIoControlCode)
    {
        case IOCTL_WDG_OPEN:    //    打开设置看门狗
            v_pWDGregs->WTCON = 0xFF39;   //设置看门狗控制寄存器
            v_pWDGregs->WTCNT = 0x3FC6;  
            RETAILMSG(, (TEXT("WDG: Open WatchDog\r\n")));
            break;

        case IOCTL_WDG_CLOSE:    //    关闭看门狗
            v_pWDGregs->WTCON = 0x0000;
            RETAILMSG(, (TEXT("WDG: Close WatchDog\r\n")));
            break;

        case IOCTL_WDG_FEED:    //    喟狗
            v_pWDGregs->WTCNT = 0x3FC6;  //Time=(((Prescaler+1)*Division)/PCLK) *WTCNT=(((255+1)*128)/(400M/6)) *16326=8.02455552秒
            break;

        default:
            break;
    }

    return TRUE;
}   // WDG_IOControl

附件下载

C++应用程序:

#define     IOCTL_WDG_OPEN            0x20    //    打开看门狗
#define     IOCTL_WDG_CLOSE          0x21    //    关闭看门狗
#define     IOCTL_WDG_FEED            0x22    //    喟狗

HANDLE wdgdriver;

void WDGInit()
{
    wdgdriver= CreateFile(L,NULL,OPEN_EXISTING,,NULL);
}

void Openwdg()
{
    //开启看门狗
    DeviceIoControl(wdgdriver,IOCTL_WDG_OPEN,NULL,,NULL,,NULL,NULL);
}

void Feedwdg()
{
    //喂狗
    DeviceIoControl(wdgdriver,IOCTL_WDG_FEED,NULL,,NULL,,NULL,NULL);
}

void Closewdg()
{
    //关闭看门狗
    DeviceIoControl(wdgdriver,IOCTL_WDG_CLOSE,NULL,,NULL,,NULL,NULL);
}

C#应用程序:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Runtime.InteropServices;
using System.Threading;

namespace WatchDog
{
    public partial class WDG : Form
    {
        //几个驱动操作参数
        ;
        const UInt32 GENERIC_READ = 0x80000000;
        const UInt32 GENERIC_WRITE = 0x40000000;
        ;

        private IntPtr hPort;

        //导入设备管理器API
        [DllImport("coredll.dll")]
        public static extern IntPtr CreateFile(String lpFileName, UInt32 dwDesiredAccess, UInt32 dwShareMode, IntPtr lpSecurityAttributes, UInt32 dwCreationDisposition, UInt32 dwFlagsAndAttributes, IntPtr hTemplateFile);
        [DllImport("coredll.dll")]
        public static extern bool DeviceIoControl(IntPtr hDevice, UInt32 dwIoControlCode, UInt32 lpInBuffer, UInt32 nInBufferSize, Byte[] lpOutBuffer, UInt32 nOutBufferSize, UInt32 lpBytesReturned, IntPtr lpOverlapped);

        public WDG()
        {
            InitializeComponent();

            //打开看门狗驱动
            hPort = CreateFile(, IntPtr.Zero, OPEN_EXISTING, , IntPtr.Zero);

            if (hPort == (IntPtr)INVALID_HANDLE_VALUE)
            {
                MessageBox.Show("Open Driver WDG1: Failed");
                return;
            }
        }

        private void OpenWDG_Click(object sender, EventArgs e)
        {
            DeviceIoControl(hPort, , , , , IntPtr.Zero);//开始看门狗
        }

        private void CloseWDG_Click(object sender, EventArgs e)
        {
            DeviceIoControl(hPort, , , , , IntPtr.Zero);//关闭看门狗
        }

        private void FeedWDG_Click(object sender, EventArgs e)
        {
            DeviceIoControl(hPort, , , , , IntPtr.Zero);//喟狗
        }

    }
}

S3C2416 看门狗的更多相关文章

  1. STM32之看门狗(独立与窗口)

    广大的互联网网友们,大家早上中午晚上好,我是某某某..对于狗..看过<忠犬八公>的我.无不深深的被狗的义气与灵气所震撼..我也觉得在所有mcu中用看门狗来形容让系统复位的功能是很恰当的.也 ...

  2. zigbee学习之路(十一):看门狗

    一.前言 今天,我们要通过实验学习和认识一下看门狗的使用,看门狗是为了防止防止程序跑飞的,通过不断的喂狗,使看门狗能持续监管程序的运行状态,当程序跑飞时,能及时把程序拽回来. 二.原理与分析 在CPU ...

  3. STM32之独立看门狗与窗口看门狗总结

    一.独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路 ...

  4. [ZigBee] 12、ZigBee之看门狗定时器——饿了就咬人的GOOD DOG

    引言:硬件中的看门狗,不是门卫的意思,而是一只很凶的狗!如果你不按时喂它,它就会让系统重启!这反而是我们想要的功能~ 1.看门狗概述 看门狗定时器(WDT,Watch Dog Timer)是单片机的一 ...

  5. 5、CC2541芯片中级教程-OSAL操作系统(PWM+看门狗)

    本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...

  6. 给NIOS II CPU增加看门狗定时器并使用

    给NIOS II CPU增加看门狗定时器并使用   配置看门狗定时器: 设置计时溢出时间为1秒 计数器位宽为32位 勾选No Start/Stop control bits 勾选Fixed perio ...

  7. Cubieboard2裸机开发之(五)看门狗操作

    前言 说到看门狗,应该不会陌生,看门狗说白了就是一个定时器,但是它有一个非常重要的功能就是复位系统.在A20里,看门狗的操作非常简单,只有两个寄存器,不需要操作时钟相关的东西,系统起来后可以直接使用, ...

  8. CC2540开发板学习笔记(八)—— 看门狗

    一.功能: 防止程序跑飞,使得系统重新进入工作状态,即一种复位操作吧. 但需要不停地喂狗= =(就是不断的执行某种操作),假如说你的程序跑到了不知道哪里去的错误时,即不会实现喂狗,就会发生复位,程序就 ...

  9. linux设备驱动归纳总结(十一):写个简单的看门狗驱动【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-112879.html linux设备驱动归纳总结(十一):写个简单的看门狗驱动 xxxxxxxxxxx ...

随机推荐

  1. Linux学习 :字符设备框架

    一.系统功能框架: U-boot : 启动内核 linux kernel: 启动应用 应用: open,read,write 都是通过C库实现,汇编就相当于swi val,引发中断,通过系统调用接口在 ...

  2. 解决小米wifi在windows10无法创建问题

    1.打开小米随身WIFI客户端安装文件夹(软件安装在那个盘,就在那个盘里找). 2.D:\Program Files (x86)\XiaoMi\MiWiFi\drivers\Win81x64(系统是3 ...

  3. jquery如何根据text选择option

    百度出来的代码都是这样的: $('#test option[text="b"]').attr("selected",true); 或 $('#test').fi ...

  4. fatal error: 'XCTest/XCTest.h' file not found

    这个报错在几个方面.第一,它导致XCTedt依赖您的应用程序.框架,它只是在Xcode中可用.第二,你使用绝对路径,这并不保证是相同的从Mac Mac(例如,如果你安装了多个版本的Xcode). 这里 ...

  5. Python的平凡之路(19)

    一.Django请求生命周期   对于所有的web框架来说本质就是一个socket服务端,浏览器是socket客户端                                          ...

  6. java中开源日志记录工具log4j

    日志:除了能记录异常信息,还可以记录程序正常运行时的关键信息. 使用log4j来进行日志文件记录经典步骤: 001.在项目中创建一个lib文件夹,然后将下载好的jar包copy到该文件夹下 002.对 ...

  7. 注意linux下面的命令行,要将PATH声明出来

    export PATH=/apps/svr/maven/bin:/apps/svr/jdk7/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/s ...

  8. Adaboost 算法

    一 Boosting 算法的起源 boost 算法系列的起源来自于PAC Learnability(PAC 可学习性).这套理论主要研究的是什么时候一个问题是可被学习的,当然也会探讨针对可学习的问题的 ...

  9. 用jQuery做一个三级菜单,鼠标移动到二级菜单的选项上,然后再迅速离开后,当鼠标再移动到该一级菜单或其他二级菜单选项,三级菜单也会显示。

    用jQuery做一个三级菜单,鼠标移动到二级菜单的选项上,然后再迅速离开后,当鼠标再移动到该一级菜单或其他二级菜单选项,三级菜单也会显示. 原因:在为一个元素绑定hover事件之后,用户把光标移入元素 ...

  10. NSDateFormatter遇到无法转换的问题

    NSDateFormatter并不是万能的,并不是给出什么字符串都能转遍为NSDate类型,所转换的格式必须必须和你给出的格式想对应 比如说:NSString *dateStr = @"20 ...