3.看門狗的使用
這里依然使用mdk的看法環(huán)境,使用mdk編譯程序,下載程序
3.1使能看門狗的驅(qū)動(dòng)
3.2看門狗測(cè)試函數(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 ");
}
/ 看門狗測(cè)試 /
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測(cè)試結(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)注
54文章
8637瀏覽量
149109 -
控制器
+關(guān)注
關(guān)注
114文章
16979瀏覽量
182994 -
看門狗
+關(guān)注
關(guān)注
10文章
579瀏覽量
71577 -
CMD命令
+關(guān)注
關(guān)注
0文章
28瀏覽量
8515 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1371瀏覽量
41533
發(fā)布評(píng)論請(qǐng)先 登錄
STM32中的獨(dú)立看門狗和窗口看門狗是什么

什么是看門狗電路
stm32看門狗時(shí)間計(jì)算 獨(dú)立看門狗和窗口看門狗的特性是什么
什么是stm32看門狗?獨(dú)立看門狗和窗口看門狗工作原理解析

STM32看門狗配置(獨(dú)立看門狗IWDG和窗口看門狗WWDG)

uC/OS-II 系統(tǒng)的多任務(wù)看門狗設(shè)計(jì)
基于STM32、FreeRTOS 實(shí)現(xiàn)硬件看門狗+軟件看門狗監(jiān)測(cè)多任務(wù)的方法
MCU獨(dú)立看門狗與窗口看門狗的區(qū)別

STM32:獨(dú)立看門狗、窗口看門狗的配置

FreeRTOS使用看門狗的步驟
STM32中的獨(dú)立看門狗和窗口看門狗
STM32中的獨(dú)立看門狗和窗口看門狗

英飛凌開發(fā)板模塊評(píng)測(cè)任務(wù)大挑戰(zhàn)
什么是看門狗,工業(yè)路由器看門狗技術(shù)的功能優(yōu)勢(shì)

評(píng)論