电子说
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;
/*看门狗操作函数
全部0条评论
快来发表一下你的评论吧 !