layout: post
title: MCU专题精讲-看门狗
description: MCU专题精讲-看门狗
categories:

  • MCU
    tags:
  • WDGT

看门狗

  1. 独立看门狗 (FWDGT):
  2. 工作原理:FWDGT是一个持续计数的定时器。在设定的时间间隔内,软件必须“喂狗”(重置该定时器)。如果在此时间内没有“喂狗”,则FWDGT会触发一个系统复位。
  3. 时钟源:FWDGT通常使用一个独立的、低速的时钟源,因此即使主时钟出现问题,它也能继续工作。
  4. 主要应用:确保软件不会因为死锁、无限循环或其他故障而“挂起”。如果系统不再响应,则看门狗超时,从而重启系统。
  5. 窗口看门狗 (WWDGT):
  6. 工作原理:与WWDGT有所不同,WWDGT不仅定义了超时时间,还定义了一个窗口时间。这意味着,只有在窗口时间内“喂狗”才被视为正常。如果“喂狗”太早或太晚,都会被视为故障,从而触发系统复位。
  7. 时钟源:WWDGT可能使用的是主时钟或其他时钟源,这取决于微控制器的设计。
  8. 主要应用:除了检测死锁或软件挂起,WWDGT还可以确保软件按预期的顺序和时间执行任务。它可以检测到不仅是系统完全不响应的情况,还可以检测到软件执行过早或过晚的情况。

独立看门狗

以GD32F30X系列为例

1. 时钟源

IWDG使用一个独立的低速振荡器(IRC)作为其时钟源,为40kHz的时钟。

image-20230814143414744

2. 寄存器

  • 控制寄存器 (FWDGT_CTL)

image-20230814141812493

  • 预分频寄存器 (FWDGT_PSC)

image-20230814141726455

image-20230814141746068

  • 重装载寄存器 (FWDGT_RLD)

image-20230814141856315

  • 状态寄存器 (FWDGT_STAT)

image-20230814142109262image-20230814142125448

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时钟预分频而来

image-20230814143452390

2. 寄存器

  • 控制寄存器 (WWDGT_CTL)

image-20230814155027408

  • 配置寄存器 (WWDGT_CFG)

image-20230814155146966

image-20230814155222789

  • 状态寄存器 (WWDGT_STAT)

image-20230814155239056

3. 实例

// 窗口看门狗初始化
void wwdgt_init()
{
    rcu_periph_clock_enable(RCU_WWDGT);

    wwdgt_config(127, 80, WWDGT_CFG_PSC_DIV8);
    wwdgt_enable();
}

// 喂狗操作
wwdgt_counter_update(127);