看门狗定时器

看门狗定时器是一种硬件级安全监控模块,用于检测并从软件故障(如死循环、代码跑飞、总线挂死)中恢复。当系统软件未在指定时间内执行喂狗操作(刷新计数器)时,WDG 将超时并触发复位信号,强制重启对应 CPU 或整个系统,保障系统在异常状态下的可靠性与可恢复性。

在 Ameba 系列 SoC 中,看门狗分为 独立看门狗(IWDG)系统看门狗(SWDG) 两类:

  • 独立看门狗:采用独立时钟源运行,不依赖系统主时钟,不受低功耗模式或主时钟配置影响,可作为双核共享的全局故障监控,超时可触发系统级复位。

  • 系统看门狗:与 CPU 绑定,在多核系统中,每个 CPU 均配置专属的系统看门狗;对于支持 TrustZone 的 CPU,还提供独立的安全看门狗(Secure WDG)与非安全看门狗(Non-secure WDG),分别用于安全域与非安全域固件的故障监控,实现故障的分级隔离与处理。

所有看门狗均支持超时中断与复位双路径,可先通过中断通知软件进行故障诊断与补救;若故障未得到处理,超时后将输出复位信号,实现从单核复位到系统全局复位的多级恢复策略。

RTL8721Dx:
  • IWDG:系统独立看门狗定时器

  • WDG0:KM0 的看门狗定时器

  • WDG1:KM4 的安全看门狗定时器

  • WDG2:KM4 的非安全看门狗定时器

看门狗架构如下图所示。

../../_images/wdg_arch_dplus.svg

独立看门狗定时器

简介

    独立看门狗(IWDG)为系统级安全监控模块,采用常开(always-on)电源域与 100 kHz 无校准内部时钟驱动。电源域与时钟在系统启动后无法关闭,因此 IWDG 一旦使能,软件无法禁用。

    IWDG 的 100 kHz 时钟为无校准内部振荡器,存在 ±50% 的频率误差,软件在配置超时周期与喂狗策略时,需预留足够裕量以避免意外复位。为防止喂狗时机偏差引发误触发,不建议使能 IWDG 的窗口功能。

    IWDG 在睡眠模式下的行为可通过控制寄存器的 LPEN 位配置:置位时,IWDG 在睡眠模式下持续计数,超时将触发系统级复位,配置的提前中断可唤醒系统;LPEN 清零时,IWDG 在睡眠模式下停止计数并保持当前状态,唤醒后继续计数。IWDG 在进入深度睡眠时会复位。

    OTP 可配置自动加载 AON 寄存器,实现 IWDG 的硬件自动使能。该寄存器仅支持从 0 写 1(一次性操作),一旦配置完成,IWDG 将在初始启动或深度睡眠唤醒后自动运行,软件无法干预或禁用。

特性

  • 一旦使能,无法禁用

  • 可选的提前中断功能可在看门狗超时之前的可编程时间产生中断

  • 独立的唤醒原因

  • 由 AON(always-on)区域供电和时钟源供电

  • 当 CPU 处于调试模式时自动暂停计数

  • 可配置是否在睡眠模式下工作

调试暂停

当其中一个 CPU 处于活动状态(时钟和功能都已使能)且非 CPU 处于调试模式时,IWDG 保持计数。IWDG 时钟和功能使能关系图如下图所示。

RTL8721Dx:
../../_images/iwdg_clock_and_function_enable_diagram_dplus.svg

复位

IWDG 具有最高权限。IWDG 超时将触发 GLB_RST,该复位信号将复位整个系统,包括所有处理器和几乎所有外设。只有极少数外设不会被 GLB_RST 复位,例如 RTC、AON PAD。

IWDG 复位控制如下图所示。

../../_images/iwdg_reset_control.svg

系统看门狗定时器

简介

    系统看门狗(SWDG)为 CPU 核专属安全监控模块,与对应 CPU 核心共享电源域,采用内部 32 kHz OSC 时钟驱动,为 CPU 运行状态提供故障检测与恢复能力。

    系统看门狗支持窗口看门狗功能,可配置为仅在计数器的指定窗口区间内执行喂狗操作;若喂狗时机过早或过晚,均会触发与超时事件相同的系统复位,从而实现对软件执行时序的严格监控。

    在睡眠模式下,系统看门狗将停止计数并保持当前状态,系统唤醒后恢复计数;进入深度睡眠模式时,系统看门狗会被复位,因此从深度睡眠唤醒后,需通过软件重新配置并使能该模块。

