开发环境:
IDE:MKD 5.38a
Renesas RA Smart Configurator:v5.9.0
开发板:RA-Eco-RA6M4开发板
MCU:R7FA6M4AF3CFP
WDT(Watch Dot timer)即看门狗定时器,其主要作用是当发生软件故障时可以产生复位信号,使程序复位,其本质是一个计数器。
当看门狗启动后,计数器开始自动计数,在计数器溢出前如果没有被复位,计数器溢出就会对 CPU 产生一个复位信号使系统重启(俗称 “被狗咬”)。系统正常运行时,需要在看门狗允许的时间间隔内对看门狗计数器清零(俗称“喂狗“),不让复位信号产生。如果系统不出问题,程序能够按时“喂狗”。一旦程序跑飞,没有“喂狗”,系统“被咬” 复位。
WDT相关接口如下所示:
| 函数 | 描述 |
|---|---|
| rt_device_find() | 根据看门狗设备设备名称查找设备获取设备句柄 |
| rt_device_init() | 初始化看门狗设备 |
| rt_device_control() | 控制看门狗设备 |
| rt_device_close() | 关闭看门狗设备 |
关闭看门狗设备
关于WDT更详细的内容,请参看官方手册:
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/watchdog/watchdog
WDT使用起来很简单。
1、根据设备名称 “wdt” 查找设备获取设备句柄。
2、初始化设备后设置看门狗溢出时间。
3、启动看门狗。
4、喂狗:设置空闲线程回调函数,在空闲线程回调函数中喂狗。
接下来配置WDT,只需要简单配置就可使用。
打开RA Smart Configurator,添加WDT的stack。

接下来需要配置WDT的参数。

这里可以设置WDT的参数。

核心代码如下:
#include <rtthread.h>
#include <rtdevice.h>
#define WDT_DEVICE_NAME "wdt" /* 看门狗设备名称 */
static rt_device_t wdg_dev; /* 看门狗设备句柄 */
static void idle_hook(void)
{
/* 在空闲线程的回调函数里喂狗 */
rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
rt_kprintf("feed the dog!\n ");
rt_thread_mdelay(300);
}
int wdt_sample(int argc, char *argv[])
{
rt_err_t ret = RT_EOK;
char device_name[RT_NAME_MAX];
rt_strncpy(device_name, WDT_DEVICE_NAME, RT_NAME_MAX);
/* 根据设备名称查找看门狗设备,获取设备句柄 */
wdg_dev = rt_device_find(device_name);
if (!wdg_dev)
{
rt_kprintf("find %s failed!\n", device_name);
return RT_ERROR;
}
/* 启动看门狗 */
ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
if (ret != RT_EOK)
{
rt_kprintf("start %s failed!\n", device_name);
return -RT_ERROR;
}
/* 设置空闲线程回调函数 */
rt_thread_idle_sethook(idle_hook);
return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(wdt_sample, wdt sample);
1
编译下载。
如果屏蔽喂狗操作,在终端输入“wdt_sample”即可进行测试。

执行wdt_sample,结果如下:(一秒后触发WDT复位)
如果定时喂狗,在终端输入“wdt_sample”即可进行测试。

更多回帖