📄 internalwatchdog.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 + -