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 */
-
驅動器
+關注
關注
52文章
8158瀏覽量
146028 -
控制器
+關注
關注
112文章
16206瀏覽量
177421 -
看門狗
+關注
關注
10文章
559瀏覽量
70746 -
CMD命令
+關注
關注
0文章
28瀏覽量
8300 -
RT-Thread
+關注
關注
31文章
1273瀏覽量
39924
發布評論請先 登錄
相關推薦
評論