WDT¶
1 功能概述¶
本例程演示 WatchDog Timer(WDT)Driver 的基本功能与使用方法。
例程主要完成以下内容:
初始化系统时钟、串口(UART0 115200)并打印日志
配置并启动 WDT:选择超时周期、复位延时、使能超时中断、使能超时复位
通过是否“喂狗”(
WDT_ResetCounter())演示两种典型现象:不喂狗:WDT 周期性超时,触发中断并在复位延时后复位系统
喂狗:系统持续运行,不会因 WDT 超时复位
2 环境准备¶
硬件设备与线材:
PAN271x EVB 核心板与底板各一块
JLink 仿真器(用于烧录例程程序)
USB-TypeC 线一条(用于底板供电和查看串口打印 Log)
杜邦线数根或跳线帽数个(用于连接各个硬件设备)
PC 软件:
串口调试助手或终端工具,波特率 115200(用于查看串口 Log)
硬件接线:
将 EVB 核心板插到底板上
连接串口转USB调试模块:
使用 USB-TypeC 线,将 PC USB 插口与 EVB 底板 USB->UART 插口相连
使用杜邦线或跳线帽将 EVB 底板
J8排针对 (P06 & TXD) 和J9排针对 (P05 & RXD) 分别短接起来
连接 Jlink,使用杜邦线将 JLink 仿真器的:
SWD_CLK 引脚与 EVB 底板的 P00 排针相连
SWD_DAT 引脚与 EVB 底板的 P01 排针相连
SWD_GND 引脚与 EVB 底板的 GND 排针相连
P20接逻辑分析仪
4 例程演示说明¶
本例程默认行为:启动 WDT 后不喂狗(主循环中 WDT_ResetCounter() 处于注释状态),因此会周期性触发 WDT 超时并复位。
烧录完成后,芯片会通过串口打印一次初始化 Log(示例):
CPU @ 48000000Hz
随后在约“WDT 超时 + 复位延时”的总时间后发生复位,并再次打印
CPU @ ...,形成循环。总时间满足:
T_reset ≈ T_timeout + T_delay本例程配置为:
超时周期:
WDT_TIMEOUT_2POW15复位延时:
WDT_RESET_DELAY_1025CLK使能超时复位:
TRUE使能超时中断:
WDT_EnableInt()
典型现象(示例):
CPU @ 48000000Hz CPU @ 48000000Hz CPU @ 48000000Hz ...
如需验证“喂狗不复位”,将
samples\drivers\wdt\src\main.c中主循环的WDT_ResetCounter();取消注释即可,现象变为:只打印一次CPU @ ...,系统不再周期性复位。
4.1 主要流程代码(main.c 节选)¶
/* Unlock Regs before Enable WDT as several WDT Regs are write-protected */
SYS_UnlockReg();
WDT_Open(WDT_TIMEOUT_2POW15, WDT_RESET_DELAY_1025CLK, TRUE, FALSE);
WDT_EnableInt();
NVIC_EnableIRQ(WDT_IRQn);
SYS_LockReg(); /* Re-lock Regs */
while (1)
{
/* Feed Watchdog */
// WDT_ResetCounter();
}
4.2 超时与复位延时计算方法¶
WDT 超时(近似):
T_timeout ≈ (2^N) * WDT_CLK其中N由WDT_TIMEOUT_2POWxx的 “xx” 决定。
0000 = 2^4 * WDT_CLK.
0001 = 2^6 * WDT_CLK.
0010 = 2^8 * WDT_CLK.
0011 = 2^10 * WDT_CLK.
0100 = 2^12 * WDT_CLK.
0101 = 2^14 * WDT_CLK.
0110 = 2^15 * WDT_CLK.
0111 = 2^16 * WDT_CLK.
1000 = 2^17 * WDT_CLK.
1001 = 2^18 * WDT_CLK.
1010 = 2^19 * WDT_CLK.
1011 = 2^20 * WDT_CLK.
1100 = 2^21 * WDT_CLK.
1101 = 2^22 * WDT_CLK.
1110 = 2^23 * WDT_CLK.
1111 = 2^24 * WDT_CLK.
复位延时(近似):
T_delay ≈ D * WDT_CLK其中WDT_RESET_DELAY_1025CLK/129CLK/17CLK/2CLK对应D ∈ {1025, 129, 17, 2}。
4.3 主要 API 说明¶
SYS_UnlockReg()/SYS_LockReg():WDT 的部分寄存器为写保护寄存器,配置/使能前需解锁。WDT_Open(timeout, resetDelay, enableReset, enableWakeup):配置 WDT time-out和delay时间,超时是否reset,是否启用低功耗唤醒功能。WDT_EnableInt()/WDT_DisableInt():使能/关闭 WDT 超时中断。NVIC_EnableIRQ(WDT_IRQn):在 NVIC 中打开 WDT 中断。WDT_ResetCounter():喂狗(清 WDT 计数器)。注意该函数内部会临时解锁/上锁寄存器。WDT_ClearTimeoutIntFlag():清除超时中断标志(在自定义WDT_IRQHandler()中常用)。
4.4 注意事项¶
本例程使能了
WDT_IRQn,但未在例程中实现WDT_IRQHandler()。因为使能了 WDT 超时复位,硬件会在复位延时到达后复位系统,因此整体现象通常仍表现为“周期性复位”。若你希望在超时中断时打印日志/做处理,请在工程中实现
WDT_IRQHandler(),并在中断中获取中断WDT_GetTimeoutIntFlag清标志WDT_ClearTimeoutIntFlag(必要时喂狗),避免重复进入中断。常见组合建议:
仅“复位看门狗”:可不使能
WDT_EnableInt()/NVIC_EnableIRQ(WDT_IRQn)/不实现中断服务函数,只保留WDT_Open(..., enableReset=TRUE, ...)。仅“中断提醒不复位”:将
WDT_Open(..., enableReset=FALSE, ...),并实现WDT_IRQHandler()来清中断标志并执行你的超时处理。