一、IWDG独立开门狗的主要性能
计时机制:
递减计数器
独立开门狗的初始频率:
LSI低速内部时钟:RC震荡器,40kHz
独立开门狗是以LSI为初始频率的,所以独立开门狗的初始时钟频率取决与单片机本身,因此在使用独立开门狗时,并不需要重新设置频率,直接设置 独立开门狗写使能 、 分频系数、重装载时间 、 喂一次狗、使能开门狗
/*IWDG初始化*/
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //独立看门狗写使能
IWDG_SetPrescaler(IWDG_Prescaler_16); //设置预分频为16
IWDG_SetReload(2499); //设置重装值为2499,独立看门狗的超时时间为1000ms
IWDG_ReloadCounter(); //重装计数器,喂狗
IWDG_Enable(); //独立看门狗使能
1.1-独立开门狗框图
预分频值计算
超时时间计算
为什么会有+1:因为计数器是减到0的
二、WWDG窗口开门狗主要性能
计时机制:
窗口开门狗区别于独立开门狗的递减计数方式,它本身是递增计数方式
WWDG超时时间计算:
WWDG的时钟源是PCLK1,PCLK1会通过一个固定的4096分频器得到一个较低的时钟频率。然后得到的时钟频率才是和自己后面设置的预分频系数一起参与时间周期计算所用到的。进一步的分频是为了调整适用的时钟频率
计算公式
- PCLK1 频率:32 MHz
- WWDG 时钟频率:32 MHz / 4096 = 7.8125 kHz
- 预分频系数:8
- 最终时钟频率:7.8125 kHz / 8 = 0.9765625 kHz = 976.5625 Hz
- 重装载值:84
- 超时时间:(84 + 1) / 976.5625 Hz ≈ 87 ms
工作原理:
窗口定时器喂狗的时间既有上限,也有下限,必须在这个阶段内喂狗,超出上限或者未达下限都会触发复位,因此其更加适用于需要较高精度的应用
/* 开启时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // 开启WWDG的时钟
/* WWDG初始化 */
// 设置窗口值
WWDG->CFR = (0x40 << 7) | (WWDG_Prescaler_8 << 5); // 设置窗口值为64,预分频器为8
// 使能WWDG并设置重装载值
WWDG->CR = (0x54 & 0x7F) | WWDG_CR_WDGA; // 重装载值为84,并使能WWDG
三、为什么在初始化开门狗的时候要先喂一次狗
-
防止意外复位
- 初始状态不确定:在系统启动或看门狗初始化之前,看门狗计数器可能已经开始递减。如果不立即喂狗,计数器可能会在初始化过程中达到零,导致系统意外复位。
确保安全启动:通过在初始化时喂狗,可以确保看门狗计数器被重置到一个已知的安全状态,从而避免在初始化期间触发复位。
-
确认看门狗功能正常
- 验证看门狗工作:在初始化时喂狗可以确认看门狗功能是否正常工作。如果喂狗操作失败,可能是硬件或配置有问题,可以在早期发现并处理这些问题。
调试和测试:在开发和调试阶段,通过在初始化时喂狗,可以更容易地验证看门狗的设置是否正确,并且可以在没有实际应用逻辑的情况下测试看门狗的行为。
-
符合编程规范
- 最佳实践:在许多微控制器的应用程序中,初始化看门狗时喂狗是一种常见的最佳实践。这有助于确保系统的稳定性和可靠性。
文档建议:许多微控制器的数据手册和参考手册会建议在初始化看门狗时进行喂狗操作,以确保看门狗从一开始就处于受控状态。