外观
WDT 看门狗示例
2026-07-07
概述
本文介绍如何在 睿擎工业开发平台 中创建并运行 WDT 看门狗 示例工程。通过驱动 TL3576 平台内置看门狗定时器,演示了利用 RT-Thread 设备驱动框架进行 WDT 设备操作的完整流程。
WDT 看门狗
看门狗定时器(WatchDog Timer, WDT)是一种硬件计时电路,当系统因软件故障或外部干扰陷入死循环或崩溃时,能自动产生复位信号使系统恢复正常运行。
硬件连接
TL3576 平台的 WDT 看门狗外设集成在 SoC 内部,无需额外外部接线。WDT 定时器使用内部时钟源驱动,通过 APB 总线进行寄存器配置。
查手册获取 WDT 的超时参数
根据 TL3576 技术参考手册(TRM)可知:
- WDT 支持可编程超时时间,范围从数毫秒至数十秒
- 本示例配置超时时间为
6秒
WDT 看门狗喂狗与超时复位
本示例展示如何通过 WDT 设备驱动接口初始化看门狗,创建独立的喂狗线程每 1 秒执行一次喂狗操作,在连续喂狗 10 次后停止喂狗,观察系统因超时而自动复位的完整过程。
构建与烧录
创建工程点击展开
依次点击 “文件” -> “新建” -> "RT-Thread RuiChing App 项目"。

在弹出新建向导中选择 开发版 、BSP: 、示例 、 调试器/下载器。选择好之后点击 “完成”。

点击 “完成” 后,等待工程创建完成。

创建完成。

构建工程点击展开
单击工程使工程进入 Active-Debug 模式。

点击工具栏上的构建按钮进行工程编译。

构建成功后,会显示构建成功的信息。

固件下载点击展开
固化驱动

固化 APP

核心示例代码
wdt_example.c
static void wdt_feed_entry(void *parameter)// 看门狗喂狗线程
{
rt_uint32_t count = 0;
rt_uint32_t timeout = (rt_uint32_t)parameter;
rt_kprintf("[WDT_TEST] Feed dog thread started. Setting Timeout: %d seconds.\n", timeout);
while (count < 10)
{
rt_mutex_take(wdt_mutex, RT_WAITING_FOREVER);// 获取互斥量
rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL);
rt_mutex_release(wdt_mutex);// 释放互斥量
rt_uint32_t time_left = 0;
rt_err_t ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_GET_TIMELEFT, &time_left);
if (ret == RT_EOK)
{
rt_kprintf("[WDT_TEST] Feeding... (%d/10), Time left: %d sec\n", count + 1, time_left);
}
else
{
rt_kprintf("[WDT_TEST] Feeding... (%d/10), get_timeleft unsupported\n", count + 1);
}
rt_thread_mdelay(1000);
count++;
}
rt_uint32_t real_timeout = 0;
rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_GET_TIMEOUT, &real_timeout);
rt_kprintf("[WDT_TEST] Stop feeding dog. System will reset after %ds!\n", real_timeout);
feed_thread = RT_NULL;
while (1)
{
rt_thread_mdelay(500);
}
}
int wdt_test(int argc, char **argv)// 看门狗测试入口函数
{
rt_err_t ret = RT_EOK;
rt_uint32_t timeout = WDT_TIMEOUT_SEC * 1000;
rt_uint32_t wdt_type = 0;
if (wdg_dev != RT_NULL || feed_thread != RT_NULL)
{
rt_kprintf("[WDT_TEST] WDT already running, please wait reset or reboot!\n");
return -RT_EBUSY;
}
if (wdt_mutex == RT_NULL)
{
wdt_mutex = rt_mutex_create("wdt_mtx", RT_IPC_FLAG_FIFO);// 创建一个互斥量
if (wdt_mutex == RT_NULL)
{
rt_kprintf("[WDT_TEST] Create mutex failed!\n");
return -RT_ENOMEM;
}
}
wdg_dev = rt_device_find(WDT_DEVICE_NAME);//寻找 wdt 设备
if (!wdg_dev)
{
rt_kprintf("[WDT_TEST] Can't find watchdog device: %s\n", WDT_DEVICE_NAME);
return -RT_ERROR;
}
ret = rt_device_open(wdg_dev, RT_DEVICE_FLAG_RDWR);//打开 wdt 设备
if (ret != RT_EOK)
{
rt_kprintf("[WDT_TEST] Open watchdog failed, err: %d\n", ret);
wdg_dev = RT_NULL;
return ret;
}
ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);//设置 wdt 超时时间
if (ret != RT_EOK)
{
rt_kprintf("[WDT_TEST] Set timeout failed, err: %d\n", ret);
rt_device_close(wdg_dev);
wdg_dev = RT_NULL;
return ret;
}
ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, &wdt_type);//启动 wdt
if (ret != RT_EOK)
{
rt_kprintf("[WDT_TEST] Start watchdog failed, err: %d\n", ret);
rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_STOP, RT_NULL);//关闭 wdt
rt_device_close(wdg_dev);
wdg_dev = RT_NULL;
return ret;
}
rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL);//喂狗
feed_thread = rt_thread_create("wdt_feed",
wdt_feed_entry,
(void *)WDT_TIMEOUT_SEC,
1024,
20,
10);// 动态初始化线程
if (feed_thread != RT_NULL)
{
rt_thread_startup(feed_thread);
rt_kprintf("[WDT_TEST] Feed thread created and started\n");
}
else
{
rt_kprintf("[WDT_TEST] Create feed thread failed!\n");
rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_STOP, RT_NULL);
rt_device_close(wdg_dev);
wdg_dev = RT_NULL;
feed_thread = RT_NULL;
return -RT_ENOMEM;
}
return RT_EOK;
}运行示例
操作步骤
- 将程序下载到开发板
- 打开串口终端连接开发板
- 在终端输入
wdt_test命令运行 - 观察终端日志:喂狗 10 次后停止喂狗,系统将在超时后自动复位
预期结果
验证 WDT 看门狗的基本通信及喂狗 / 超时复位功能正常。
RT-Thread 终端
msh />wdt_test
[DRV_WDT] SET_TIMEOUT: input 6000 ms
[DRV_WDT] match period 12, actual timeout 11 sec
[WDT_TEST] Feed thread created and started
msh />[WDT_TEST] Feed dog thread started. Setting Timeout: 6 seconds.
[WDT_TEST] Feeding... (1/10), Time left: 11 sec
[WDT_TEST] Feeding... (2/10), Time left: 11 sec
[WDT_TEST] Feeding... (3/10), Time left: 11 sec
[WDT_TEST] Feeding... (4/10), Time left: 11 sec
[WDT_TEST] Feeding... (5/10), Time left: 11 sec
[WDT_TEST] Feeding... (6/10), Time left: 11 sec
[WDT_TEST] Feeding... (7/10), Time left: 11 sec
[WDT_TEST] Feeding... (8/10), Time left: 11 sec
[WDT_TEST] Feeding... (9/10), Time left: 11 sec
[WDT_TEST] Feeding... (10/10), Time left: 11 sec
[WDT_TEST] Stop feeding dog. System will reset after 11s!
--- System reset ---