⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 internalwatchdog.h

📁 用quartusII编写的
💻 H
字号:
/********************************************************************************
                              使用W77E58内部的看门狗
                              
            对W77E58的看门狗操作时需要注意,看门狗中的某些位对系统的正常运行是非常
      重要的,如果对这些位不进行保护,无关的代码可能会改写这些位,使系统工作不正常
      或失控。W77E58提供了一种保护机制,来控制对这些位的写(注意:是“写”)操作。
      这种保护机制被称为“时控访问保护”。
            例如:WDIF位用来在看门狗中断服务程序中清除中断,如果直接写WDIF位,则没有
      任何效果。伪代码如下:
            看门狗中断服务程序()
            {
                  WDIF = 0; // 没有任何效果,不会清除看门狗中断
            }
            
            正确的做法是:向TA寄存器(地址0xC7)顺序写入0xAA,0x55,打开3个机器周期
      的时控窗口,在这3个机器周期的时间内,必须完成对WDIF位的写入操作。伪代码如下:
            看门狗中断复位程序()
            {
                  TA = 0xAA;
                  TA = 0x55;
                  WDIF = 0;   // 正确,可以清除看门狗中断
            }
            
            对W77E58的看门狗定时器的操作步骤如下:
            (1)清0看门狗定时器RWT
            (2)设置超时值WD1,WD0
            (3)是否使能看门狗的中断EWDI
            (4)是否使能看门狗的复位系统功能EWT
            
            
            对W77E58的内部看门狗的使用需要注意,如果使能了看门狗的复位系统功能(EWT位为1)
      并且在规定的时间内没有喂狗,则系统会复位,复位以后EWT位仍然为1且(WD1,WD0)为00,
      (WD1,WD0)用来选择看门狗的超时值,当(WD1,WD0)为00的时候,看门狗定时器是一个17位的计数器,
      对晶振的振荡时钟进行计数。由于(WD1,WD0)为00,此时的看门狗定时器的溢出时间很短,可能会
      出现这样一种情况,在执行main()函数的初始化代码时看门狗定时器溢出,又因为EWT位为1,所以,
      又会复位系统(看门狗溢出引起的)。如果使用W77E58的内部看门狗,推荐在main()的第1行代码中
      禁止看门狗定时器的复位系统的功能,以后在需要时再使能看门狗定时器的复位系统的功能。
      伪代码如下:
            void main()
            {
                  WDT_RESET_DIS();  // 禁止看门狗定时器的复位系统的功能
                  
                  ......
            }
            
      更新日期:
            2005-6-9 16:46    编写
            2005-6-20 10:10   在Keil uVersion3,V7.5编译器下调试通过
********************************************************************************/

#ifndef INTERNAL_WATCH_DOG_H
#define INTERNAL_WATCH_DOG_H

// 使能和禁止看门狗定时器中断
#define     WDT_INT_EN()      EA=1;EWDI=1
#define     WDT_INT_DIS()     EWDI=0

// 使能和禁止看门狗定时器的复位系统的功能
#define     WDT_RESET_EN()    TA=0xAA; TA=0x55; EWT=1
#define     WDT_RESET_DIS()   TA=0xAA; TA=0x55; EWT=0
// 推荐在main()的第1行代码中禁止看门狗定时器的复位系统的功能,由于下面的条件编译#if为1,
// 在第一次编译时会发生编译错误。如果你确认main()的第1行代码为WDT_RESET_DIS(),请将下面的条件编译
// #if 1改为#if 0
#if 0
#error      "WDT_RESET_DIS() frist code in main(), #if 1 改为 #if 0" 
#endif

// 清零看门狗定时器
#define     WDT_CLEAR()       TA=0xAA; TA=0x55; RWT=1
                        
// 喂狗操作
#define     WDT_Feed()   WDT_CLEAR()



             

extern void WDT_Init(void);
extern void WDT_SetTimeoutValue( INT8U value );



#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -