MCU专题精讲-看门狗
layout: post
title: MCU专题精讲-看门狗
description: MCU专题精讲-看门狗
categories:
- MCU
tags: WDGT
看门狗
- 独立看门狗 (FWDGT):
- 工作原理:FWDGT是一个持续计数的定时器。在设定的时间间隔内,软件必须“喂狗”(重置该定时器)。如果在此时间内没有“喂狗”,则FWDGT会触发一个系统复位。
- 时钟源:FWDGT通常使用一个独立的、低速的时钟源,因此即使主时钟出现问题,它也能继续工作。
- 主要应用:确保软件不会因为死锁、无限循环或其他故障而“挂起”。如果系统不再响应,则看门狗超时,从而重启系统。
- 窗口看门狗 (WWDGT):
- 工作原理:与WWDGT有所不同,WWDGT不仅定义了超时时间,还定义了一个窗口时间。这意味着,只有在窗口时间内“喂狗”才被视为正常。如果“喂狗”太早或太晚,都会被视为故障,从而触发系统复位。
- 时钟源:WWDGT可能使用的是主时钟或其他时钟源,这取决于微控制器的设计。
- 主要应用:除了检测死锁或软件挂起,WWDGT还可以确保软件按预期的顺序和时间执行任务。它可以检测到不仅是系统完全不响应的情况,还可以检测到软件执行过早或过晚的情况。
独立看门狗
以GD32F30X系列为例
1. 时钟源
IWDG使用一个独立的低速振荡器(IRC)作为其时钟源,为40kHz的时钟。
2. 寄存器
控制寄存器 (FWDGT_CTL)
预分频寄存器 (FWDGT_PSC)
重装载寄存器 (FWDGT_RLD)
状态寄存器 (FWDGT_STAT)
3. 示例
// 看门狗初始化
void bsp_wdg_enable(uint32_t count, uint32_t div)
{
rcu_osci_on(RCU_IRC40K);
while (SUCCESS != rcu_osci_stab_wait(RCU_IRC40K)) {};
dbg_periph_enable(DBG_FWDGT_HOLD); // 当内核停止时,保持FWDGT计数器时钟
fwdgt_config(count, div);
fwdgt_enable();
}
// 喂狗函数
void fwdgt_counter_reload(void)
{
FWDGT_CTL = FWDGT_KEY_RELOAD;
}
窗口看门狗
以GD32F30X系列为例
1. 时钟源
窗口看门狗定时器时钟是由APB1时钟预分频而来
2. 寄存器
- 控制寄存器 (WWDGT_CTL)
- 配置寄存器 (WWDGT_CFG)
- 状态寄存器 (WWDGT_STAT)
3. 实例
// 窗口看门狗初始化
void wwdgt_init()
{
rcu_periph_clock_enable(RCU_WWDGT);
wwdgt_config(127, 80, WWDGT_CFG_PSC_DIV8);
wwdgt_enable();
}
// 喂狗操作
wwdgt_counter_update(127);
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 开心大佬
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果