看门狗定时器
- NRF51822 的看门狗定时器是倒计数器, 当计数值减少到 0 时产生 TIMEOUT 事件。
- 通过 START task 来启动看门狗定时器。
- 看门狗定时器启动时,如没有其他 32.768KHz 时钟源提供时钟,看门狗定时器会强制打开 32.768KHz RC 振荡器。
- 默认情况下,看门狗定时器会在 CPU 睡眠期间,或是 debugger 将 CPU 暂停的时候保持运行。但是,可以通过配置看门狗定时器,使其在 CPU 睡眠期间,或是debugger 将 CPU 暂停的时候自动暂停。
- 看门狗定时器超时周期:timeout [s] = ( CRV + 1 ) / 32768。
使用的代码为nRF51_SDK_10.0.0_dc26b5e\examples\peripheral\wdt
/* Copyright (c) 2014 Nordic Semiconductor. All Rights Reserved. * * The information contained herein is property of Nordic Semiconductor ASA. * Terms and conditions of usage are described in detail in NORDIC * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. * * Licensees are granted free, non-transferable use of the information. NO * WARRANTY of ANY KIND is provided. This heading must NOT be removed from * the file. * */ /** @file * @defgroup nrf_dev_wdt_example_main main.c * @{ * @ingroup nrf_dev_wdt_example * @brief WDT Example Application main file. * * This file contains the source code for a sample application using WDT. * */ #include <stdbool.h> #include <stdint.h> #include "nrf.h" #include "bsp.h" #include "app_timer.h" #include "app_error.h" #include "nrf_drv_wdt.h" #include "nrf_drv_clock.h" #include "nrf_delay.h" #include "app_util_platform.h" #define APP_TIMER_PRESCALER 0 /**< Value of the RTC1 PRESCALER register. */ #define APP_TIMER_OP_QUEUE_SIZE 2 /**< Size of timer operation queues. */ #define FEED_BUTTON_ID 0 /**< Button for feeding the dog. */ nrf_drv_wdt_channel_id m_channel_id; /** * @brief WDT events handler. */ void wdt_event_handler(void) { LEDS_OFF(LEDS_MASK); //NOTE: The max amount of time we can spend in WDT interrupt is two cycles of 32768[Hz] clock - after that, reset occurs } /** * @brief Assert callback. */ void app_error_handler(uint32_t error_code, uint32_t line_num, const uint8_t * p_file_name) { LEDS_OFF(LEDS_MASK); ); } /** * @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; } } /** * @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(NULL); APP_ERROR_CHECK(err_code); nrf_drv_clock_lfclk_request(); APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false); err_code = bsp_init(BSP_INIT_BUTTONS, APP_TIMER_TICKS(, APP_TIMER_PRESCALER), bsp_event_callback); APP_ERROR_CHECK(err_code); //Configure all LEDs on board. LEDS_CONFIGURE(LEDS_MASK); LEDS_OFF(LEDS_MASK); //Indicate program start on LEDs. ; i < LEDS_NUMBER; i++) { nrf_delay_ms(); LEDS_ON(BSP_LED_0_MASK << i); } err_code = bsp_buttons_enable(); APP_ERROR_CHECK(err_code); //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(); ) { __SEV(); __WFE(); __WFE(); } } /** @} */
/** * @brief Function for setting the watchdog reload value. * * @param[in] reload_value Watchdog counter initial value. */ __STATIC_INLINE void nrf_wdt_reload_value_set(uint32_t reload_value) { NRF_WDT->CRV = reload_value; } ret_code_t nrf_drv_wdt_init(nrf_drv_wdt_config_t const * p_config, nrf_wdt_event_handler_t wdt_event_handler) { ASSERT(wdt_event_handler != NULL); m_wdt_event_handler = wdt_event_handler; if (m_state == NRF_DRV_STATE_UNINITIALIZED) { m_state = NRF_DRV_STATE_INITIALIZED; } else { return NRF_ERROR_INVALID_STATE; // WDT already initialized } if (p_config == NULL) { p_config = &m_default_config; } nrf_wdt_behaviour_set(p_config->behaviour); nrf_wdt_reload_value_set((p_config->reload_value * ) / ); nrf_drv_common_irq_enable(WDT_IRQn, p_config->interrupt_priority); return NRF_SUCCESS; }
CRV值是32768*2000/1000= 65536。
当把给WDT获得上述值(65536+1)/32768=2秒。