当前页面为 开发中 版本,查看特定版本的文档,请在页面左下角的下拉菜单中进行选择。

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接逻辑分析仪

3 编译和烧录

例程位置:<PAN271x-DK>\01_SDK\samples\drivers\wdt

双击 Keil Project 文件打开工程进行编译烧录。

4 例程演示说明

本例程默认行为:启动 WDT 后不喂狗(主循环中 WDT_ResetCounter() 处于注释状态),因此会周期性触发 WDT 超时并复位。

  1. 烧录完成后,芯片会通过串口打印一次初始化 Log(示例):

CPU @ 48000000Hz
  1. 随后在约“WDT 超时 + 复位延时”的总时间后发生复位,并再次打印 CPU @ ...,形成循环。

    总时间满足:T_reset T_timeout + T_delay

    • 本例程配置为:

      • 超时周期:WDT_TIMEOUT_2POW15

      • 复位延时:WDT_RESET_DELAY_1025CLK

      • 使能超时复位:TRUE

      • 使能超时中断:WDT_EnableInt()

    • 典型现象(示例):

      CPU @ 48000000Hz
      CPU @ 48000000Hz
      CPU @ 48000000Hz
      ...
      
  2. 如需验证“喂狗不复位”,将 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 其中 NWDT_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() 来清中断标志并执行你的超时处理。