一、背景
- 如果在一定的时间内没有通过“喂狗”来清除看门狗的 counter,则看门狗会产生一个复位,使程序重启。
- 看门狗一旦开启,就不能停下来。
二、移植文件
链接:https://pan.baidu.com/s/1UIKVjKZUo5P9vHZ3zgvdkQ 提取码:p0r0
将 board_watchdog.c 和 board_watchdog.h 两个文件拖拽至CCS工程的Application文件夹下
添加文件过程中,选项选择如下
2.1 board_watchdog.c
/*********************************************************************
* INCLUDES
*/
#include "board.h"
#include "board_watchdog.h"
/*********************************************************************
* GLOBAL VARIABLES
*/
Watchdog_Handle g_watchdogHandle;
/*********************************************************************
* LOCAL FUNCTIONS
*/
/**
@brief 软件看门狗的定时回调函数
@param none
@return none
*/
void watchdogCallback(uintptr_t handle)
{
Watchdog_clear(g_watchdogHandle); // 喂狗
}
/*********************************************************************
* PUBLIC FUNCTIONS
*/
/**
@brief 软件看门狗的初始化函数
@param none
@return none
*/
void Watchdog_Init(void)
{
Watchdog_Params params;
Watchdog_init();
Watchdog_Params_init(¶ms);
params.callbackFxn = (Watchdog_Callback) watchdogCallback;
params.debugStallMode = Watchdog_DEBUG_STALL_ON;
params.resetMode = Watchdog_RESET_ON;
g_watchdogHandle = Watchdog_open(Board_WATCHDOG0, ¶ms);
if(g_watchdogHandle == NULL)
{
/* Error opening Watchdog */
while (1) {}
}
Watchdog_setReload(g_watchdogHandle, 1500000); // 1sec (WDT runs always at 48MHz/32)
}
/*************************************END OF FILE*************************************/
2.2 board_watchdog.h
#ifndef _BOARD_WATCHDOG_H_
#define _BOARD_WATCHDOG_H_
/*********************************************************************
* EXTERN VARIABLES
*/
extern Watchdog_Handle g_watchdogHandle;
/*********************************************************************
* API FUNCTIONS
*/
void Watchdog_Init(void);
#endif /* _BOARD_WATCHDOG_H_ */
三、API调用
需包含头文件 board_watchdog.h
Watchdog_Init
功能 | 初始化软件看门狗 |
---|---|
函数定义 | void Watchdog_Init(void) |
参数 | 无 |
返回 | 无 |
Watchdog_clear
功能 | 清除看门狗计数,“喂狗” |
---|---|
函数定义 | void Watchdog_clear(Watchdog_Handle handle) |
参数 | Watchdog_Handle:看门狗句柄 |
返回 | 无 |
四、使用例子
1)添加头文件(例multi_role.c中)
#include "board_watchdog.h"
2)添加初始化代码(multi_role.c的multi_role_init函数末尾中)
Watchdog_Init();
3)清除看门狗计数
① 在软件看门狗的定时回调函数watchdogCallback中
/**
@brief 软件看门狗的定时回调函数 @param none
@return none
*/
void watchdogCallback(uintptr_t handle)
{
Watchdog_clear((Watchdog_Handle)handle); // 喂狗
}
② 在其他地方,添加清除看门狗计数函数
Watchdog_clear((Watchdog_Handle)handle); // 喂狗
4)看门狗超时时间设置
在Watchdog_Init看门狗初始化函数中
Watchdog_setReload(g_watchdogHandle, 1500000); // 1sec (WDT runs always at 48MHz/32)
计算看门狗超时时间的时候,需要除以32,也就是48MHZ除以32等于1.5MHZ,看门狗运行在1.5MHZ的频率上,也就是每计数一次等于1/1500000秒的时间,所以要实现1s超时时间,需要计数1500000次。
• 由 Leung 写于 2019 年 3 月 20 日