模塊介紹
N32L40XCL 內(nèi)置獨(dú)立看門狗(IWDG)和窗口看門狗(WWDG)定時(shí)器,解決軟件錯(cuò)誤導(dǎo)致的問(wèn)題。看門狗定時(shí)器使用非常靈活,提高了系統(tǒng)的安全性和定時(shí)控制的準(zhǔn)確性。
獨(dú)立看門狗(IWDG)由運(yùn)行在 40KHz 的低速內(nèi)部時(shí)鐘(LSI 時(shí)鐘)驅(qū)動(dòng),在死循環(huán)事件或 MCU 卡死發(fā)生時(shí),它仍然可以運(yùn)行。這可以提供更高的安全級(jí)別、定時(shí)精度和看門狗的靈活性。它可以通過(guò)重置來(lái)解決由于軟件故障引起的系統(tǒng)故障。IWDG 最適合需要看門狗在主應(yīng)用程序之外作為完全獨(dú)立進(jìn)程運(yùn)行但時(shí)序精度限制較低的應(yīng)用程序。
窗口看門狗(WWDG)的時(shí)鐘是由 APB1 時(shí)鐘頻率除以 4096 得到的,通過(guò)時(shí)間窗口的配置來(lái)檢測(cè)程序運(yùn)行是否異常。因此,WWDG 適用于精確定時(shí),常用于監(jiān)控因外部干擾或無(wú)法預(yù)見的邏輯條件導(dǎo)致應(yīng)用程序偏離其正常操作順序的軟件故障。當(dāng) WWDG 遞減計(jì)數(shù)器在達(dá)到窗口寄存器值之前或 WWDG_CTRL.T6 位變?yōu)?0 之后刷新時(shí),系統(tǒng)復(fù)位發(fā)生。
官方WDT驅(qū)動(dòng)實(shí)現(xiàn)的是獨(dú)立看門狗(IWDG)。
開發(fā)軟件
開發(fā)環(huán)境:
RT-Thread Studio 2.2.6
RT-Thread版本:4.0.2
下載工具:pyocd
步驟說(shuō)明
新建工程
打開RT-Thread settings,使能Watchdog Timer,如下圖所示。
添加保存后,進(jìn)行編譯,若無(wú)問(wèn)題,則進(jìn)行下一步。
編寫測(cè)試程序
編寫測(cè)試程序如下:
#include
#include
#include
/* defined the LED3 pin: PB5 /
#define LED3_PIN GET_PIN(B, 5)
#define WDT_DEVICE_NAME "wdt" / 看門狗設(shè)備名稱 /
static rt_device_t wdg_dev; / 看門狗設(shè)備句柄 /
static void idle_hook(void)
{
/ 在空閑線程的回調(diào)函數(shù)里喂狗 /
rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
//rt_kprintf("feed the dog!n ");
}
int main(void)
{
/ set LED3 pin mode to output /
rt_pin_mode(LED3_PIN, PIN_MODE_OUTPUT);
rt_err_t ret = RT_EOK;
rt_uint32_t timeout = 3000; / 溢出時(shí)間,單位:毫秒 /
char device_name[RT_NAME_MAX];
rt_strncpy(device_name, WDT_DEVICE_NAME, RT_NAME_MAX);
/ 根據(jù)設(shè)備名稱查找看門狗設(shè)備,獲取設(shè)備句柄 /
wdg_dev = rt_device_find(device_name);
if (!wdg_dev)
{
rt_kprintf("find %s failed!n", device_name);
return RT_ERROR;
}
/ 設(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", 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", device_name);
return -RT_ERROR;
}
/ 根據(jù)設(shè)備名稱查找看門狗設(shè)備,獲取設(shè)備句柄 /
wdg_dev = rt_device_find(device_name);
if (!wdg_dev)
{
rt_kprintf("find %s failed!n", device_name);
return RT_ERROR;
}
/ 設(shè)置空閑線程回調(diào)函數(shù) */
rt_thread_idle_sethook(idle_hook);
while (1)
{
rt_pin_write(LED3_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED3_PIN, PIN_LOW);
rt_thread_mdelay(500);
}
}
代碼驗(yàn)證
程序很簡(jiǎn)單,初始化看門狗后,在空閑線程回調(diào)函數(shù)中不斷喂狗即可。在正式使用看門狗時(shí),取消回調(diào)函數(shù)中的打印。
下載程序后運(yùn)行。
如果終端打印提示“warning: tidle0 stack is close to end of stack address.”,請(qǐng)?jiān)趓tconfig.h文件中搜索IDLE_THREAD_STACK_SIZE,并擴(kuò)大該棧空間。默認(rèn)值是256,可以擴(kuò)大到512。
程序中使用RT_DEVICE_CTRL_WDT_SET_TIM命令設(shè)置超時(shí)時(shí)間,需要注意對(duì)于N32L40XCL開發(fā)板的驅(qū)動(dòng)程序而言,這個(gè)超時(shí)時(shí)間的單位是毫秒,而有些RT-Thread的驅(qū)動(dòng)程序這個(gè)超時(shí)時(shí)間的單位是秒。
此外,這個(gè)超時(shí)時(shí)間不能設(shè)置過(guò)長(zhǎng),因?yàn)檫^(guò)長(zhǎng)會(huì)超過(guò)N32L40XCL寄存器的范圍。對(duì)于默認(rèn)配置,這個(gè)超時(shí)時(shí)間不能超過(guò)376ms。否則程序會(huì)打印如下錯(cuò)誤信息:
[W/DBG] wdg set timeout parameter too large, please less than 3276 ms
set wdt timeout failed!
具體的工作原理可以參考下面這段drv_wdt.c的代碼:
case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
{
RT_ASSERT(*(uint16_t *)args != 0);
reload_value = *(uint16_t *)args;
if(reload_value > 0xFFF * 32 *1000 / LsiFreq)
{
LOG_W("wdg set timeout parameter too large, please less than %d msn", 0xFFF * 32 *1000 / LsiFreq);
return -RT_EINVAL;
}
/* Enable write access to IWDG_PR and IWDG_RLR registers */
IWDG_WriteConfig(IWDG_WRITE_ENABLE);
/* IWDG counter clock: LSI/32 */
IWDG_SetPrescalerDiv(IWDG_PRESCALER_DIV32);
reload_value = ((uint32_t)reload_value * LsiFreq / 1000) / 32;
IWDG_CntReload(reload_value);
IWDG_WriteConfig(IWDG_WRITE_DISABLE);
}
如果注釋掉上面idle_hook中的喂狗語(yǔ)句,則可以看到程序每3秒重啟一次。
章節(jié)總結(jié)
通過(guò)測(cè)試,可以驗(yàn)證N32L40XCL芯片的WDT驅(qū)動(dòng)程序可以正常運(yùn)行。
-
寄存器
+關(guān)注
關(guān)注
31文章
5342瀏覽量
120279 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1286瀏覽量
40103 -
MCU控制器
+關(guān)注
關(guān)注
0文章
27瀏覽量
6885 -
WWDG
+關(guān)注
關(guān)注
0文章
19瀏覽量
5509 -
IWDG
+關(guān)注
關(guān)注
0文章
21瀏覽量
5212
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論