关于看门狗的疑问
本帖最后由 zhang_yg188 于 2024-7-18 11:20 编辑参看STC8G、8H的手册,关于看门狗的例程。在循环前面使能看门狗,循环中喂狗。
.....
WDT_CONTR = 0x24; //使能看门狗,溢出时间约为1s
P32 = 0; //测试端口
while (1)
{
WDT_CONTR = 0x34; //清看门狗,否则系统复位
Display(); //显示模块
Scankey(); //按键扫描模块
MotorDriver(); //电机驱动模块
}
}
-------------------------------------------------------------------------------
但是如果,使能看门狗,也写成:WDT_CONTR = 0x34; 对于程序有什么影响?是不是也是一样的效果?
或者,把循环前面“使能看门狗,溢出时间约为1s”注释掉,不要这句,而只是仅仅保留循环里面的“清看门狗”语句,对于程序有什么影响?是不是也是一样的效果?请教。
清零看门狗定时器,硬件自动将此位复位
不启动一直在清,应该是无效的
但用户程序中不启动,还可以由STCISP设置为硬件上电自动启动
注意一旦启动,软件无法关闭
用STC8G1k08—8PIN试验,主频11.0592MHz,串口波特率:115200。程序如下。ISP下载时,不选择“硬件自动启动看门狗”。
延时函数和串口输出函数,省略,ISP生成。
#include "STC8H.h" //包含了u8、u16、u32的定义
#include <intrins.h>
#include <delay_xms.h>
#include <uart.h>
//----主函数-----------------------------
void main(void)
{
u8 i;
Uart1_Init(); //串口初始化,11.0592MHz主频,115200波特率
SendASC(0x01); //复位后,串口输出0x01。
DelayXms(1000);
WDT_CONTR = 0x24; //使能看门狗,溢出时间约为1s。 语句1。
//WDT_CONTR = 0x34; //清除看门狗。 语句2。
while (1)
{
for (i=0;i<3;i++)
{
SendASC(0xff); //串口输出0xFF。
DelayXms(1000);
WDT_CONTR = 0x34; //清除看门狗
}
while(1); //语句3,不清除看门狗,复位。
}
}
串口输出信息,符合程序的要求。
接收←01
接收←FF
接收←FF
接收←FF
接收←01
接收←FF
接收←FF
接收←FF
接收←01
接收←FF
接收←FF
接收←FF
接收←01
接收←FF
如果,只是把上面程序的语句1、语句2修改如下:
//WDT_CONTR = 0x24; //使能看门狗,溢出时间约为1s。 语句1。
WDT_CONTR = 0x34; //清除看门狗。 语句2。
串口输出信息
接收←01
接收←FF
接收←FF
接收←FF
接收←01
接收←FF
接收←FF
接收←FF
接收←01
接收←FF
接收←FF
接收←FF
接收←01
接收←FF
接收←FF
接收←FF
接收←01
输出的信息,在时间间隔上没有任何区别。
把语句1、语句2全部注释,如下:
//----主函数-----------------------------
void main(void)
{
u8 i;
Uart1_Init(); //串口初始化,11.0592MHz主频,115200波特率
SendASC(0x01); //复位后,串口输出0x01。
DelayXms(1000);
//WDT_CONTR = 0x24; //使能看门狗,溢出时间约为1s。 语句1。
//WDT_CONTR = 0x34; //清除看门狗。 语句2。
while (1)
{
for (i=0;i<3;i++)
{
SendASC(0xff); //串口输出0xFF。
DelayXms(1000);
WDT_CONTR = 0x34; //清除看门狗
}
while(1); //语句3,不清除看门狗,复位。
}
}
串口输出信息
接收←01
接收←FF
接收←FF
接收←FF
接收←01
接收←FF
接收←FF
接收←FF
接收←01
接收←FF
接收←FF
接收←FF
接收←01
接收←FF
接收←FF
接收←FF
接收←01
接收←FF
接收←FF
输出的信息,在时间间隔上,也没有任何区别。
这样看,3种写法,不是都一样的效果?
void Uart1_Init(void) //115200bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xE8; //设置定时初始值
TH1 = 0xFF; //设置定时初始值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
}
//----串口发送数据函数---------------------
void SendASC(u8 mydata)
{
SBUF=mydata;
while(!TI);
TI=0;
} void DelayXms(u16 cycle)
{
unsigned char data i, j;
while (cycle--)
{
_nop_(); //@11.0592MHz -1ms
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
} 使能看门狗,可以写成WDT_CONTR = 0x34,边启动边清零,效果一样的, 晓飛飛 发表于 2024-7-18 20:55
使能看门狗,可以写成WDT_CONTR = 0x34,边启动边清零,效果一样的,
是的,我也觉得是这个结论。 牛X,迟点搞下看看
页:
[1]