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_getInterruptStatus():获取中断状态(受屏蔽控制);WDG_getRawInterruptStatus():获取原始中断状态(不受屏蔽控制);WDG_isWatchdogInterruptActive():查询看门狗中断信号是否有效;WDG_clearInterruptStatus():清除中断状态。
备注
进入中断服务函数后必须调用 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);
}
复位模式配置流程
解锁看门狗 调用
WDG_unlock()解锁 WDG 寄存器模块写操作设置看门狗工作模式 调用
WDG_setWatchdogWorkMode()设置工作模式( 第一轮产生中断,第二轮产生复位 ; 同一轮产生中断和复位 )设置看门狗重载阈值 调用
WDG_setWatchdogReloadValue()设置阈值配置看门狗复位输出使能 调用
WDG_setWatchdogMode()选择WD_MODE_INTERRUPT_RESET产生中断和复位信号配置看门狗模式 - 调用
WDG_disableWindowedWatchdog()配置为独立看门狗; - 调用WDG_enableWindowedWatchdog()配置为窗口看门狗使能看门狗 调用
WDG_enableWatchdog()使能WDG在应用中周期调用
WDG_serviceWatchdog()喂狗
中断模式配置流程
解锁看门狗 调用
WDG_unlock()解锁 WDG 寄存器模块写操作设置看门狗工作模式 调用
WDG_setWatchdogWorkMode()设置工作模式设置看门狗重载阈值 调用
WDG_setWatchdogReloadValue()设置阈值配置看门狗复位输出禁止 调用
WDG_setWatchdogMode()选择WD_MODE_INTERRUPT仅产生中断信号配置看门狗模式 调用
WDG_disableWindowedWatchdog()配置为独立看门狗注册并使能中断 - 调用
Interrupt_register()注册 WDGx 中断处理函数; - 调用WDG_enableInterrupt()使能看门狗中断; - 调用NVIC_EnableIRQ使能 NVIC 对应中断线使能看门狗 调用
WDG_enableWatchdog()使能WDG在中断服务函数中调用
WDG_clearInterruptStatus()清除中断标志
应用示例
WDG超时中断示例:WDG/WDG_Feed_Timeout_Halt。
WDG超时复位示例:WDG/WDG_Feed_Timeout_Reset。
软件配置流程
配置流程如下:
解锁看门狗 调用
WDG_unlock()传入WDGx,解锁WDG寄存器模块写操作设置看门狗工作模式 调用
WDG_setWatchdogWorkMode()传入WDGx和工作模式( 第一轮产生中断,第二轮产生复位 ; 同一轮产生中断和复位 )设置看门狗重载阈值 调用
WDG_setWatchdogReloadValue()传入WDGx和阈值配置看门狗复位输出使能 调用
WDG_setWatchdogMode()传入WDGx和选择是否使能复位输出( 仅产生中断信号 ; 产生中断和复位信号 )配置看门狗模式
调用
WDG_disableWindowedWatchdog()传入WDGx配置为独立看门狗;调用
WDG_enableWindowedWatchdog()传入WDGx配置为窗口看门狗
使能看门狗 调用
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