0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于RT-Thread對N32L40XCL的看門狗定時器進行測試

冬至子 ? 來源:zealsoft ? 作者:zealsoft ? 2023-08-08 17:24 ? 次閱讀

模塊介紹

N32L40XCL 內(nèi)置獨立看門狗(IWDG)和窗口看門狗(WWDG)定時器,解決軟件錯誤導(dǎo)致的問題??撮T狗定時器使用非常靈活,提高了系統(tǒng)的安全性和定時控制的準(zhǔn)確性。

獨立看門狗(IWDG)由運行在 40KHz 的低速內(nèi)部時鐘(LSI 時鐘)驅(qū)動,在死循環(huán)事件或 MCU 卡死發(fā)生時,它仍然可以運行。這可以提供更高的安全級別、定時精度和看門狗的靈活性。它可以通過重置來解決由于軟件故障引起的系統(tǒng)故障。IWDG 最適合需要看門狗在主應(yīng)用程序之外作為完全獨立進程運行但時序精度限制較低的應(yīng)用程序。

窗口看門狗(WWDG)的時鐘是由 APB1 時鐘頻率除以 4096 得到的,通過時間窗口的配置來檢測程序運行是否異常。因此,WWDG 適用于精確定時,常用于監(jiān)控因外部干擾或無法預(yù)見的邏輯條件導(dǎo)致應(yīng)用程序偏離其正常操作順序的軟件故障。當(dāng) WWDG 遞減計數(shù)器在達到窗口寄存器值之前或 WWDG_CTRL.T6 位變?yōu)?0 之后刷新時,系統(tǒng)復(fù)位發(fā)生。

官方WDT驅(qū)動實現(xiàn)的是獨立看門狗(IWDG)。

開發(fā)軟件
開發(fā)環(huán)境:
RT-Thread Studio 2.2.6
RT-Thread版本:4.0.2
下載工具:pyocd

步驟說明

新建工程

打開RT-Thread settings,使能Watchdog Timer,如下圖所示。

1.jpg

添加保存后,進行編譯,若無問題,則進行下一步。

編寫測試程序

編寫測試程序如下:

#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; /
溢出時間,單位:毫秒 /
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è)置看門狗溢出時間 /
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;
}
/
啟動看門狗 /
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);
}
}

代碼驗證

程序很簡單,初始化看門狗后,在空閑線程回調(diào)函數(shù)中不斷喂狗即可。在正式使用看門狗時,取消回調(diào)函數(shù)中的打印。

下載程序后運行。

如果終端打印提示“warning: tidle0 stack is close to end of stack address.”,請在rtconfig.h文件中搜索IDLE_THREAD_STACK_SIZE,并擴大該??臻g。默認值是256,可以擴大到512。

程序中使用RT_DEVICE_CTRL_WDT_SET_TIM命令設(shè)置超時時間,需要注意對于N32L40XCL開發(fā)板的驅(qū)動程序而言,這個超時時間的單位是毫秒,而有些RT-Thread的驅(qū)動程序這個超時時間的單位是秒。

此外,這個超時時間不能設(shè)置過長,因為過長會超過N32L40XCL寄存器的范圍。對于默認配置,這個超時時間不能超過376ms。否則程序會打印如下錯誤信息

