WDG (看门狗)

简介

ET6001 内部包含两个 Watchdog,分别用于 CPU、系统看门狗,支持窗口、非窗口 2 种模式。

功能概述

  • 支持输入计时时钟配置

  • 支持超时喂狗,触发系统复位

  • 支持超时触发 NMI 中断

  • 支持 32bit 内部计数位宽

  • 支持根据 CPU 是否进入仿真器调试状态进行暂停计数

WDG 计数功能

看门狗基于 32bit 内部计数器工作 - 使能后计数器按照看门狗输入时钟向下计数 - 支持输入计时时钟配置 - 支持 32bit 内部计数位宽

备注

Watchdog0/1 输入计数时钟:启动时是基于内置 25 MHz 时钟进行计数,后续可由软件修改为基于 100 MHz 时钟,支持 CRG 给的 clk_en 计数使能,可配置为 1-7 分频

库函数

看门狗的输入时钟由 CRG 模块提供,可通过以下函数获取:

uint32_t wdg_clock = CRG_getWDGClock(WDG0);    /* 获取 WDG0 输入时钟频率 (Hz) */

超时时间由重载值与计数时钟频率共同决定:

超时时间 = 重载值 / 看门狗时钟频率

调用 WDG_setWatchdogReloadValue() 设置重载值。例如将重载值设置为看门狗时钟频率值,即可得到 1s 的超时时间:

WDG_setWatchdogReloadValue(WDG0, wdg_clock);   /* 重载值 = 时钟频率,超时时间 1s */

可通过 WDG_getWatchdogCounterValue() 读取计数器当前值,用于观察计数过程或软件调试:

uint32_t cur_val = WDG_getWatchdogCounterValue(WDG0);

调用 WDG_enableWatchdogInHalt() 可使 CPU 进入仿真器调试暂停(HALT)状态时看门狗继续计数;调用 WDG_disableWatchdogInHalt() 则暂停计数。调试时可调用 WDG_enableWatchdogInHalt() 进行看门狗调试暂停使能。

备注

  • CPU 处于 Debug 状态时,通过 SYSC 中的寄存器,可以控制 Watchdog0、Watchdog1 是否暂停计数;cfg_sysc_wdg1_halt_mode_en、cfg_sysc_wdg0_halt_mode_en 对应的信号为 1 时,当 CPU 核连接仿真器进入 Debug 状态时,停止计数。

WDG 复位/中断功能

  • 若在计数到 0(超时)之前应用未及时喂狗,则看门狗根据配置产生中断信号和/或复位信号,用于监控程序运行状态、防止程序跑飞。

库函数

复位功能

复位输出使能

调用 WDG_setWatchdogMode() 并传入 WD_MODE_INTERRUPT_RESET,使能看门狗复位输出,超时后产生中断和复位信号,触发系统复位:

WDG_setWatchdogMode(WDG0, WD_MODE_INTERRUPT_RESET);   /* 产生中断和复位信号 */

工作模式选择

调用 WDG_setWatchdogWorkMode() 设置看门狗工作模式:

  • ROUND1_IT_AND_RESET:同一轮超时同时产生中断和复位;

  • ROUND1_IT_AND_ROUND2_RESET:第一轮超时产生中断,若仍不喂狗,第二轮超时产生复位。

WDG_setWatchdogWorkMode(WDG0, ROUND1_IT_AND_RESET);

复位状态记录

看门狗触发系统复位后,复位原因记录在 SYSC 的复位记录寄存器中,复位后可通过以下函数查询/清除,用于判断本次复位是否由看门狗引起:

if (WDG_getWatchdogResetStatus(WDG0))          /* 查询是否发生过看门狗复位 */
{
    WDG_clearWatchdogResetStatus(WDG0);        /* 清除复位记录标志 */
}

中断功能

仅中断模式

调用 WDG_setWatchdogMode() 并传入 WD_MODE_INTERRUPT,禁止复位输出,超时后仅产生中断信号:

WDG_setWatchdogMode(WDG0, WD_MODE_INTERRUPT);          /* 仅产生中断信号 */

中断注册与使能

看门狗超时中断需要通过中断系统注册处理函数,并使能看门狗中断及对应 NVIC 中断线:

Interrupt_register(WDG0_IRQn, SELF_WDG_IRQHandler);   /* 注册中断处理函数 */
WDG_enableInterrupt(WDG0);                            /* 使能看门狗中断 */
NVIC_EnableIRQ(WDG0_IRQn);                            /* NVIC 使能中断线 */