特性

  • 一旦使能,无法禁用

  • 可选的提前中断功能可在看门狗超时之前的可编程时间产生中断

  • 独立的唤醒原因

  • 由 SYSON 区域供电和 SDM32K 时钟源供电

  • 当 CPU 处于调试模式时自动暂停计数

调试暂停

SWDG 在对应 CPU 进入调试模式或被关闭时,它将自动暂停计数,但是对应状态会维持。

SWDG 时钟和功能使能示意图如下所示。

../../_images/swdg_clock_and_function_enable_diagram.svg

复位

WDG 超时或者窗口外喂狗默认都会触发 GLB_RST,该复位信号将复位整个系统,包括所有处理器和几乎所有外设。只有极少数外设不会被 GLB_RST 复位,例如 RTC、AON PAD。部分 SOC 系统看门狗支持在特定情况下配置为仅复位对应 CPU。

功能描述

低功耗模式

对于独立看门狗,是否可以在睡眠模式下保持运行或门控取决于 LPEN 位。

  • 如果清除 LPEN,硬件将在内部门控 IWDG 的时钟,IWDG 将冻结并保持所有状态。

  • 如果使能 LPEN,IWDG 将继续递减计数,如果提前中断事件触发则唤醒系统,如果看门狗触发则复位系统。

对于系统看门狗,定时器可以保持其寄存器但在睡眠模式下保持冻结。递减计数将在退出睡眠后恢复。

然而,在深度睡眠模式下,硬件将禁用 IWDG,系统看门狗定时器将断电。

寄存器保护

看门狗定时器使能后,WDG_MKEYR 是唯一可以随时访问的寄存器。其他寄存器只有在 WDG_MKEYR 等于 0x6969 时才能访问。

提前中断

看门狗定时器可以触发中断来唤醒系统或通知系统看门狗复位即将到来。该中断可以通过设置适当的 EARLY_INT_CNTEIE 值来使能。当递减计数器 (WDGCNT) 达到 (EARLY_INT_CNT -1) 的值时,中断触发。

可以在 EIE 使能后更改提前中断阈值,执行以下序列:

  1. 通过向 WDG_MKEYR 寄存器写入 0x6969 来使能寄存器访问

  2. 禁用 WDG_CR 寄存器的 EIE

  3. 等待 EVU = 0,EVU 也位于 WDG_CR 寄存器中

  4. WDG_CR 寄存器中编程提前中断阈值并使能提前中断

  5. 等待 EVU = 0

  6. 使用 WDG_RLR [15:0] 刷新计数器,并通过向 WDG_MKEYR 寄存器写入 0x5A5A 来写保护寄存器

窗口保护

看门狗定时器也可以通过在 WDG_WIN 中设置适当的窗口来作为窗口看门狗工作。如果计数器大于 WDG_WIN [15:0] 时执行重载操作,则会生成复位。WDG_WIN 的默认值为 0x0000FFFF ,如果不更新,窗口选项被禁用。

为了防止恶意攻击更改窗口值,窗口值只能在看门狗使能之前设置。一旦使能看门狗,该值无法更改。由于源时钟的不准确性,我们不建议使能 IWDG 的窗口保护功能。 看门狗的窗口功能喂狗时序图如下图所示。

../../_images/swdg_window_protect.svg

超时设置

看门狗的超时时间由寄存器 WDG_RLR [15:0] RELOAD 与 WDG_RLR [23:16] Prescaler 决定,具体计算公式为 RELOAD × Prescaler / WDG_CLK

如需配置超时时间,请按以下步骤操作:

  1. 通过向 WDG_MKEYR 寄存器写入 0x6969 来使能寄存器访问

  2. 等待 EVU = 0,EVU 也位于 WDG_CR 寄存器中

  3. 编程 WDG_RLR 寄存器

  4. 等待 EVU = 0

  5. 通过向 WDG_MKEYR 寄存器写入 0x5A5A 来写保护寄存器

