Nordic52810入門篇-WDT看門狗定時器

一、前言

看門狗定時器(WDT,Watch Dog Timer)是Nordic52810的一個獨立的模塊,使用低速時鐘源(LFCLK),通過START任務進行觸發,但預設的自減計數器運行到0時,產生超時時間復位系統

百度百科
ps:如有錯誤,請留言指正,謝謝

二、功能詳解

  • 看門狗通過開始START任務啓動,可以在CPU睡眠與debugger下被暫停(可配置)
  • 餵狗後,計數值會從CRV寄存器加載超時計數
  • 超時公式 timeout[s] = (CRV+1)/32768
  • 看門狗啓動後,會自動啓用32.768kHz RC振盪器
  • 看門狗有8個獨立的請求重載寄存器,寫入特定值0x6E524635進行請求計數器重載
  • 當使能看門狗中斷後,系統會在事件生成後的兩個時鐘週期後(32.768kHZ)進行復位

三、寄存器

  • INTENSET:中斷使能寄存器,寫1有效(可讀)
  • INTENCLR:中斷禁用寄存器,寫1有效(可讀)
  • RUNSTATUS:運行狀態寄存器,只讀,0 未運行 1 運行狀態
  • REQSTATUS:請求狀態寄存器,查詢RR寄存器是否被請求裝載
  • CRV:設置看門狗計算器值
  • RREN:RR使能寄存器,總共可配置8路
  • CONFIG:配置寄存器,配置系統睡眠(SLEEP)或停機(HALT)模式下是否運行看門狗
  • RR:裝載請求寄存器,進行餵狗

四、相關接口

WDT的驅動目錄在modules\nrfx\drivers\src\nrfx_wdt.c

  • nrfx_wdt_init:初始化看門狗,通過形參p_config設置運行模式與超時時間,wdt_event_handler設置中斷入口
  • nrfx_wdt_channel_alloc:通道ID設置,形參獲取到看門狗句柄
  • nrf_drv_wdt_enable:使能看門狗
  • nrf_drv_wdt_channel_feed:餵狗,請求重載

五、實例代碼

  • 實例工程目錄爲 examples\peripheral\wdt wdt.eww

在sdk_config.h中設置重載超時時間
#ifndef NRFX_WDT_CONFIG_RELOAD_VALUE
#define NRFX_WDT_CONFIG_RELOAD_VALUE 2000//2s
#endif

/**
 * @brief Function for main application entry.
 */
int main(void)
{
    uint32_t err_code = NRF_SUCCESS;

    //BSP configuration for button support: button pushing will feed the dog.
    err_code = nrf_drv_clock_init();
    APP_ERROR_CHECK(err_code);
    nrf_drv_clock_lfclk_request(NULL);

    err_code = app_timer_init();
    APP_ERROR_CHECK(err_code);

    err_code = bsp_init(BSP_INIT_BUTTONS, bsp_event_callback);
    APP_ERROR_CHECK(err_code);

    //Configure all LEDs on board.
    bsp_board_init(BSP_INIT_LEDS);

    //Configure WDT.
    nrf_drv_wdt_config_t config = NRF_DRV_WDT_DEAFULT_CONFIG;
    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);//初始化看門狗
    APP_ERROR_CHECK(err_code);
    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);//獲取可用通道
    APP_ERROR_CHECK(err_code);
    nrf_drv_wdt_enable();//使能

    //Indicate program start on LEDs.
    for (uint32_t i = 0; i < LEDS_NUMBER; i++)
    {   nrf_delay_ms(200);
        bsp_board_led_on(i);
    }
     err_code = bsp_buttons_enable();
     APP_ERROR_CHECK(err_code);

    while (1)
    {
        __SEV();
        __WFE();
        __WFE();
    }
}

獲取到按鍵事件後,進行餵狗

/**
 * @brief BSP events callback.
 */
void bsp_event_callback(bsp_event_t event)
{
    switch (event)
    {
        case BSP_EVENT_KEY_0:
            nrf_drv_wdt_channel_feed(m_channel_id);
            break;

        default :
            //Do nothing.
            break;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章