看门狗定时器
看门狗定时器是一种硬件级安全监控模块,用于检测并从软件故障(如死循环、代码跑飞、总线挂死)中恢复。当系统软件未在指定时间内执行喂狗操作(刷新计数器)时,WDG 将超时并触发复位信号,强制重启对应 CPU 或整个系统,保障系统在异常状态下的可靠性与可恢复性。
在 Ameba 系列 SoC 中,看门狗分为 独立看门狗(IWDG) 与 系统看门狗(SWDG) 两类:
独立看门狗:采用独立时钟源运行,不依赖系统主时钟,不受低功耗模式或主时钟配置影响,可作为双核共享的全局故障监控,超时可触发系统级复位。
系统看门狗:与 CPU 绑定,在多核系统中,每个 CPU 均配置专属的系统看门狗;对于支持 TrustZone 的 CPU,还提供独立的安全看门狗(Secure WDG)与非安全看门狗(Non-secure WDG),分别用于安全域与非安全域固件的故障监控,实现故障的分级隔离与处理。
所有看门狗均支持超时中断与复位双路径,可先通过中断通知软件进行故障诊断与补救;若故障未得到处理,超时后将输出复位信号,实现从单核复位到系统全局复位的多级恢复策略。
IWDG:系统独立看门狗定时器
WDG1:KM4 的安全看门狗定时器
WDG2:KM4 的非安全看门狗定时器
WDG3:KR4 的看门狗定时器
WDG4:DSP 的看门狗定时器
看门狗架构如下图所示。
独立看门狗定时器
简介
独立看门狗(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 时钟和功能使能关系图如下图所示。
复位
IWDG 具有最高权限。IWDG 超时将触发 GLB_RST,该复位信号将复位整个系统,包括所有处理器和几乎所有外设。只有极少数外设不会被 GLB_RST 复位,例如 RTC、AON PAD。
IWDG 复位控制如下图所示。
系统看门狗定时器
简介
系统看门狗(SWDG)为 CPU 核专属安全监控模块,与对应 CPU 核心共享电源域,采用内部 32 kHz OSC 时钟驱动,为 CPU 运行状态提供故障检测与恢复能力。
系统看门狗支持窗口看门狗功能,可配置为仅在计数器的指定窗口区间内执行喂狗操作;若喂狗时机过早或过晚,均会触发与超时事件相同的系统复位,从而实现对软件执行时序的严格监控。
在睡眠模式下,系统看门狗将停止计数并保持当前状态,系统唤醒后恢复计数;进入深度睡眠模式时,系统看门狗会被复位,因此从深度睡眠唤醒后,需通过软件重新配置并使能该模块。
特性
一旦使能,无法禁用
可选的提前中断功能可在看门狗超时之前的可编程时间产生中断
独立的唤醒原因
由 SYSON 区域供电和 SDM32K 时钟源供电
当 CPU 处于调试模式时自动暂停计数
调试暂停
SWDG 在对应 CPU 进入调试模式或被关闭时,它将自动暂停计数,但是对应状态会维持。
SWDG 时钟和功能使能示意图如下所示。
复位
WDG 超时或者窗口外喂狗默认都会触发 GLB_RST,该复位信号将复位整个系统,包括所有处理器和几乎所有外设。只有极少数外设不会被 GLB_RST 复位,例如 RTC、AON PAD。部分 SOC 系统看门狗支持在特定情况下配置为仅复位对应 CPU。
功能描述
低功耗模式
对于独立看门狗,是否可以在睡眠模式下保持运行或门控取决于 LPEN 位。
如果清除 LPEN,硬件将在内部门控 IWDG 的时钟,IWDG 将冻结并保持所有状态。
如果使能 LPEN,IWDG 将继续递减计数,如果提前中断事件触发则唤醒系统,如果看门狗触发则复位系统。
对于系统看门狗,定时器可以保持其寄存器但在睡眠模式下保持冻结。递减计数将在退出睡眠后恢复。
然而,在深度睡眠模式下,硬件将禁用 IWDG,系统看门狗定时器将断电。
寄存器保护
看门狗定时器使能后,WDG_MKEYR 是唯一可以随时访问的寄存器。其他寄存器只有在 WDG_MKEYR 等于 0x6969 时才能访问。
提前中断
看门狗定时器可以触发中断来唤醒系统或通知系统看门狗复位即将到来。该中断可以通过设置适当的 EARLY_INT_CNT 和 EIE 值来使能。当递减计数器 (WDGCNT) 达到 (EARLY_INT_CNT -1) 的值时,中断触发。
可以在 EIE 使能后更改提前中断阈值,执行以下序列:
通过向 WDG_MKEYR 寄存器写入 0x6969 来使能寄存器访问
禁用 WDG_CR 寄存器的 EIE 位
等待 EVU = 0,EVU 也位于 WDG_CR 寄存器中
在 WDG_CR 寄存器中编程提前中断阈值并使能提前中断
等待 EVU = 0
使用 WDG_RLR [15:0] 刷新计数器,并通过向 WDG_MKEYR 寄存器写入 0x5A5A 来写保护寄存器
窗口保护
看门狗定时器也可以通过在 WDG_WIN 中设置适当的窗口来作为窗口看门狗工作。如果计数器大于 WDG_WIN [15:0] 时执行重载操作,则会生成复位。WDG_WIN 的默认值为 0x0000FFFF ,如果不更新,窗口选项被禁用。
为了防止恶意攻击更改窗口值,窗口值只能在看门狗使能之前设置。一旦使能看门狗,该值无法更改。由于源时钟的不准确性,我们不建议使能 IWDG 的窗口保护功能。 看门狗的窗口功能喂狗时序图如下图所示。
超时设置
看门狗的超时时间由寄存器 WDG_RLR [15:0] RELOAD 与 WDG_RLR [23:16] Prescaler 决定,具体计算公式为 RELOAD × Prescaler / WDG_CLK。
如需配置超时时间,请按以下步骤操作:
通过向 WDG_MKEYR 寄存器写入 0x6969 来使能寄存器访问
等待 EVU = 0,EVU 也位于 WDG_CR 寄存器中
编程 WDG_RLR 寄存器
等待 EVU = 0
通过向 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 寄存器
Base Address:
IWDG_REG : 0x41008C00
WDG0_REG : 0x41008D00
WDG2_REG : 0x41008D80
WDG1_REG_S : 0x51008D40
Name |
Address offset |
Access |
Description |
|---|---|---|---|
000h |
R/W |
||
004h |
R/W |
||
008h |
R/W |
||
00Ch |
R/W |
||
010h |
R/W |
REG_WDG_MKEYR
Name: WDG Magic Key register
Size: 32
Address offset: 000h
Read/write access: R/W
Bit |
Symbol |
Access |
INI |
Description |
|---|---|---|---|---|
31:16 |
RSVD |
R |
- |
Reserved |
15:0 |
MKEY |
R/W |
0h |
|
REG_WDG_CR
Name: WDG Control regsietr
Size: 32
Address offset: 004h
Read/write access: R/W
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
|
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
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
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
Bit |
Symbol |
Access |
INI |
Description |
|---|---|---|---|---|
31:16 |
RSVD |
R |
- |
Reserved |
15:0 |
DUMMY |
R/W |
0xFF |
Reserved for HW |
Base Address:
WDG0_REG : 0x4100CC00
WDG1_REG : 0x4101F000
WDG2_REG : 0x4101F040
WDG3_REG : 0x4101F080
WDG4_REG : 0x4101F0C0
Name |
Address offset |
Access |
Description |
|---|---|---|---|
000h |
R/W |
||
004h |
R/W |
||
008h |
R/W |
||
00Ch |
R/W |
||
010h |
R/W |
REG_WDG_MKEYR
Name: WDG Magic Key Register
Size: 32
Address offset: 000h
Read/write access: R/W
Bit |
Symbol |
Access |
INI |
Description |
|---|---|---|---|---|
31:16 |
RSVD |
R |
- |
Reserved |
15:0 |
MKEY |
R/W |
0h |
|
REG_WDG_CR
Name: WDG Control Regsietr
Size: 32
Address offset: 004h
Read/write access: R/W
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 |
0h |
Low power enable
|
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 Reload Register
Size: 32
Address offset: 008h
Read/write access: R/W
Bit |
Symbol |
Access |
INI |
Description |
|---|---|---|---|---|
31:24 |
RSVD |
R |
- |
Reserved |
23:16 |
PRER |
R/W |
63h |
Prescaler counter, configuration only allowed before watchdog enable WDG: 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
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: Dummy Register
Size: 32
Address offset: 010h
Read/write access: R/W
Bit |
Symbol |
Access |
INI |
Description |
|---|---|---|---|---|
31:16 |
RSVD |
R |
- |
Reserved |
15:0 |
DUMMY |
R/W |
00FFh |
Hardware dummy |
REGISTER_CONTENTS=RTL8720E
REGISTER_CONTENTS=RTL8720E
REGISTER_CONTENTS=RTL8720E
Base Address:
WDG0_REG : 0x42008400
WDG2_REG : 0x41000440
WDG4_REG : 0x410004C0
WDG1_REG_S : 0x51000400
WDG3_REG_S : 0x51000480
Name |
Address offset |
Access |
Description |
|---|---|---|---|
000h |
R/W |
||
004h |
R/W |
||
008h |
R/W |
||
00Ch |
R/W |
REG_WDG_MKEYR
Name: WDG Magic Key register
Size: 32
Address offset: 000h
Read/write access: R/W
Bit |
Symbol |
Access |
INI |
Description |
|---|---|---|---|---|
31:16 |
RSVD |
R |
- |
Reserved |
15:0 |
MKEY |
R/W |
0h |
|
REG_WDG_CR
Name: WDG Control regsietr
Size: 32
Address offset: 004h
Read/write access: R/W
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 |
0h |
Low power enable
|
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
Bit |
Symbol |
Access |
INI |
Description |
|---|---|---|---|---|
31:24 |
RSVD |
R |
- |
Reserved |
23:16 |
PRER |
R/W |
63h |
Prescaler counter, configuration only allowed before wdg enable WDG: 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
Bit |
Symbol |
Access |
INI |
Description |
|---|---|---|---|---|
31:16 |
RSVD |
R |
- |
Reserved |
15:0 |
WINDOW |
R/W |
FFFFh |
Watchdog feed protect window register |
Base Address:
IWDG_REG : 0x4080AC00
WDG0_REG : 0x4080AD00
WDG2_REG : 0x4080AD80
WDG1_REG_S : 0x5080AD40
Name |
Address offset |
Access |
Description |
|---|---|---|---|
000h |
R/W |
||
004h |
R/W |
||
008h |
R/W |
||
00Ch |
R/W |
||
010h |
R/W |
REG_WDG_MKEYR
Name: WDG Magic Key register
Size: 32
Address offset: 000h
Read/write access: R/W
Bit |
Symbol |
Access |
INI |
Description |
|---|---|---|---|---|
31:16 |
RSVD |
R |
- |
Reserved |
15:0 |
MKEY |
R/W |
0h |
|
REG_WDG_CR
Name: WDG Control regsietr
Size: 32
Address offset: 004h
Read/write access: R/W
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
|
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
Bit |
Symbol |
Access |
INI |
Description |
|---|---|---|---|---|
31:24 |
RSVD |
R |
- |
Reserved |
23:16 |
PRER |
R/W |
63h |
Prescaler counter, configuration only allowed before wdg enable WDG: 0x63 System wdg: 0x1F |
15:0 |
RELOAD |
R/W |
FFFFh |
Reload value for watchdog counter Default : 64s (x100k) |
REG_WDG_WINR
Name: WDG Window Register
Size: 32
Address offset: 00Ch
Read/write access: R/W
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
Bit |
Symbol |
Access |
INI |
Description |
|---|---|---|---|---|
31:16 |
RSVD |
R |
- |
Reserved |
15:0 |
DUMMY |
R/W |
0xFF |
Rsvd for hw |