CC2640R2F学习笔记(8)——Watchdog看门狗使用

一、背景

  1. 如果在一定的时间内没有通过“喂狗”来清除看门狗的 counter,则看门狗会产生一个复位,使程序重启。
  2. 看门狗一旦开启,就不能停下来。

二、移植文件

链接:https://pan.baidu.com/s/1UIKVjKZUo5P9vHZ3zgvdkQ 提取码:p0r0
board_watchdog.cboard_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(&params);
    params.callbackFxn    = (Watchdog_Callback) watchdogCallback;
    params.debugStallMode = Watchdog_DEBUG_STALL_ON;
    params.resetMode      = Watchdog_RESET_ON;

    g_watchdogHandle = Watchdog_open(Board_WATCHDOG0, &params);
    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 日

• 参考:CC2640之看门狗
    【BLE】CC2541之看门狗

猜你喜欢

转载自blog.csdn.net/qq_36347513/article/details/88695341