美文网首页物联网loT从业者
NRF52832学习笔记(31)——Watchdog看门狗使用

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

作者: Leung_ManWah | 来源:发表于2020-10-10 09:11 被阅读0次

    一、简介

    看门狗定时器(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看门狗使用

        本文链接:https://www.haomeiwen.com/subject/ukqlpktx.html