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

电子说

1.3w人已加入

描述

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;
/*看门狗操作函数

  1. 看门狗初始化函数
  2. 看门狗控制函数,根据 函数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 */
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分