一、简介
看门狗定时器(WDT: Watchdog Timer)的作用是在发生软件故障时(如程序陷入死循环或者程序跑飞),强制复位单片机,让单片机重新运行程序。
看门狗定时器本质上是一个计数器,只不过这个计数器的作用是固定的,一旦计数值递增到设定的值(向上计数)或者计数值递减到0(向下计数),即“超时”时,看门狗定时器产生复位信号,复位系统。
程序正常运行时,会在看门狗定时器“超时”前清零计数值(向上计数)或重装计数值(向下计数),俗称“喂狗”,这样就保证了看门狗定时器永不会“超时”,而一旦程序运行出现故障,无法正常“喂狗”时,看门狗定时器最终会“超时”复位系统。
看门狗定时器超时周期取决于 CRV 寄存器中写入的重装计数值和看门狗定时器的时钟频率,计算公式如下:
二、移植文件
链接:https://pan.baidu.com/s/1Bt4K6EQRrtO8StMNkYsclw 提取码:mqo6
将 board_watchdog.c 、 board_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 日
• 参考:青风电子社区
网友评论