3.看門狗的使用
這里依然使用mdk的看法環(huán)境,使用mdk編譯程序,下載程序
3.1使能看門狗的驅(qū)動(dòng)
3.2看門狗測試函數(shù)
/*
程序在空閑鉤子函數(shù)內(nèi)部喂狗操作,如果不喂狗mcu將在5S后自動(dòng)復(fù)位重啟
/
#include
#include
#define WDT_DEVICE_NAME "wdt" / 看門狗設(shè)備名稱 /
static rt_device_t wdg_dev; / 看門狗設(shè)備句柄 /
static void idle_hook(void)
{
/ 在空閑線程的回調(diào)函數(shù)里喂狗 如果不喂狗設(shè)備將重啟*/
// 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; /* 溢出時(shí)間,單位:秒 /
/ 根據(jù)設(shè)備名稱查找看門狗設(shè)備,獲取設(shè)備句柄 /
wdg_dev = rt_device_find(WDT_DEVICE_NAME);
if (!wdg_dev)
{
rt_kprintf("find %s failed!n", WDT_DEVICE_NAME);
return RT_ERROR;
}
/ 初始化設(shè)備 /
rt_device_init(wdg_dev);
/ 設(shè)置看門狗溢出時(shí)間 /
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;
}
/ 啟動(dòng)看門狗 /
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;
}
/ 設(shè)置空閑線程回調(diào)函數(shù) /
rt_thread_idle_sethook(idle_hook);
return ret;
}
/ 導(dǎo)出到 msh 命令列表中 */
MSH_CMD_EXPORT(wdt_sample, wdt sample);
3.3測試結(jié)果
3.4看門狗設(shè)備驅(qū)動(dòng)框架的學(xué)習(xí)
實(shí)現(xiàn)看門狗的初始化函數(shù)
實(shí)現(xiàn)看門狗的控制函數(shù),根據(jù)命令類型實(shí)現(xiàn)不同的功能
注冊(cè)看門狗設(shè)備到設(shè)備驅(qū)動(dòng)框架
#ifndef WATCHDOG_H
#define WATCHDOG_H
#include
/ 命令類型 合計(jì)6種 /
#define RT_DEVICE_CTRL_WDT_GET_TIMEOUT (RT_DEVICE_CTRL_BASE(WDT) + 1) /* 獲取超時(shí)時(shí)間 get timeout(in seconds) /
#define RT_DEVICE_CTRL_WDT_SET_TIMEOUT (RT_DEVICE_CTRL_BASE(WDT) + 2) / 設(shè)置超時(shí)時(shí)間 set timeout(in seconds) /
#define RT_DEVICE_CTRL_WDT_GET_TIMELEFT (RT_DEVICE_CTRL_BASE(WDT) + 3) / 在重新啟動(dòng)之前獲取剩余時(shí)間 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) / 關(guān)閉看門狗 stop watchdog */
struct rt_watchdog_ops;
struct rt_watchdog_device
{
struct rt_device parent;/ 父類基本的設(shè)別操作框架 /
const struct rt_watchdog_ops ops;/看門狗獨(dú)有的操作函數(shù) /
};
typedef struct rt_watchdog_device rt_watchdog_t;
/*看門狗操作函數(shù)
- 看門狗初始化函數(shù)
- 看門狗控制函數(shù),根據(jù) 函數(shù)cmd 的類型控制看門狗
*/
struct rt_watchdog_ops
{
rt_err_t (*init)(rt_watchdog_t *wdt);//初始化函數(shù)
rt_err_t (*control)(rt_watchdog_t *wdt, int cmd, void *arg);//看門狗控制函數(shù)
};
/ 看門狗外設(shè)設(shè)備注冊(cè)函數(shù) /
rt_err_t rt_hw_watchdog_register(rt_watchdog_t *wdt,
const char *name,
rt_uint32_t flag,
void data);
#endif /WATCHDOG_H */
-
驅(qū)動(dòng)器
+關(guān)注
關(guān)注
52文章
8226瀏覽量
146253 -
控制器
+關(guān)注
關(guān)注
112文章
16332瀏覽量
177808 -
看門狗
+關(guān)注
關(guān)注
10文章
560瀏覽量
70789 -
CMD命令
+關(guān)注
關(guān)注
0文章
28瀏覽量
8306 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1285瀏覽量
40085
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論