中断状态查询与清除

备注

进入中断服务函数后必须调用 WDG_clearInterruptStatus() 清除中断标志,否则系统将保持挂起状态。

void SELF_WDG_IRQHandler(void)
{
    /* 清除中断标志:若不清除,系统将保持挂起状态 */
    WDG_clearInterruptStatus(WDG0);
    printf("Triggered interrupt!\n");
}

中断屏蔽

可通过 WDG_maskInterrupt() / WDG_unmaskInterrupt() 屏蔽/解除屏蔽看门狗中断信号。

中断记录状态

可通过以下函数查询/清除中断记录状态,判断看门狗是否发生过中断:

if (WDG_getWatchdogInterruptRecordStatus(WDG0))
{
    WDG_clearWatchdogInterruptRecordStatus(WDG0);
}

复位模式配置流程

  1. 解锁看门狗 调用 WDG_unlock() 解锁 WDG 寄存器模块写操作

  2. 设置看门狗工作模式 调用 WDG_setWatchdogWorkMode() 设置工作模式( 第一轮产生中断,第二轮产生复位同一轮产生中断和复位

  3. 设置看门狗重载阈值 调用 WDG_setWatchdogReloadValue() 设置阈值

  4. 配置看门狗复位输出使能 调用 WDG_setWatchdogMode() 选择 WD_MODE_INTERRUPT_RESET 产生中断和复位信号

  5. 配置看门狗模式 - 调用 WDG_disableWindowedWatchdog() 配置为独立看门狗; - 调用 WDG_enableWindowedWatchdog() 配置为窗口看门狗

  6. 使能看门狗 调用 WDG_enableWatchdog() 使能WDG

  7. 在应用中周期调用 WDG_serviceWatchdog() 喂狗

中断模式配置流程

  1. 解锁看门狗 调用 WDG_unlock() 解锁 WDG 寄存器模块写操作

  2. 设置看门狗工作模式 调用 WDG_setWatchdogWorkMode() 设置工作模式

  3. 设置看门狗重载阈值 调用 WDG_setWatchdogReloadValue() 设置阈值

  4. 配置看门狗复位输出禁止 调用 WDG_setWatchdogMode() 选择 WD_MODE_INTERRUPT 仅产生中断信号

  5. 配置看门狗模式 调用 WDG_disableWindowedWatchdog() 配置为独立看门狗

  6. 注册并使能中断 - 调用 Interrupt_register() 注册 WDGx 中断处理函数; - 调用 WDG_enableInterrupt() 使能看门狗中断; - 调用 NVIC_EnableIRQ 使能 NVIC 对应中断线

  7. 使能看门狗 调用 WDG_enableWatchdog() 使能WDG

  8. 在中断服务函数中调用 WDG_clearInterruptStatus() 清除中断标志

应用示例

软件配置流程

配置流程如下:

  1. 解锁看门狗 调用 WDG_unlock() 传入WDGx,解锁WDG寄存器模块写操作

  2. 设置看门狗工作模式 调用 WDG_setWatchdogWorkMode() 传入WDGx和工作模式( 第一轮产生中断,第二轮产生复位同一轮产生中断和复位

  3. 设置看门狗重载阈值 调用 WDG_setWatchdogReloadValue() 传入WDGx和阈值

  4. 配置看门狗复位输出使能 调用 WDG_setWatchdogMode() 传入WDGx和选择是否使能复位输出( 仅产生中断信号产生中断和复位信号

  5. 配置看门狗模式

  6. 使能看门狗 调用 WDG_enableWatchdog() 传入WDGx

备注

请在应用中调用 WDG_serviceWatchdog() 喂狗函数,以保证看门狗正常工作。

调试时,可调用 WDG_enableWatchdogInHalt() 函数,进行看门狗调试暂停使能。

API Reference

Header File

Functions

void WDG_enableWatchdogInHalt(WDG_Type *WDGx)

Enable the watchdog to run while in HALT mode.

参数:

WDGx – watch dog module base

void WDG_disableWatchdogInHalt(WDG_Type *WDGx)

Disable the watchdog from running while in HALT mode.

参数:

WDGx – watch dog module base

void WDG_setWatchdogMode(WDG_Type *WDGx, WDG_WDMode mode)

Configures whether the watchdog generates a reset or an interrupt signal.

参数:
  • WDGx – watch dog module base

  • mode – select interrupt or reset

bool WDG_isWatchdogInterruptActive(WDG_Type *WDGx)

Gets the status of the watchdog interrupt signal.

参数:

WDGx – watch dog module base

void WDG_disableWatchdog(WDG_Type *WDGx)

Disable WDG work.

参数:

WDGx – watch dog module base

void WDG_enableWatchdog(WDG_Type *WDGx)

Enable WDG work.

参数:

WDGx – watch dog module base

bool WDG_isWatchdogEnabled(WDG_Type *WDGx)

Checks if the watchdog is enabled or not.

参数:

WDGx – watch dog module base

void WDG_serviceWatchdog(WDG_Type *WDGx)

Services the watchdog.

参数:

WDGx – watch dog module base

void WDG_resetWatchdog(WDG_Type *WDGx)

Reset the watchdog.

参数:

WDGx – watch dog module base

void WDG_setWatchdogReloadValue(WDG_Type *WDGx, uint32_t reload)

Set the watchdog reload value.

参数:
  • WDGx – watch dog module base

  • reload – reload value

uint32_t WDG_getWatchdogCounterValue(WDG_Type *WDGx)

Gets the watchdog counter value.

参数:

WDGx – watch dog module base

bool WDG_getWatchdogResetStatus(WDG_Type *WDGx)

Gets the watchdog reset status.

参数:

WDGx – watch dog module base

void WDG_clearWatchdogResetStatus(WDG_Type *WDGx)

Clears the watchdog reset status.

参数:

WDGx – watch dog module base

bool WDG_getWatchdogInterruptRecordStatus(WDG_Type *WDGx)

Gets the watchdog interrupt status.

参数:

WDGx – watch dog module base

void WDG_clearWatchdogInterruptRecordStatus(WDG_Type *WDGx)

Clears the watchdog interrupt status.

参数:

WDGx – watch dog module base

void WDG_setWatchdogWindowValue(WDG_Type *WDGx, uint32_t lowThreshold, uint32_t highThreshold)

Set the window value for windowed watchdog.

参数:
  • WDGx – watch dog module base

  • lowThreshold – Lower threshold

  • highThreshold – Upper threshold

void WDG_enableWindowedWatchdog(WDG_Type *WDGx)

Enable windowed watchdog.

参数:

WDGx – watch dog module base

void WDG_disableWindowedWatchdog(WDG_Type *WDGx)

Disable windowed watchdog.

参数:

WDGx – watch dog module base

void WDG_setWatchdogWorkMode(WDG_Type *WDGx, WDG_workMode workMode)

Set the working mode of the watchdog.

参数:
  • WDGx – watch dog module base

  • workMode – working mode to be set

void WDG_lock(WDG_Type *WDGx)

Lock WDG module register write operation.

参数:

WDGx – watch dog module base

void WDG_unlock(WDG_Type *WDGx)

Unlock WDG module register write operation.

参数:

WDGx – watch dog module base

void WDG_enableInterrupt(WDG_Type *WDGx)

Enable interrupt.

参数:

WDGx – watch dog module base

void WDG_disableInterrupt(WDG_Type *WDGx)

Disable interrupt.

参数:

WDGx – watch dog module base

void WDG_maskInterrupt(WDG_Type *WDGx)

Mask interrupt.

参数:

WDGx – watch dog module base

void WDG_unmaskInterrupt(WDG_Type *WDGx)

Unmask interrupt.

参数:

WDGx – watch dog module base

ITStatus WDG_getInterruptStatus(WDG_Type *WDGx)

Get WDG interrupt status.

参数:

WDGx – watch dog module base

返回值:

ITStatus – SET: WDGx is in interrupt RESET: WDGx is not in interrupt

ITStatus WDG_getRawInterruptStatus(WDG_Type *WDGx)

Get WDG raw interrupt status.

参数:

WDGx – watch dog module base

返回值:

ITStatus – SET: WDGx is in interrupt RESET: WDGx is not in interrupt

void WDG_clearInterruptStatus(WDG_Type *WDGx)

clear WDG interrupt signal

参数:

WDGx – watch dog module base

Enumerations

enum WDG_WDMode

Values:

enumerator WD_MODE_INTERRUPT_RESET

Watchdog can generate a reset signal.

enumerator WD_MODE_INTERRUPT

Watchdog can generate an interrupt signal; reset signal is disabled.

enum WDG_workMode

Values:

enumerator ROUND1_IT_AND_ROUND2_RESET
enumerator ROUND1_IT_AND_RESET