一、前言
看門狗定時器(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;
}
}