NRF52832学习笔记(31)——Watchdog看门狗使用

一、简介

看门狗定时器(WDT: Watchdog Timer)的作用是在发生软件故障时(如程序陷入死循环或者程序跑飞),强制复位单片机,让单片机重新运行程序。

看门狗定时器本质上是一个计数器,只不过这个计数器的作用是固定的,一旦计数值递增到设定的值(向上计数)或者计数值递减到0(向下计数),即“超时”时,看门狗定时器产生复位信号,复位系统。

程序正常运行时,会在看门狗定时器“超时”前清零计数值(向上计数)或重装计数值(向下计数),俗称“喂狗”,这样就保证了看门狗定时器永不会“超时”,而一旦程序运行出现故障,无法正常“喂狗”时,看门狗定时器最终会“超时”复位系统。

看门狗定时器超时周期取决于 CRV 寄存器中写入的重装计数值和看门狗定时器的时钟频率,计算公式如下:

二、移植文件

链接:https://pan.baidu.com/s/1Bt4K6EQRrtO8StMNkYsclw 提取码:mqo6
board_watchdog.cboard_watchdog.h 加入工程的Application文件夹下

2.1 board_watchdog.c

/*********************************************************************
 * INCLUDES
 */
#include "nrf_drv_wdt.h"

static void watchdogHandleEvent(void);

/*********************************************************************
 * LOCAL VARIABLES
 */
static nrf_drv_wdt_channel_id s_wdtChannelId;                       // 看门狗通道ID

/*********************************************************************
 * PUBLIC FUNCTIONS
 */
/**
 @brief 看门狗驱动初始化
 @param 无
 @return 无
*/
void Watchdog_Init(void)
{
    ret_code_t err_code;
    nrf_drv_wdt_config_t config = NRF_DRV_WDT_DEAFULT_CONFIG;       // 配置看门狗
    
    err_code = nrf_drv_wdt_init(&config, watchdogHandleEvent);      // 初始化看门狗和看门狗中断
    APP_ERROR_CHECK(err_code);
    
    err_code = nrf_drv_wdt_channel_alloc(&s_wdtChannelId);          // 分配看门狗通道
    APP_ERROR_CHECK(err_code);
    
    nrf_drv_wdt_enable();                                           // 看门狗使能
}
/**
 @brief 清除看门狗计数,“喂狗”
 @param 无
 @return 无
*/
void Watchdog_Clear(void)
{
    nrf_drv_wdt_channel_feed(s_wdtChannelId);
}


/*********************************************************************
 * LOCAL FUNCTIONS
 */
/**
 @brief 看门狗中断事件处理函数
 @param 无
 @return 无
*/
static void watchdogHandleEvent(void)
{
    // NOTE: The max amount of time we can spend in WDT interrupt is two cycles of 32768[Hz] clock - after that, reset occurs
}

/****************************************************END OF FILE****************************************************/

2.2 board_watchdog.h

#ifndef _BOARD_WATCHDOG_H_
#define _BOARD_WATCHDOG_H_

/*********************************************************************
 * INCLUDES
 */

/*********************************************************************
 * API FUNCTIONS
 */
void Watchdog_Init(void);
void Watchdog_Clear(void);

#endif /* _BOARD_WATCHDOG_H_ */

三、API调用

需包含头文件 board_watchdog.h

Watchdog_Init

功能 初始化软件看门狗
函数定义 void Watchdog_Init(void)
参数
返回

Watchdog_Clear

功能 清除看门狗计数,“喂狗”
函数定义 void Watchdog_clear(Watchdog_Handle handle)
参数
返回

四、SDK配置

点击 sdk_config.h 文件


选择 Configuration Wizard

nRF_Drivers 中勾选 WDT 相关选项

添加库函数文件

四、使用例子

1)添加头文件

#include "board_watchdog.h"

2)添加初始化代码

Watchdog_Init();

3)清除看门狗计数

Watchdog_Clear();        // 喂狗

4)看门狗中断处理
需要注意的是事件回调函数中不能加入过多的功能,因为 WDT 中断中可花费的最长时间只有 2 个 32.768KHz 时钟周期,之后系统就复位了。

static void watchdogHandleEvent(void)
{
    // NOTE: The max amount of time we can spend in WDT interrupt is two cycles of 32768[Hz] clock - after that, reset occurs
}

5)看门狗超时时间设置



• 由 Leung 写于 2020 年 10 月 10 日

• 参考:青风电子社区

你可能感兴趣的:(NRF52832学习笔记(31)——Watchdog看门狗使用)