1 /*
2  * Copyright (c) 2006-2023, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author         Notes
8  * 2023-3-27     wcx1024979076  first version.
9  */
10 /*
11  * 程序清单:这是一个独立看门狗设备使用例程
12  * 例程导出了 wdt_sample 命令到控制终端
13  * 命令调用格式:wdt_sample wdt
14  * 命令解释:命令第二个参数是要使用的看门狗设备名称,为空则使用例程默认的看门狗设备。
15  * 程序功能:程序通过设备名称查找看门狗设备,然后初始化设备并设置看门狗设备溢出时间。
16  *           然后设置空闲线程回调函数,在回调函数里会喂狗。
17 */
18 
19 #include <rtthread.h>
20 #include <rtdevice.h>
21 
22 #ifdef BSP_USING_WDT
23 
24 #define WDT_DEVICE_NAME    "wdt"    /* 看门狗设备名称 */
25 
26 static rt_device_t wdg_dev;         /* 看门狗设备句柄 */
27 
idle_hook(void)28 static void idle_hook(void)
29 {
30     /* 在空闲线程的回调函数里喂狗 */
31     rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
32     rt_kprintf("feed the dog!\n ");
33 }
34 
wdt_sample(int argc,char * argv[])35 static int wdt_sample(int argc, char *argv[])
36 {
37     rt_err_t ret = RT_EOK;
38     rt_uint32_t timeout = 1;        /* 溢出时间,单位:秒 */
39     char device_name[RT_NAME_MAX];
40 
41     /* 判断命令行参数是否给定了设备名称 */
42     if (argc == 2)
43     {
44         rt_strncpy(device_name, argv[1], RT_NAME_MAX);
45     }
46     else
47     {
48         rt_strncpy(device_name, WDT_DEVICE_NAME, RT_NAME_MAX);
49     }
50     /* 根据设备名称查找看门狗设备,获取设备句柄 */
51     wdg_dev = rt_device_find(device_name);
52     if (!wdg_dev)
53     {
54         rt_kprintf("find %s failed!\n", device_name);
55         return -RT_ERROR;
56     }
57     /* 初始化设备 */
58     rt_device_init(wdg_dev);
59 
60     /* 设置看门狗溢出时间 */
61     ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
62     if (ret != RT_EOK)
63     {
64         rt_kprintf("set %s timeout failed!\n", device_name);
65         return -RT_ERROR;
66     }
67 
68     /* 启动看门狗 */
69     ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
70     if (ret != RT_EOK)
71     {
72         rt_kprintf("start %s failed!\n", device_name);
73         return -RT_ERROR;
74     }
75     /* 设置空闲线程回调函数 */
76     rt_thread_idle_sethook(idle_hook);
77     return ret;
78 }
79 /* 导出到 msh 命令列表中 */
80 MSH_CMD_EXPORT(wdt_sample, wdt sample);
81 
82 #endif  /* RT_USING_WDT */
83