代码改变世界

深入解析:带你了解STM32:WDG看门狗

2025-11-22 17:24  tlnshuju  阅读(0)  评论(0)    收藏  举报

目录

1.WDG简介

2.IWDG框图(类比时基单元)

3.IWDG键寄存器

4.IWDG超时时间

5.WWDG框图

6.WWDG工作特性

7.WWDG超时时间

8.IWDG和WWDG对比

9.独立看门狗代码

第一步:按图接线到面包板

第二步:复制OLED显示屏工程

第三步:在主函数中看门狗部署

配置步骤:

独立看门狗相关库函数

主函数

独立看门狗完整代码

10.窗口看门狗代码

第一步:按图接线到面包板

第二步:复制独立看门狗工程

第三步:窗口看门狗模块

初始化步骤:

窗口看门狗相关库函数

主函数

窗口看门狗完整代码

11.看门狗库函数

独立看门狗相关库函数

窗口看门狗相关库函数


1.WDG简介

WDG(Watchdog)看门狗(自动复位电路)

看门狗可以监控工具的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性

一个定时器,当指定时间范围内,脚本没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号就是看门狗本质上

STM32内置两个看门狗

独立看门狗(IWDG):独立工作,对时间精度要求较低

窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用


2.IWDG框图(类比时基单元)


3.IWDG键寄存器

控制寄存器,用于控制硬件电路的工作就是键寄存器本质上

在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率


4.IWDG超时时间

超时时间:T_IWDG = T_LSI × PR预分频系数 × (RL + 1)

其中:TLSI = 1 / F_LSI(1/40K)(0.025ms)


5.WWDG框图

计数器和控制寄存器合二为一了,窗口看门狗没有重装寄存器,喂狗就直接在CNT写入数据即可

看门狗配置寄存器:喂狗的最早时间界限,写在这里存起来。

把当前计数值和预设的窗口值进行比较,喂狗太晚6位计数器减到0复位,喂狗太早,计数器的值超过窗口值复位,刚刚好在这喂狗时间内才不会复位)就是工作流程:默认36MHz的时钟从PCLK1进来,先经过一个预分频器进行分频,分频后的时钟,驱动计数器进行计数(T0~T5是有效位,T6是溢出标志位(1表示没有溢出,0表示溢出))(如果把T6位当成溢出标志位,低6位当作计数器,那就是低6位的计数值减到0之后溢出,如果把T6看成计数器的一部份,那整个计数器,值减到0x40之后溢出)左边的WDGA是窗口看门狗的激活位(写1启用窗口看门狗),看门狗配置寄存器,从W0到W6写入,这个是固定不变的,一旦执行写入CR(WWDG_CR)(写入计时器)(喂狗)操作时,与门开关会打开,比较器开始工作,一旦计数器T_6:0 > 窗口值W6:0,比较结果为1,这个1通过或门,也能够申请复位(就


6.WWDG工作特性

递减计数器T[6:0]的值小于0x40时,WWDG产生复位

递减计数器T[6:0]在窗口W[6:0]外被重新装载时,WWDG产生复位

递减计数器T[6:0]等于0x40时可以产生早期唤醒中断(EWI)(相当于电脑关机时问是否关机)(在即将复位时提醒),用于重装载计数器以避免WWDG复位

定期写入WWDG_CR寄存器(喂狗)以避免WWDG复位


7.WWDG超时时间

超时时间(喂狗最晚时间):T_WWDG = T_PCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] + 1)

窗口时间(喂狗最早时间):T_WIN = T_PCLK1 × 4096 × WDGTB预分频系数 × (T[5:0](计数器的时间) - W[5:0]())

其中:T_PCLK1 = 1 / F_PCLK1(1/36K)


8.IWDG和WWDG对比


9.独立看门狗代码

第一步:按图接线到面包板

第二步:复制OLED显示屏工程

第三步:在主函数中看门狗配置

配置步骤:

不用写代码开启,如果我们启动独立看门狗,LSI会自动打开,看图就是1.开启时钟LSI时钟,可

2.在键寄存器写入0x5555解除写保护

3.写入预分频器和重装寄存器,具体写入根据超时公式计算

4.在键寄存器写入0xCCCC启动独立看门狗,在主循环里将0xAAAA写入键寄存器实现不断喂狗

独立看门狗相关库函数

写使能控制,就是写入键寄存器

写预分频器

写重装值

重新装载寄存器,就是喂狗

启动独立看门狗

获取标志位状态

为了查看程序复位是看门狗导致的复位,还是上电或复位键导致的复位,要用到RCC的查看标志位函数,看完要清除,就用到了RCC清除标志位

主函数

独立看门狗完整代码


10.窗口看门狗代码

第一步:按图接线到面包板

第二步:复制独立看门狗工程

第三步:窗口看门狗模块

初始化步骤:

1.开启窗口看门狗APB1的时钟,这个就要写代码了,不会像独立看门狗那样了

2.配置各个寄存器,预分配、窗口值

3.写入看门狗控制寄存器CR,看门狗使能,计数器溢出标志位,计数器有用位。之后不断向计数器写入想要的重装值,喂狗

窗口看门狗相关库函数

恢复缺省设置

写入预分频器

写入窗口值

使能中断

写入计数器,喂狗

使能窗口看门狗

获取标志位、清除标志位

主函数

将最开始喂狗,和主循环喂狗的代码,离远一点,就是,主循环喂狗的代码,前面要有点代码执行,就不会过快复位

窗口看门狗完整代码


11.看门狗库函数

独立看门狗相关库函数

写使能控制,就是写入键寄存器

写预分频器

写重装值

重新装载寄存器,就是喂狗

启动独立看门狗

获取标志位状态

上电或复位键导致的复位,要用到RCC的查看标志位函数,看完要清除,就用到了RCC清除标志位就是为了查看程序复位是看门狗导致的复位,还

窗口看门狗相关库函数

恢复缺省配置

写入预分频器

写入窗口值

使能中断

写入计数器,喂狗

使能窗口看门狗

获取标志位、清除标志位