看门狗刷新

使用 WDG_RLR [15:0] 刷新计数器,并通过向 WDG_MKEYR 寄存器写入 0x5A5A 来写保护寄存器。

更新指示

由于看门狗及其寄存器工作在不同的时钟域,并且频率各不相同,因此必须考虑跨时钟同步。为了防止后续写入操作影响前面的操作,下表中引入了两个状态标志。

Bit

Flag

Description

EVU

看门狗提前中断功能更新

该位由硬件置位,表示中断阈值 (EICNT[15:0]) 的更新正在进行或 EIE 的更新正在进行。当更新操作完成时,由硬件复位。EICNT[15:0] 和 EIE 字段只能在 EVU 位复位时更新。

RVU

看门狗计数器值更新

该位由硬件置位,表示重载操作正在进行。当计数器更新操作完成时,由硬件复位。重载值只能在 RVU 位复位时更新。

在写入看门狗寄存器之前,软件需要检查这些标志,以确保没有冲突和混乱问题。

寄存器

WDG 寄存器

RTL8721Dx:

Base Address:

  • IWDG_REG : 0x41008C00

  • WDG0_REG : 0x41008D00

  • WDG2_REG : 0x41008D80

  • WDG1_REG_S : 0x51008D40

Name

Address offset

Access

Description

REG_WDG_MKEYR

000h

R/W

REG_WDG_CR

004h

R/W

REG_WDG_RLR

008h

R/W

REG_WDG_WINR

00Ch

R/W

REG_IWDG_DUMMY

010h

R/W

REG_WDG_MKEYR

  • Name: WDG Magic Key register

  • Size: 32

  • Address offset: 000h

  • Read/write access: R/W

31:16 RSVD 15:0 MKEY

Bit

Symbol

Access

INI

Description

31:16

RSVD

R

-

Reserved

15:0

MKEY

R/W

0h

  • 0x6969: enable access to register WDG_CR/WDG_RLR/WDG_WINR

  • 0x5A5A: reload WDG counter

  • 0x3C3C: enable WDG function

REG_WDG_CR

  • Name: WDG Control regsietr

  • Size: 32

  • Address offset: 004h

  • Read/write access: R/W

31 RVU 30 EVU 29:25 RSVD 24 LPEN 23:18 RSVD 17 EIC 16 EIE 15:0 EICNT

Bit

Symbol

Access

INI

Description

31

RVU

R

0h

Watchdog counter update by reload command

30

EVU

R

0h

Watchdog early interrupt function update

29:25

RSVD

R

-

Reserved

24

LPEN

R/W

1h

Low power enable

  • 0: WDG will gating when system goes into sleep mode

  • 1: WDG keep running when system goes into sleep mode

23:18

RSVD

R

-

Reserved

17

EIC

R/W

0h

Write '1' clear the early interrupt

16

EIE

R/W

0h

Watchdog early interrupt enable

15:0

EICNT

R/W

0h

Early interrupt trigger threshold

REG_WDG_RLR

  • Name: WDG Relaod register

  • Size: 32

  • Address offset: 008h

  • Read/write access: R/W

31:24 RSVD 23:16 PRER 15:0 RELOAD

Bit

Symbol

Access

INI

Description

31:24

RSVD

R

-

Reserved

23:16

PRER

R/W

63h

Prescaler counter, configuration only allowed before WDG enable

IWDG: 0x63

System WDG: 0x1F

15:0

RELOAD

R/W

FFFh

Reload value for watchdog counter

REG_WDG_WINR

  • Name: WDG Window Register

  • Size: 32

  • Address offset: 00Ch

  • Read/write access: R/W

31:16 RSVD 15:0 WINDOW

Bit

Symbol

Access

INI

Description

31:16

RSVD

R

-

Reserved

15:0

WINDOW

R/W

FFFFh

Watchdog feed protect window register

REG_IWDG_DUMMY

  • Name: WDG Dummy Register

  • Size: 32

  • Address offset: 010h

  • Read/write access: R/W

31:16 RSVD 15:0 DUMMY

Bit

Symbol

Access

INI

Description

31:16

RSVD

R

-

Reserved

15:0

DUMMY

R/W

0xFF

Reserved for HW