3.看门狗定时器:
介绍:看门狗定时器原理上来说也是一个逐级递减的定时器,给他设置一个定时值,它会逐渐递减,递减到0后就会进行芯片复位,在看门狗定时器还没到达0时重新给他赋值的这个操作就叫喂狗。配置cubemx时,这个IWDG和WWDG就是看门狗的意思。
为什么会有两个看门狗呢,下面就是对两条小狗子的介绍,大黄,大黑哈哈哈哈哈哈
WWDG(Windows 窗户)是窗台看门狗,大黑你丫给我好好看家,如果超时没喂狗,会触发中断 IWDG(independence 独立)是独立看门狗,如果超时,它会直接进行芯片复位(程序重启)
既然看门狗是一个递减的定时器,那他的周期,时钟来源等一些玩意是咋来的呢
时钟来源:
WWDG由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。(听不懂听不懂,我们下面一步步来看就行)
IWDG由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。
关于时钟内容可以看我的博客的关于时钟树的学习内容
IWDG和WWDG的使用场景如下所示:
总结:
-
IWDG 适用于 需要高可靠性和独立性 的应用,如 电池供电系统、远程监控、低功耗应用,并且不依赖主系统时钟。
-
WWDG 适用于 实时性要求高的应用,如 嵌入式实时控制系统、机器人控制、通信系统,特别是在系统必须在特定窗口时间内喂狗,否则会触发复位的场合。
既然是定时器,它在实现自己功能的时候这个功能实现时间也是需要的,它有一个超时时间,超过超时时间后MPU会复位,和我的蠢狗电脑一样。
超时时间计算公式:
重载值:定时器的计数器最大值,可以在 IWDG_RLR 寄存器中进行配置。该寄存器包含了定时器的重载值,最大值为 4095。
窗口值:窗口值是用于 WWDG(窗口看门狗)中的参数,而 IWDG 没有窗口值这个参数。
PR(预分频器): 预分频器的作用是通过对 LSI 时钟源进行分频,来改变定时器的计数速度
欧克我们开始正式的实操部分
深入一点可以用寄存器写函数实现喂狗,上面的是重启看门狗实现喂狗
#include "stm32g4xx.h" // 引入 STM32G4 的头文件(根据实际情况可以调整)
void IWDG_Config(void); // IWDG 配置函数声明
void IWDG_Feed(void); // IWDG 喂狗函数声明
int main(void)
{
// 初始化系统时钟、外设等,具体根据实际系统初始化代码写
// 配置 IWDG
IWDG_Config();
while (1)
{
// 程序主循环,执行其他任务
// 在这里你可以执行任何业务逻辑
// 定期喂狗,防止系统复位
IWDG_Feed();
// 延时 500 毫秒(这里可以模拟执行其他任务)
for (int i = 0; i < 500000; i++);
// 你也可以在这里执行其他业务逻辑,比如读取传感器、控制外设等
}
}
// 配置 IWDG 定时器
void IWDG_Config(void)
{
// 1. 解锁 IWDG 寄存器,允许配置
IWDG->KR = 0x5555; // 写入 0x5555 解锁 IWDG
// 2. 设置 IWDG 的预分频器值(PR 寄存器),这里设为 3
// 预分频值为 3 => 分频因子为 2^3 = 8
IWDG->PR = 0x03; // 设置预分频器值,值为 3(即 2^3 = 8)
// 3. 设置 IWDG 的重载值(RLR 寄存器),这里设为 2000
// 重载值 = 2000,这个值决定了超时时间
IWDG->RLR = 2000; // 设置重载值,最大值为 4095
// 4. 启动 IWDG
IWDG->KR = 0xCCCC; // 启动 IWDG,开始计数
// 配置完成,IWDG 会根据设置的超时时间开始计数
}
// 定期喂狗,防止系统复位
void IWDG_Feed(void)
{
// 每次喂狗时,写入 0xAAAA 向 IWDG 看门狗重载计数器,防止复位
IWDG->KR = 0xAAAA; // 写入 0xAAAA 来喂狗,重置定时器
}
这是另外一个喂狗的方法,通过给狗的计数值重新变个值,上面的情景就是用于防止系统卡死的,如果系统卡死或者外部中断导致该函数无法正常运行以及死锁,我们的系统会重启重新复位。