找回密码
 立即注册
查看: 735|回复: 8

关于看门狗的疑问

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-07-18 11:10:17

4

主题

15

回帖

128

积分

注册会员

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

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-01 09:54:52
已绑定手机

19

主题

3190

回帖

4866

积分

论坛元老

积分
4866
发表于 2024-7-18 11:41:21 | 显示全部楼层
清零看门狗定时器,硬件自动将此位复位
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-7-18 11:48:10 | 显示全部楼层

不启动一直在清,应该是无效的
截图202407181145462632.jpg
但用户程序中不启动,还可以由STCISP设置为硬件上电自动启动


截图202407181146542915.jpg


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

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-07-18 11:10:17

4

主题

15

回帖

128

积分

注册会员

积分
128
发表于 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,不清除看门狗,复位。
                }
}
串口输出信息,符合程序的要求。
[16:01:21.818]接收←01
[16:01:22.568]接收←FF
[16:01:23.308]接收←FF
[16:01:24.058]接收←FF
[16:01:26.048]接收←01
[16:01:26.798]接收←FF
[16:01:27.548]接收←FF
[16:01:28.298]接收←FF
[16:01:30.290]接收←01
[16:01:31.040]接收←FF
[16:01:31.790]接收←FF
[16:01:32.530]接收←FF
[16:01:34.530]接收←01
[16:01:35.280]接收←FF

如果,只是把上面程序的语句1、语句2修改如下:
        //WDT_CONTR = 0x24;                                       //使能看门狗,溢出时间约为1s。         语句1。
        WDT_CONTR = 0x34;                                        //清除看门狗。                                        语句2。

串口输出信息
[16:05:12.259]接收←01
[16:05:13.009]接收←FF
[16:05:13.759]接收←FF
[16:05:14.499]接收←FF
[16:05:16.499]接收←01
[16:05:17.249]接收←FF
[16:05:17.989]接收←FF
[16:05:18.738]接收←FF
[16:05:20.739]接收←01
[16:05:21.479]接收←FF
[16:05:22.229]接收←FF
[16:05:22.979]接收←FF
[16:05:24.969]接收←01
[16:05:25.719]接收←FF
[16:05:26.469]接收←FF
[16:05:27.219]接收←FF
[16:05:29.209]接收←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,不清除看门狗,复位。
                }
}
串口输出信息
[16:07:37.955]接收←01
[16:07:38.704]接收←FF
[16:07:39.444]接收←FF
[16:07:40.194]接收←FF
[16:07:42.195]接收←01
[16:07:42.934]接收←FF
[16:07:43.685]接收←FF
[16:07:44.435]接收←FF
[16:07:46.424]接收←01
[16:07:47.175]接收←FF
[16:07:47.925]接收←FF
[16:07:48.674]接收←FF
[16:07:50.665]接收←01
[16:07:51.414]接收←FF
[16:07:52.164]接收←FF
[16:07:52.905]接收←FF
[16:07:54.904]接收←01
[16:07:55.644]接收←FF
[16:07:56.394]接收←FF

输出的信息,在时间间隔上,也没有任何区别。
这样看,3种写法,不是都一样的效果?

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-07-18 11:10:17

4

主题

15

回帖

128

积分

注册会员

积分
128
发表于 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;
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-07-18 11:10:17

4

主题

15

回帖

128

积分

注册会员

积分
128
发表于 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);
        }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-7-18 20:55:18 | 显示全部楼层
使能看门狗,可以写成WDT_CONTR = 0x34,边启动边清零,效果一样的,
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-07-18 11:10:17

4

主题

15

回帖

128

积分

注册会员

积分
128
发表于 2024-7-19 10:44:34 | 显示全部楼层
晓*** 发表于 2024-7-18 20:55
使能看门狗,可以写成WDT_CONTR = 0x34,边启动边清零,效果一样的,

是的,我也觉得是这个结论。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-24 11:29:44

2

主题

8

回帖

128

积分

注册会员

积分
128
发表于 2025-4-24 11:29:44 | 显示全部楼层
牛X,迟点搞下看看
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 01:42 , Processed in 0.184742 second(s), 109 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表