原创
转载请注明出处,侵权必究。
1.看门狗介绍
为了保证系统运行正常,防止出现跑飞的情况。
IWDG采用的是LSI时钟,即使主时钟发生故障,仍然有效。而LSI是一个内部的RC时钟,并不准确,在15kHz到47kHz之间变化,平均值为32kHz左右。
WWDG采用的是APB1的时钟。通常用于监测由外部干扰或者不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。
IWDG最适合于那些要求看门狗在主应用之外运行完全独立的过程,但是有较低的计时精度限制。WWDG最适合于需要看门狗在精确计时窗口内做出反应的应用程序。
首先独立看门狗和窗口看门狗都可用来监视软件程序是否正常运行,而具体而言,因为独立看门狗独立于系统时钟单独运行,因此其可用来监视是否发生了硬件错误,比如说系统时钟故障,看门狗仍然能够起到重启的作用,但是独立看门狗的计时精度比较差,更多的应用在独立系统运行之外的对计时要求低的地方。而窗口看门狗是由系统时钟提供的,因此其计时也会很准确,当然其也就只能用来检测软件故障,比如硬件故障系统时钟坏了,自身也就不动了,也就没有检测硬件故障的作用,因此窗口看门狗是用在检测应用软件是否准确运行时使用的。
2.IWDG
2.1 IWDG主要特性
-
不同步的downcounter
-
从RC振荡器中取得时钟源(可以在待机Standby或者停止Stop模式中运行)
-
downcounter的数值达到0的时候,复位。
2.2 IWDG寄存器描述
- IWDG_KR 关键字寄存器 IWDG_KR寄存器赋值0xCCCC,独立看门狗开始启动,从0xFFF开始自减。如果减到了0,则系统复位。
IWDG_KR寄存器赋值0xAAAA,则IWDG_RLR的数值重装载到downcounter中,避免系统复位。
- IWDG_PR 预分频寄存器
用于设置,看门狗时钟的预分频系数,最低4,最高256。并且只使用了最低3位,也就是说只有8种预分频情况。
000:4分频 ; 001:8分频 ;
010:16分频 ; 011:32分频 ;
100:64分频 ; 101:128分频 ;
110:256分频 ; 111:256分频(没错,110和111相同)。
注:IWDG_PR和IWDG_RLR寄存器具有写保护功能,要修改这两个寄存器的数值,要给IWDG_KR赋值0x5555。其他值写入IWDG_KR,会重新启动写保护。
- IWDG_RLR 重装载寄存器
只有低12位有效,也就是最大4095。
IWDG_PR和IWDG_RLR寄存器具有写保护功能,要修改这两个寄存器的数值,要给IWDG_KR赋值0x5555。其他值写入IWDG_KR,会重新启动写保护。
- IWDG_SR 状态寄存器
PVU(bit 0):独立看门狗分频系数更新。硬件set或者reset,1:正在更新;0:没有正在更新。
RVU(bit 1):独立看门狗计数器重装载更新标志。硬件set或者reset,1:正在更新;0:没有正在更新。
2.3 IWDG配置步骤
1)独立看门狗初始化
需要自行定义
static void MX_IWDG_Init(void)
{
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_32;
hiwdg.Init.Reload = 4095;
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
溢出时间的计算:
Tout = 重装载数值/(LSI的频率/分频系数)
2)重载计数值喂狗
0xAAAA写入到IWDG_KR
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
{
/* Reload IWDG counter with value defined in the reload register */
__HAL_IWDG_RELOAD_COUNTER(hiwdg);
/* Return function status */
return HAL_OK;
}
3)启动看门狗
HAL_IWDG_Init(&hiwdg)函数中包含了该函数。
__HAL_IWDG_START(hiwdg);
2.4 应用提示(重要)
IWDG会唤醒低功耗模式
在Standby模式下LSI仍然运作,即IWDG启动后,不能再关闭,除非复位。所以Standby模式都会被IWDG唤醒,其他的模式可想而知。
WWDG不会唤醒standby
3.WWDG
3.1 WWDG的寄存器描述
如果递减计数器的值在bit 6(WWDG_CR的第6位)变成0(0111111b = 0x3F)之前没有被刷新,则看门狗电路在达到预置的时间周期时,会产生一个MCU复位。在递减计数器达到窗口配置寄存器(WWDG_CFR)数值之前,如果7位递减计数器数值(在控制寄存器中)被刷新,也会产生一个MCU复位。
其中T[6:0]是WWDF_CR的低7位,窗口看门狗的递减计数器。W[6:0]是WWDG_CFR的低7位,窗口看门狗的上窗口,下窗口是固定的0x40(WWDG_CR的第6位是0,最大是0x3F)。所以,W[6:0]不能低于0x40。
超时计算公式
Tout = (4096 x 2^WDGTB x (T[5:0] + 1))/Fapb1 (单位ms)
其中,
Fapb1:APB1的时钟频率,单位kHz。
WDGTB:窗口看门狗的预分频系数,共两位0~3。
T[5:0]:窗口看门狗的计数器低6位。
4096:内部分频器对应的值。
欢迎关注我的微信公众号
互联网矿工