STM32 拓展 看门狗

目录

什么是看门狗

STM32的看门狗

独立看门狗

[1 计数器时钟](#1 计数器时钟)

[2 预分频寄存器](#2 预分频寄存器)

[3 12位递减计数器](#3 12位递减计数器)

[4 重装载寄存器](#4 重装载寄存器)

[5 键寄存器](#5 键寄存器)

[6 状态寄存器](#6 状态寄存器)

窗口看门狗

[1 窗口看门狗的时钟来源](#1 窗口看门狗的时钟来源)

[2 计数器的时钟频率](#2 计数器的时钟频率)

[3 计数器](#3 计数器)

[4 窗口值](#4 窗口值)

独立看门狗和窗口看门口的对比


什么是看门狗

看门狗是一种计时硬件电路

当系统环境比较恶劣复杂的时候,程序可能会出现一些不可预料的错误,导致程序卡死,崩溃等情况。看门狗就可以及时的重置程序,使程序重新从头开始运行。

STM32的看门狗

STM32 有2个看门狗,独立看门狗窗口看门狗。独立看门狗号称宠物狗,窗口看门狗号称警犬。

独立看门狗

IWDG(Independent watchdog,独立看门狗)。独立看门狗用通俗一点的话来解释就是一个 12 位递减 计数器,当计数器的值从某个值一直减到 0 的时候,系统就会产生一个复位信号,即 IWDG_RESET。如果在计数没减到 0 之前,刷新了计数器的值的话,那么就不会产生复位信号,这个刷新计数器值的动作就是我们经常说的喂狗。

1 计数器时钟

独立看门狗的时钟由独立的 RC 振荡器 LSI提供,即使主时钟发生故障它仍然有效,非常独立(叫独立看门狗的由来)。

LSI 的频率一般在 30~60KHZ 之间,根据温度和工作场合会有一定的漂移,我们一般取 40KHZ,所以独立看门狗的定时时间并不一定非常精确,只适用于对时间精度要求比较低的场合。

2 预分频寄存器

这里存储着我们想要的预分频值。

3 12位递减计数器

独立看门狗的计数器是一个 12 位的递减计数器,最大值为 0XFFF,当计数器减到 0 时,会产生一个复位信号:IWDG_RESET,让程序重新启动运行,如果在计数器减到 0 之前刷新了计数器的值的话,就不会产生复位信号,重新刷新计数器值的这个动作我们俗称喂狗。

KR决定什么时候喂狗。

喂狗:RLR进行重装载。

4 重装载寄存器

重装载寄存器是一个 12 位的寄存器,里面装着要刷新到计数器的值,这个值的大小决定着独立看门狗的溢出时间。

这里的超时时间是指如果超过这个时间不喂狗,就会产生复位信号。超时时间的计算公式:

注意:时钟频率是40KHz。

预分频系数只有表中固定的这些值(3位PR值决定)。

RL的值就是重装载寄存器中的值。计数器的初始值。

5 键寄存器

键寄存器 IWDG_KR独立看门狗的一个控制寄存器,只能写入0-15位,读永远是0。三种控制方式,往这个寄存器写入下面三个不同的值有不同的效果。

|-------------------------|--------------------------------------------|
| 写入键寄存器的值 | 作用 |
| 0xCCCC | 软件启动看门狗。若启用了硬件看门狗,则此命令无效。看门狗一旦启动,无法停止。 |
| 0xAAAA | 重装载计数器的值加入到计数器中。(喂狗) |
| 0x 5555 | 允许访问IWDG_PR(预分频计数器)和IWDG_RLR(重装载计数器)寄存器。 |
| 其他值 | 开启IWDG_PR(预分频计数器)和IWDG_RLR(重装载计数器)寄存器的写保护。 |

6 状态寄存器

状态寄存器 SR 只有位 0:PVU 和位 1:RVU 有效,这两位只能由硬件操作,软件操作不了。

窗口看门狗

WWDG(Window watchdog,窗口看门狗)。窗口看门狗跟独立看门狗一样,也是一个递减计数器不断的往下递减计数。

当计数器减到一个固定值 0x40(T6位减到0)时还不喂狗的话,产生复位,这个值叫窗口的下限,是固定的值,不能改变。这个是跟独立看门狗类似的地方。

不同的地方是窗口看门狗的计数器的值在减到某一个数之前喂狗的话也会产生复位,这个值叫窗口的上限,上限值由用户 独立设置。窗口看门狗计数器的值必须在上窗口和下窗口之间才可以喂狗,喂早了喂晚了都不行。这就是窗口看门狗中窗口两个字的含义。

1 窗口看门狗的时钟来源

来源于PCLK1,PCLK1的最大频率是36MHz,由RCC控制开启。

2 计数器的时钟频率

计数器时钟由 CK 计时器时钟经过预分频器分频得到,分频系数由配置寄存器WWDG_CFR的[8:7]两位配置,可以是 [0,1,2,3]。

所以计时器时钟频率 = PCLK1/4096/分频系数,这里先除以4096是因为PCLK1在进来之前有一个4096的分频,只是图中没有画出来而已。

3 计数器

窗口看门狗的计数器是一个递减计数器,共有 7 位,其值存在控制寄存器 CR 的T[6:0]位,当 7 个位全部为 1 时是 0X7F,这个是最大值。

当递减到 T6 位变成 0 时,即从 0X40 变为 0X3F 时候,会产生看门狗复位。这个值 0X40 是看门狗能够递减到的最小值,所以计数器的值只能是:0X40~0X7F 之间。

实际上真正用来计数的是 T[5:0]。当递减计数器递减到 0X40 的时候,还不会马上产生复位,如果使能了提前唤醒中断:CFR 位 9 (EWI) 置 1,则产生提前唤醒中断,如果真进入了这个中断的话,就说明程序肯定是出问题了,那么在中断服务程序里面我们就需要做最重要的工作,比如保存重要数据,或者报警等,这个中断我们也叫它死前中断

4 窗口值

窗口看门狗必须在计数器的值在一个范围 内才可以喂狗,其中下窗口的值是固定的0X40,上窗口的值可以改变,具体的由配置寄存器 CFR 的位 W[6:0] 设置。其值必须大于0X40,如果小于或者等于 0X40 就是失去了窗口的价值,而且也不能大于计数器的值,所以必须得小于 0X7F。

那窗口值具体要设置成多大?这个得根据我们需要监控的程序的运行时间来决定。如果我们要监控的程序段 A 运行的时间为 Ta,当执行完这段程序之后就要进行喂狗,如果在窗口时间内没有喂狗的话,那程序就肯定是出问题了。一般计数器的值设置成最大 0x7F,窗口值为 WR,计数器减一个数的时间为 T,那么时间:(0x7F-WR)*T 应该稍微大于 Ta 即可,这样就能做到刚执行完程序段 A 之后喂狗,起到监控的作用,这样也就可以算出 WR 的值是多少。

独立看门狗和窗口看门口的对比

|---------------|-----------------------|------------------------|
| | 独立看门狗 | 窗口看门狗 |
| 复位 | 计数减到0 | 计数器T[5,0]减到0和过早重装计数器 |
| 喂狗方式 | 键寄存器写入0xAAAA,重装固定值RLR | 直接写入寄存器,写多少重装多少 |
| 中断 | 无 | 死前中断 |
| 时钟源 | LSI(40KHz) | PCLK1(36MHz) |
| 预分频系数 | 4,8 ,32, 64 ,128, 256 | 1,2, 4, 8 |
| 计数器 | 12位 | 6位 |
| 超时时间 | 0.1ms到26214.4ms | 113us到58.25ms |
| 用途 | 独立工作,对时间精度要求比较低 | 要求看门狗在计时窗口起作用 |

相关推荐
OpenVINO生态社区11 分钟前
【FPGA与单片机的区别】
单片机·嵌入式硬件·fpga开发
iFinder@1 小时前
【51单片机】01入门篇
单片机·嵌入式硬件·51单片机
通信小菜鸡@posedge clk1 小时前
FPGA实现UART对应的电路和单片机内部配合寄存器实现的电路到底有何区别?
单片机·嵌入式硬件·fpga开发
可喜~可乐2 小时前
总线通信接口I²C以及SPI入门指南:从原理到实践
c语言·stm32·单片机·嵌入式硬件
JaneZJW2 小时前
嵌入式岗位面试八股文(篇三 操作系统(下))
linux·stm32·面试·嵌入式·c
iFinder@4 小时前
【51单片机】02LED流水灯实验
嵌入式硬件·mongodb·51单片机
ElePower95274 小时前
STM32学习(十)
stm32·嵌入式硬件
Echo_cy_4 小时前
STM32 I2C硬件配置库函数
stm32·单片机·嵌入式硬件
mftang4 小时前
基于STM32G4(SPI接口)驱动DRV8353RS
嵌入式硬件
majingming1235 小时前
ST-LINK下载程序接线
stm32