陈拓 2022/10/29-2022/10/31
《WSL构建nRF5 SDK + ARM GCC开发环境》
https://blog.csdn.net/chentuo2000/article/details/125933307?spm=1001.2014.3001.5502
《WSL构建nRF5 SDK + ARM GCC开发环境 – RTT打印调试日志》
https://blog.csdn.net/chentuo2000/article/details/126104346?spm=1001.2014.3001.5502
看门狗启动后,若芯片外部没有焊接32.768kHz的晶体,芯片会自动启动内部RC振荡器。
timeout [s] = ( CRV + 1 ) / 32768
~/nrf/nRF5_SDK_17.1.0_ddde560/examples/peripheral/wdt/pca10040/blank/config/sdk_config.h
- //
NRFX_WDT_ENABLED - nrfx_wdt - WDT 外设驱动 - //==========================================================
- #ifndef NRFX_WDT_ENABLED
- #define NRFX_WDT_ENABLED 1
- #endif
- //
NRFX_WDT_CONFIG_BEHAVIOUR - CPU SLEEP或HALT模式下的WDT行为 - // <1=> 在睡眠状态下运行,在挂起状态下暂停
- // <8=> 在睡眠状态下暂停,在挂起状态下运行
- // <9=> 在睡眠和挂起状态下运行
- // <0=> 在睡眠和挂起状态下暂停
-
- #ifndef NRFX_WDT_CONFIG_BEHAVIOUR
- #define NRFX_WDT_CONFIG_BEHAVIOUR 0
- #endif
-
- //
NRFX_WDT_CONFIG_RELOAD_VALUE - 重新加载值(毫秒) ms <1-131072000> -
- #ifndef NRFX_WDT_CONFIG_RELOAD_VALUE
- #define NRFX_WDT_CONFIG_RELOAD_VALUE 2000
- #endif
-
- //
NRFX_WDT_CONFIG_NO_IRQ - 从WDT驱动中删除WDT IRQ处理 -
- // <0=> 包括WDT IRQ中断处理
- // <1=> 删除WDT IRQ中断处理
-
- #ifndef NRFX_WDT_CONFIG_NO_IRQ
- #define NRFX_WDT_CONFIG_NO_IRQ 0
- #endif
-
- //
NRFX_WDT_CONFIG_IRQ_PRIORITY - 中断优先级 -
- // <0=> 0 (highest)
- // <1=> 1
- // <2=> 2
- // <3=> 3
- // <4=> 4
- // <5=> 5
- // <6=> 6
- // <7=> 7
-
- #ifndef NRFX_WDT_CONFIG_IRQ_PRIORITY
- #define NRFX_WDT_CONFIG_IRQ_PRIORITY 6
- #endif
-
- //
NRFX_WDT_CONFIG_LOG_ENABLED - 启用模块中的日志记录。 - //==========================================================
- #ifndef NRFX_WDT_CONFIG_LOG_ENABLED
- #define NRFX_WDT_CONFIG_LOG_ENABLED 0
- #endif
- //
NRFX_WDT_CONFIG_LOG_LEVEL - 默认日志级别 -
- // <0=> Off
- // <1=> Error
- // <2=> Warning
- // <3=> Info
- // <4=> Debug
-
- #ifndef NRFX_WDT_CONFIG_LOG_LEVEL
- #define NRFX_WDT_CONFIG_LOG_LEVEL 3
- #endif
-
- //
NRFX_WDT_CONFIG_INFO_COLOR - ANSI转义代码前缀。 -
- // <0=> Default
- // <1=> Black
- // <2=> Red
- // <3=> Green
- // <4=> Yellow
- // <5=> Blue
- // <6=> Magenta
- // <7=> Cyan
- // <8=> White
-
- #ifndef NRFX_WDT_CONFIG_INFO_COLOR
- #define NRFX_WDT_CONFIG_INFO_COLOR 0
- #endif
-
- //
NRFX_WDT_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -
- // <0=> Default
- // <1=> Black
- // <2=> Red
- // <3=> Green
- // <4=> Yellow
- // <5=> Blue
- // <6=> Magenta
- // <7=> Cyan
- // <8=> White
-
- #ifndef NRFX_WDT_CONFIG_DEBUG_COLOR
- #define NRFX_WDT_CONFIG_DEBUG_COLOR 0
- #endif
- #include "nrf_drv_wdt.h"
- #include "nrf_drv_clock.h"
在nrfx_wdt.h中有头文件nrf_wdt.h的引用:
#include
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_wdt.c \
- //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();
看门狗计数器溢出时触发。
- /**
- * @brief WDT events handler.
- */
- void wdt_event_handler(void)
- {
- bsp_board_leds_off();
-
- //NOTE: The max amount of time we can spend in WDT interrupt is two cycles of 32768[Hz] clock - after that, reset occurs
- }
在BSP事件触发回调处理函数中:
- nrf_drv_wdt_channel_id m_channel_id;
-
- /**
- * @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;
- }
- }
- err_code = bsp_init(BSP_INIT_BUTTONS, bsp_event_callback);
- APP_ERROR_CHECK(err_code);
可以在初始化时修改某些sdk_config.h的设置。
- //Configure WDT.
- NRF_LOG_DEBUG("main Configure WDT.");
- nrf_drv_wdt_config_t config = {
- .behaviour = NRF_WDT_BEHAVIOUR_PAUSE_SLEEP_HALT,
- .reload_value = 60000,
- .interrupt_priority = 7,
- };
- nrf_drv_wdt_config_t wdt_config = config;
- err_code = nrf_drv_wdt_init(&wdt_config, NULL);
- APP_ERROR_CHECK(err_code);
- err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
- APP_ERROR_CHECK(err_code);
- nrf_drv_wdt_enable();
其中:
NULL表示不使用事件触发回调处理函数。
在nrf_wdt.h中定义:
- /** @brief WDT behavior in the SLEEP or HALT CPU modes. */
- typedef enum
- {
- NRF_WDT_BEHAVIOUR_RUN_SLEEP = WDT_CONFIG_SLEEP_Msk, /**< WDT will run when CPU is in SLEEP mode. */
- NRF_WDT_BEHAVIOUR_RUN_HALT = WDT_CONFIG_HALT_Msk, /**< WDT will run when CPU is in HALT mode. */
- NRF_WDT_BEHAVIOUR_RUN_SLEEP_HALT = WDT_CONFIG_SLEEP_Msk | WDT_CONFIG_HALT_Msk, /**< WDT will run when CPU is in SLEEP or HALT mode. */
- NRF_WDT_BEHAVIOUR_PAUSE_SLEEP_HALT = 0, /**< WDT will be paused when CPU is in SLEEP or HALT mode. */
- } nrf_wdt_behaviour_t;
在主循环中喂狗
- NRF_LOG_INFO("main loop..........");
- for (;;) {
- nrf_drv_wdt_channel_feed(m_channel_id);
nRF52832 Product Specification v1.3