3.看门狗的使用
这里依然使用mdk的看法环境,使用mdk编译程序,下载程序
3.1使能看门狗的驱动

3.2看门狗测试函数
/*
程序在空闲钩子函数内部喂狗操作,如果不喂狗mcu将在5S后自动复位重启
/
#include
#include
#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 ");
}
/ 看门狗测试 /
int wdt_sample(void)
{
rt_err_t ret = RT_EOK;
rt_uint32_t timeout = 5; /* 溢出时间,单位:秒 /
/ 根据设备名称查找看门狗设备,获取设备句柄 /
wdg_dev = rt_device_find(WDT_DEVICE_NAME);
if (!wdg_dev)
{
rt_kprintf("find %s failed!n", WDT_DEVICE_NAME);
return RT_ERROR;
}
/ 初始化设备 /
rt_device_init(wdg_dev);
/ 设置看门狗溢出时间 /
ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
if (ret != RT_EOK)
{
rt_kprintf("set %s timeout failed!n", WDT_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", WDT_DEVICE_NAME);
return -RT_ERROR;
}
/ 设置空闲线程回调函数 /
rt_thread_idle_sethook(idle_hook);
return ret;
}
/ 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(wdt_sample, wdt sample);
3.3测试结果

3.4看门狗设备驱动框架的学习
实现看门狗的初始化函数
实现看门狗的控制函数,根据命令类型实现不同的功能
注册看门狗设备到设备驱动框架
#ifndef WATCHDOG_H
#define WATCHDOG_H
#include
/ 命令类型 合计6种 /
#define RT_DEVICE_CTRL_WDT_GET_TIMEOUT (RT_DEVICE_CTRL_BASE(WDT) + 1) /* 获取超时时间 get timeout(in seconds) /
#define RT_DEVICE_CTRL_WDT_SET_TIMEOUT (RT_DEVICE_CTRL_BASE(WDT) + 2) / 设置超时时间 set timeout(in seconds) /
#define RT_DEVICE_CTRL_WDT_GET_TIMELEFT (RT_DEVICE_CTRL_BASE(WDT) + 3) / 在重新启动之前获取剩余时间 get the left time before reboot(in seconds) /
#define RT_DEVICE_CTRL_WDT_KEEPALIVE (RT_DEVICE_CTRL_BASE(WDT) + 4) / 喂狗 refresh watchdog /
#define RT_DEVICE_CTRL_WDT_START (RT_DEVICE_CTRL_BASE(WDT) + 5) / 开启看门狗 start watchdog /
#define RT_DEVICE_CTRL_WDT_STOP (RT_DEVICE_CTRL_BASE(WDT) + 6) / 关闭看门狗 stop watchdog */
struct rt_watchdog_ops;
struct rt_watchdog_device
{
struct rt_device parent;/ 父类基本的设别操作框架 /
const struct rt_watchdog_ops ops;/看门狗独有的操作函数 /
};
typedef struct rt_watchdog_device rt_watchdog_t;
/*看门狗操作函数
- 看门狗初始化函数
- 看门狗控制函数,根据 函数cmd 的类型控制看门狗
*/
struct rt_watchdog_ops
{
rt_err_t (*init)(rt_watchdog_t *wdt);//初始化函数
rt_err_t (*control)(rt_watchdog_t *wdt, int cmd, void *arg);//看门狗控制函数
};
/ 看门狗外设设备注册函数 /
rt_err_t rt_hw_watchdog_register(rt_watchdog_t *wdt,
const char *name,
rt_uint32_t flag,
void data);
#endif /WATCHDOG_H */
-
驱动器
+关注
关注
54文章
9016浏览量
153366 -
控制器
+关注
关注
114文章
17646浏览量
190261 -
看门狗
+关注
关注
10文章
607浏览量
72583 -
CMD命令
+关注
关注
0文章
28浏览量
8693 -
RT-Thread
+关注
关注
32文章
1540浏览量
44287
发布评论请先 登录
STM32中的独立看门狗和窗口看门狗是什么
stm32看门狗时间计算 独立看门狗和窗口看门狗的特性是什么
STM32看门狗配置(独立看门狗IWDG和窗口看门狗WWDG)
uC/OS-II 系统的多任务看门狗设计
基于STM32、FreeRTOS 实现硬件看门狗+软件看门狗监测多任务的方法
MCU独立看门狗与窗口看门狗的区别
FreeRTOS使用看门狗的步骤
STM32中的独立看门狗和窗口看门狗
STM32中的独立看门狗和窗口看门狗

【英飞凌开发板模块评测任务大挑战】看门狗外事使用
评论