大明狐 发表于 6 天前

STC单片机学习笔记杂记

因为自学的过程本身没啥章程,所以就把东一榔头西一棒槌的学习笔记弄成杂记吧 =。=;;;;;;


第一帖记录一下看门狗的学习笔记
一直看到“看门狗”,但是今天才跟着芯片手册,在单片机上试了一下。结合芯片手册和网上的资料,整理出一下心得。

============================



一、看门狗作用


“看门狗定时器(WDT,Watch Dog Timer)”是单片机热启动复位中的一种硬件复位,可以在单片机系统程序处于“跑飞”或“死机”之类异常状态的时候,强制重启单片机,重新弄开始运行正常的程序。
WDT不是“程序”,而是在硬件上独立于主系统,优先级高于所有中断和异常,从而无法被软件屏蔽或跳过,所以它本身不会“跑飞”或“死机”,是十分可靠的哨兵。

==========================================

二、看门狗相关寄存器


看门狗功能是通过寄存器WDT_CONTR,对五种功能进行控制。


Bit_7:WDT_FLAG (看门狗定时器溢出标志)
      看门狗定时器发生溢出时,硬件自动将此位置1
      (是否需要软件清零,跟启动方式有关,后面展开)

Bit_5:EN_WDT (看门狗使能位)
      0:禁用看门狗功能,对单片机无影响
      1:启动看门狗定时器


Bit_4:CLR_WDT (看门狗定时器清零)
      0:禁用看门狗功能,对单片机无影响
      1:启动看门狗定时器


Bit_3:IDL_WDT (IDLE模式时的门狗控制位)
      0:进入IDLE模式时看门狗停止计数
      1:进入IDLE模式时看门狗继续计数


Bit_2~Bit_0:WDT_PS (看门狗定时器时钟分频系数)
      用三个位表示八种分频系数:

例如当SYSclk=30M,WDT_PS=7时,分频系数是256溢出时间=12×32768×256÷30000000≈3.3554432秒(实测符合)



==========================================
三、看门狗启动方式

看门狗定时器有两种启动方式。

1. 软件启动方式
通过配置寄存器WDT_CONTR的第5位EN_WDT即可软件启动看门狗。
WDT_CONTR |= 0x20;      // 启动看门狗定时器


在软件启动方式下,可以在程序中随时关闭看门狗定时器。
WDT_CONTR &= ~0x20;      // 禁用看门狗定时器


2. 硬件启动方式

在AiCube-ISP的【硬件选项】列表中

勾选“上电复位时由硬件自动启动看门狗”,并选择需要的定时器分频系数。
烧录程序之后即可开启看门狗。
在硬件启动方式下,在程序运行中无法通过给寄存器EN_WDT位赋值关闭看门狗定时器,只能通过对单片机进行冷启动进行关闭。

这一点在8G和8H的芯片手册里的相关描述有些模糊,



不知道想表达的是不是“也可硬件自动启动,但看门狗定时器启动后,软件将无法关闭”?

这是在两种启动方式尝试软件关闭的结果
程序的思路是:
(1)绿灯先闪烁,闪烁过程中喂狗;
(2)然后绿灯长亮,红灯开始闪烁,闪烁过程中不喂狗;
(3)在绿灯闪烁过程中添加软件关闭看门狗的代码。
通过观察是否重启,判断两种方式开启看门狗定时器之后,手动关闭是否生效。

1039

用ISP的硬件开启方式的话,即便加上这行代码,单片机到了时间确实依旧会重启,所以确实无法软件关闭;
而在用软件开启的方式下,绿灯长亮之后的确没有重启,说明软件关闭生效了。

此外,对于ISP中的硬件方式启动的选项,不论是勾选还是取消勾选,烧录完程序之后,都需要给单片机重新上电才会生效。

=============================================
四、看门狗工作过程

通过软件或者硬件的方式启动看门狗之后,看门狗定时器就会根据设置好的分频系数开始计数。
当看门狗定时器计数达到16位最大值65535之后,就会溢出,于是触发单片机重启。
需要在程序中通过配置WDT_CONTR寄存器的第4位CLR_WDT位,及时将看门狗定时器的计数清零,从而防止重启。

WDT_CONTR &= ~0x10;      // 看门狗定时器清零

这个过程叫做“喂狗”。需要在程序中适当的位置添加“喂狗”的代码,从而起到对程序运行的监控作用。
根据网上查到的建议,喂狗周期应小于溢出时间的 70%,留足余量。(不知道有没有依据)

==================================================
五、关于溢出标志位WDT_FLAG

当程序跑飞或者死循环时,会因为没有及时“喂狗”而导致看门狗定时器的计数溢出。此时看门狗会触发系统复位并自动将WDT_FLAG标志位置1。
可以通过这个标志位的值,对系统复位动作做出报警,或者对复位行为进行记录。
在系统程序中,复位后需要及时将这个标志位清零,否则可能会被误认为看门狗仍处于异常状态,导致程序逻辑错误。

不过在STC8G1K08A/17A还有STC8H8K64U单片机上测试的结果,软件启动看门狗和硬件启动看门狗,WDT_FLAG标志位的状态是不同的。

