STM32学习笔记——看门狗溢出时间配置

看门狗简介

以下介绍来自百度百科

在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成各种寄存器和内存的数据混乱,会导致程序指针错误,不在程序区,取出错误的程序指令等,都有可能会陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续正常工作,导致整个系统的陷入停滞状态,发生不可预料的后果。

看门狗,又叫 watchdog,从本质上来说就是一个定时器电路,一般有一个输入和一个输出,其中输入叫做喂狗,输出一般连接到另外一个部分的复位端,一般是连接到单片机。 看门狗的功能是定期的查看芯片内部的情况,一旦发生错误就向芯片发出重启信号。看门狗命令在程序的中断中拥有最高的优先级。

STM32内部的看门狗

32内部有独立看门狗(IWDG)和窗口看门狗(WWDG)

IWDG以低速内部时钟(LSI)作为时钟源,即使主时钟发生了故障仍然可以正常运行,这也是“独立”一词的由来。但是时钟精度较低

WWDG由APB1时钟分频后驱动,时钟精度较高

看门狗原理

看门狗与定时器的原理相似,由设定的初始值开始向下递减,递减到达设定阈值时进行操作。不同的是定时器进行的操作是进入中断,而看门狗则是直接复位程序。

IWDG

想要使用IWDG,就需要对它进行配置,本人使用的是STM32CubeMX进行配置

STM32学习笔记——看门狗溢出时间配置_第1张图片

首先将IWDG状态设置为Active,然后设置分频系数(PR)和计数重载值(RLR)

IWDG的溢出时间公式如下:

T_{out}=RLR \times 4\times 2^{PR} \times T

T_{out}为溢出时间,PR为分频系数,RLR为重载值,T为时钟周期

实际上最基础的公式应该是

T_{out}=计数次数×每次计数的时间

计数次数即为RLR,而每次计数的时间却并不是时钟周期,因为时钟需要进行分频操作,查阅数据手册可得

STM32学习笔记——看门狗溢出时间配置_第2张图片

PR的值与实际分频倍数有如下关系:

实际分频倍数 = 4\times 2^{PR}

而T为LSI的周期,查数据手册可得

最后得到实际每次计数所需的时间为4\times 2^{PR}\times T

即:T_{out}=RLR \times 4\times 2^{PR} \times T

直接按照目标溢出时间进行配置即可

WWDG

WWDG有两种复位条件,如图(从数据手册截的)

STM32学习笔记——看门狗溢出时间配置_第3张图片

所以如果想让程序正常运行,不复位,只能在上窗口和下窗口之间刷新WWDG_CR的内容(重载值),这也是“窗口”一词的由来

STM32学习笔记——看门狗溢出时间配置_第4张图片

配置WWDG的溢出时间依然遵循这个公式:

T_{out}=计数次数×每次计数的时间

在WWDG中,计数次数 = 计数重载值 - 下窗口值(0x3F)

而每次计数的时间为

STM32学习笔记——看门狗溢出时间配置_第5张图片

这里的4096来自于先前那张图标注的框,32数据手册上没有标出,但是它实际确实存在,因为APB1的时钟频率实在太高

2^{WDGTB}则是因为在WWDG_CFR中WDGTB与实际分频倍数有如下关系

STM32学习笔记——看门狗溢出时间配置_第6张图片

STM32学习笔记——看门狗溢出时间配置_第7张图片

实际分频倍数 = 2^{WDGTB}

所以最后可以得到最终溢出时间计算公式

T_{WWDG}=T_{PCLK1}\times4096\times2^{WDGTB}\times(T[6:0]-0x3F)(ms)

数据手册内的公式其实与这个一样,因为T[6:0]如果想要大于0x3F,那么T[6]必须为1,也就是说将T的后6位减为0,再进行一次-1操作,得到的同样是计数次数

用纯数学计算方法同样可证

即:T[6:0]-0x3F=T[5:0]+1

你可能感兴趣的:(stm32,学习,笔记)