陈拓 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
// <e> NRFX_WDT_ENABLED - nrfx_wdt - WDT 外设驱动
//==========================================================
#ifndef NRFX_WDT_ENABLED
#define NRFX_WDT_ENABLED 1
#endif
// <o> NRFX_WDT_CONFIG_BEHAVIOUR - CPU SLEEP或HALT模式下的WDT行为
// <1=> 在睡眠状态下运行,在挂起状态下暂停
// <8=> 在睡眠状态下暂停,在挂起状态下运行
// <9=> 在睡眠和挂起状态下运行
// <0=> 在睡眠和挂起状态下暂停
#ifndef NRFX_WDT_CONFIG_BEHAVIOUR
#define NRFX_WDT_CONFIG_BEHAVIOUR 0
#endif
// <o> NRFX_WDT_CONFIG_RELOAD_VALUE - 重新加载值(毫秒) ms <1-131072000>
#ifndef NRFX_WDT_CONFIG_RELOAD_VALUE
#define NRFX_WDT_CONFIG_RELOAD_VALUE 2000
#endif
// <o> 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
// <o> 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
// <e> NRFX_WDT_CONFIG_LOG_ENABLED - 启用模块中的日志记录。
//==========================================================
#ifndef NRFX_WDT_CONFIG_LOG_ENABLED
#define NRFX_WDT_CONFIG_LOG_ENABLED 0
#endif
// <o> 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
// <o> 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
// <o> 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 <hal/nrf_wdt.h>
$(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