zhang_yg188 发表于 2024-7-18 11:19:18

关于看门狗的疑问

本帖最后由 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”注释掉,不要这句,而只是仅仅保留循环里面的“清看门狗”语句,对于程序有什么影响?是不是也是一样的效果?请教。

soma 发表于 2024-7-18 11:41:21

清零看门狗定时器,硬件自动将此位复位

DebugLab 发表于 2024-7-18 11:48:10


不启动一直在清,应该是无效的

但用户程序中不启动,还可以由STCISP设置为硬件上电自动启动





注意一旦启动,软件无法关闭

zhang_yg188 发表于 2024-7-18 16:22:56

用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种写法,不是都一样的效果?

zhang_yg188 发表于 2024-7-18 16:30:15

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;
}

zhang_yg188 发表于 2024-7-18 16:31:52

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);
        }
}

晓飛飛 发表于 2024-7-18 20:55:18

使能看门狗,可以写成WDT_CONTR = 0x34,边启动边清零,效果一样的,

zhang_yg188 发表于 2024-7-19 10:44:34

晓飛飛 发表于 2024-7-18 20:55
使能看门狗,可以写成WDT_CONTR = 0x34,边启动边清零,效果一样的,

是的,我也觉得是这个结论。

易板 发表于 2025-4-24 11:29:44

牛X,迟点搞下看看
页: [1]
查看完整版本: 关于看门狗的疑问