[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中的喂狗語句,則可以看到程序每3秒重啟一次。

章節(jié)總結(jié)

通過測試,可以驗證N32L40XCL芯片的WDT驅(qū)動程序可以正常運行。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5295

    瀏覽量

    119832
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1261

    瀏覽量

    39841
  • MCU控制器
    +關(guān)注

    關(guān)注

    0

    文章

    27

    瀏覽量

    6867
  • WWDG
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    5485
  • IWDG
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    5191
收藏 人收藏

    評論

    相關(guān)推薦

    一文詳解看門狗定時器

    看門狗定時器由獨立的1 Mhz 片內(nèi)振蕩驅(qū)動。這是VCC = 5V 時的典型值。請參見特性數(shù)據(jù)以了解其他VCC 電平下的典型值。通過設(shè)置看門狗定時
    發(fā)表于 09-02 16:40 ?3914次閱讀
    一文詳解<b class='flag-5'>看門狗</b><b class='flag-5'>定時器</b>

    STM32看門狗定時器的工作原理和作用 看門狗定時器的特性

    看門狗定時器(WDT,Watch Dog Timer)是單片機的一個組成部分,它實際上是一個計數(shù),一般來說都是向下計數(shù)的,給看門狗一個數(shù)字,程序開始運行后
    的頭像 發(fā)表于 07-27 16:30 ?5769次閱讀
    STM32<b class='flag-5'>看門狗</b><b class='flag-5'>定時器</b>的工作原理和作用 <b class='flag-5'>看門狗</b><b class='flag-5'>定時器</b>的特性

    N32L40XCL-STB的I2C測試步驟

    本人基于 rt-thread studio 對 N32L40XCL 進行I2C測試。具體表現(xiàn)為使用 N32L40XCL 的 I2C1 (PA
    的頭像 發(fā)表于 09-18 17:35 ?1361次閱讀
    <b class='flag-5'>N32L40XCL</b>-STB的I2C<b class='flag-5'>測試</b>步驟

    RT-Thread Nano入門:獨立看門狗(IWDT)

    本文主要介紹怎么用RT-Thread Nano實現(xiàn)獨立看門狗IWDT驅(qū)動,創(chuàng)建一個喂狗線程,實現(xiàn)定時喂狗功能。
    的頭像 發(fā)表于 11-22 11:04 ?2095次閱讀
    <b class='flag-5'>RT-Thread</b> Nano入門:獨立<b class='flag-5'>看門狗</b>(IWDT)

    內(nèi)部與外部看門狗定時器的比較

    摘要:本文對內(nèi)部(集成在處理內(nèi)部)看門狗定時器(WTD)與外部(基于硬件) WDT的優(yōu)勢和劣勢進行了對比。內(nèi)部看門狗便于設(shè)計,但容易失效。
    發(fā)表于 05-02 10:34 ?4568次閱讀

    看門狗定時器的設(shè)計、工作原理及看門狗定時器的操作

    看門狗定時器(WDT,Watch Dog Timer)是單片機的一個組成部分,它實際上是一個計數(shù),一般給看門狗一個數(shù)字,程序開始運行后看門狗
    發(fā)表于 05-23 09:14 ?7617次閱讀
    <b class='flag-5'>看門狗</b><b class='flag-5'>定時器</b>的設(shè)計、工作原理及<b class='flag-5'>看門狗</b><b class='flag-5'>定時器</b>的操作

    看門狗定時器的作用

    看門狗定時器(WDT,Watch Dog Timer)是單片機的一個組成部分,它實際上是一個計數(shù),一般給看門狗一個數(shù)字,程序開始運行后看門狗
    發(fā)表于 10-20 14:41 ?6659次閱讀

    基于VxWorks的看門狗定高效定時機制設(shè)計實現(xiàn)

    VxWorks提供了一個看門狗定時器(watchDog timer),它由以下四個函數(shù)維護: wdCreate( ) 創(chuàng)建并初始化一個看門狗定時器;wdDelete( ) 終止并
    發(fā)表于 03-06 09:22 ?4737次閱讀
    基于VxWorks的<b class='flag-5'>看門狗</b>定高效<b class='flag-5'>定時</b>機制設(shè)計實現(xiàn)

    TB3123 - PIC?單片機的窗口看門狗定時器

    窗口看門狗定時器(Windowed Watchdog Timer,WWDT)是PIC單片機的增強型看門狗定時器。該定時器是PIC單片機現(xiàn)有
    發(fā)表于 03-26 14:35 ?0次下載
    TB3123 - PIC?單片機的窗口<b class='flag-5'>看門狗</b><b class='flag-5'>定時器</b>

    什么是看門狗定時器?為何看門狗定時器如此重要?

    的MCU故障可能無意中使看門狗定時器喪失功用,因此整合看門狗可能不會總是按預(yù)期的方式運作。同樣地,雖然軟件以內(nèi)部看門狗能夠偵測所有凍結(jié)或停機的方式編寫,但是,采取額外的步驟以冗余方式監(jiān)
    的頭像 發(fā)表于 08-29 08:13 ?2.3w次閱讀
    什么是<b class='flag-5'>看門狗</b><b class='flag-5'>定時器</b>?為何<b class='flag-5'>看門狗</b><b class='flag-5'>定時器</b>如此重要?

    看門狗定時器的相關(guān)問題和實驗說明

    看門狗的作用: 看門狗定時器是一個計數(shù),基本功能是在發(fā)生軟件問題和程序跑飛后使系統(tǒng)重新啟動。看門狗計數(shù)
    的頭像 發(fā)表于 10-06 12:59 ?4463次閱讀
    <b class='flag-5'>看門狗</b><b class='flag-5'>定時器</b>的相關(guān)問題和實驗說明

    LPC2294看門狗定時器

    導(dǎo)致復(fù)位/中斷5.指示看門狗復(fù)位的標(biāo)志6.可編程的32位定時器與內(nèi)部預(yù)分頻。7.可選擇時間段,從(T PCLK x 256 x 4)到(TPCLK x 232 x4)應(yīng)用看門狗的目的是在微控制
    發(fā)表于 12-04 10:36 ?8次下載
    LPC2294<b class='flag-5'>看門狗</b><b class='flag-5'>定時器</b>

    使用高速微型看門狗定時器

    在惡劣環(huán)境中使用的高速微控制應(yīng)用的設(shè)計人員將使用看門狗定時器來防止軟件失控。DS80C320高速微控制集成了看門狗
    的頭像 發(fā)表于 02-09 11:54 ?841次閱讀

    內(nèi)部和外部看門狗定時器的比較

    本文比較了內(nèi)部(與微處理集成)和外部(基于硬件)看門狗定時器(WDT)的優(yōu)缺點。它解釋了內(nèi)部看門狗定時器易于實現(xiàn),但容易發(fā)生故障。MAXQ
    的頭像 發(fā)表于 04-03 11:15 ?2913次閱讀

    AXI時基看門狗定時器(WDT)概述

    XilinxLogiCORE IP AXI4-Lite時基看門狗定時器(WDT)是一個32位外設(shè),提供32位自由運行時基和看門狗定時器。
    的頭像 發(fā)表于 10-16 11:10 ?1096次閱讀
    AXI時基<b class='flag-5'>看門狗</b><b class='flag-5'>定時器</b>(WDT)概述