程序的思路是:
单片机主频30Mhz,溢出时间大约3.3s,用两颗LED灯珠观察程序运行状态。
(1)其中绿灯表示的是程序运行的过程,红灯表示溢出标志位WDT_FLAG的值(1-亮,0-灭)。
(2)在单片机启动之后,绿色灯初始化为点亮状态,然后间隔200ms亮灭10次,每次点亮或者熄灭的同时,都进行喂狗。
(3)绿灯闪烁结束之后长亮,然后程序进入while(1)死循环,并且不再喂狗。
(4)在绿灯长亮3.3s左右之后,看门狗会触发单片机重启。WDT_FLAG此时应该已经被置1。
(5)整个过程中都不对WDT_FLAG进行清零。

通过这个程序查看每次系统自动重启之后,WDT_FLAG的值的状态。


在通过软件启动看门狗的情况下,如果不使用对该标志位清零的代码,那么在单片机重启之后,尽管没有写软件清零的代码,该标志位的数值也会随之清零。
结果只能看到绿色LED闪烁和亮灭,红色LED始终没有被点亮。
所以只能起到对程序运行的保护作用。

而在硬件启动看门狗的情况下,如果不使用对该标志位清零的代码,那么在单片机重启之后,该标志位仍旧会保持置1的状态。
结果是能看到绿色LED闪烁和亮灭,并且在首次运行时,WDT_FLAG的值是0,所以红色LED不亮;在之后的每次重启之后,WDT_FLAG的值都没有被清零,所以红色LED在之后几轮中也都是亮的。这时才会想起芯片手册里说明的“需要软件清零”的作用。
这时才有可能起到报警作用。



1038


=========================
另外,
如果在程序中使用了EN_WDT软件启动看门狗的代码,
同时ISP里也勾选了硬件启动的选项,
结果就比较拧巴:
1、每次重启,WDT_FLAG的值都会自己归零(软件启动方式的现象);
2、软件方式关闭看门狗定时器的代码无效(硬件启动方式的现象)。









_奶咖君_ 发表于 5 天前

看门狗的话,无论ISP软件上设置的硬件启动,还是在代码中软件开启。他都不会关闭。

所以是那么个写法。

大明狐 发表于 5 天前

_奶咖君_ 发表于 2026-3-24 09:15
看门狗的话,无论ISP软件上设置的硬件启动,还是在代码中软件开启。他都不会关闭。

所以是那么个写法。

昨晚在STC8G和8H上都试了一下{:4_267:}

如果在LED闪烁的代码里加上 WDT_CONTR &= ~0x20; 这句通过软件停止看门狗的代码,
用ISP的硬件开启方式的话,即便加上这行代码,单片机到了时间确实依旧会重启,所以确实无法软件关闭;
而在用软件开启的方式下,绿灯长亮之后的确没有重启,说明软件关闭生效了。

所以猜测手册里的那个“一旦”似乎应该改成“但”,就一切说得通了。

_奶咖君_ 发表于 5 天前

大明狐 发表于 2026-3-24 09:25
昨晚在STC8G和8H上都试了一下

如果在LED闪烁的代码里加上 WDT_CONTR &= ~0x20; 这句通过软件停止看门狗的 ...

要么就是你测试代码有问题,,要么就是手册有问题。找老姚安排个人看看吧。

_奶咖君_ 发表于 5 天前

大明狐 发表于 2026-3-24 09:25
昨晚在STC8G和8H上都试了一下

如果在LED闪烁的代码里加上 WDT_CONTR &= ~0x20; 这句通过软件停止看门狗的 ...

所以有结果了么{:4_171:}

大明狐 发表于 5 天前

_奶咖君_ 发表于 2026-3-24 14:04
所以有结果了么

效果视频更新到1楼了,前几秒是代码。
今天把论坛上看门狗的几个教学视频都看了一遍,都没提关闭看门狗的事儿。
不过感觉不是大问题。
唯一需要考虑关闭的场景也就是IDLE模式下,单独关闭IDL_WDT就行。
关于手册描述的问题,虽然描述比较模糊,但是也无伤大雅,修改了可以更严谨。

另外关于溢出标志位是否自动清零的区别,感觉在8G/8H上问题不大,倒是在32G和8051U上更需要考虑,因为还会影响到复位标志寄存器,这一点在折途和冲哥的视频里都有提到。

_奶咖君_ 发表于 5 天前

有很多坛友使用的时候,以为软件开启的看门狗可以关闭,然后出现了这样那样的问题。

我是看到终于有版主来认真的测试这些机制了,想着你们近水楼台先得月,最好是搞搞清楚,毕竟手册上有明显的错误是个大问题。

大明狐 发表于 5 天前

_奶咖君_ 发表于 2026-3-24 14:21
有很多坛友使用的时候,以为软件开启的看门狗可以关闭,然后出现了这样那样的问题。

我是看到终于有版主来 ...
软件开启的看门狗,的确可以软件关闭;
只有在ISP里勾选了硬件开启(不论有没有用软件开启的代码),软件关闭才会失效。

手册上的描述虽然有偏差,但是至少偏到“不可软件关闭”的一边,既然开启了,不关闭也无妨。
至于运行机制,那是硬件层面的事情,单靠我这种半瓶子醋的测试也得不出啥答案{:4_181:}只能起到具体用到的时候避避坑的作用。

_奶咖君_ 发表于 5 天前

{:4_177:}看来这次你是被问题解决掉了,,,祝你好运

狂热主宰 发表于 5 天前

大明狐 发表于 2026-3-24 14:42
软件开启的看门狗,的确可以软件关闭;
只有在ISP里勾选了硬件开启(不论有没有用软件开启的代码),软件 ...

执行OTA程序耗时比较长
需要暂时关闭看门狗
页: [1] 2
查看完整版本: STC单片机学习笔记杂记