rtthread studio与正点原子apollo(6)--watchdog设备


前言

本文介绍RT-Thread中看门狗定时器的使用。


一、watchdog简介

看门狗(watchdog timer)本质是一个定时器,可以作为系统复位的触发源,通常用于嵌入式系统运行异常时自动复位。
看门狗的工作原理:当启动看门狗功能后,看门狗计数器会自动+1计数,计数值不断与设定值比较,通常在计数值溢出前由软件自动清除计数值,保证看门狗不会产生溢出中断;当系统出现异常,计数值不能及时清零引起中断,继而向CPU申请复位。因此,在系统正常运行时需要定时将计数值清零(“喂狗”)。

二、访问watchdog设备

看门狗设备的访问及相关API函数参考官方文档
访问watchdog设备

RT-Thread中访问watchdog设备的步骤:
(1)查找watchdog设备

#define WDT_DEVICE_NAME    "wdt"    /* 看门狗设备名称 */

static rt_device_t wdg_dev;         /* 看门狗设备句柄 */
/* 根据设备名称查找看门狗设备,获取设备句柄 */
wdg_dev = rt_device_find(WDT_DEVICE_NAME);

(2)初始化看门狗

/* 初始化设备 */
rt_device_init(wdg_dev);

(3)控制看门狗

rt_uint32_t timeout = 1;       /* 溢出时间,单位:秒*/

/* 设置看门狗溢出时间 */
rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);

(4)喂狗,以空闲线程钩子中实现为例

/* 设置空闲线程回调函数 */
rt_thread_idle_sethook(idle_hook);

static void idle_hook(void)
{
    /* 在空闲线程的回调函数里喂狗 */
    rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
}

也可以通过定时器中断函数喂狗,比空闲线程钩子更加精确。空闲线程钩子函数的使用必须确保进入钩子函数的时间小于看门狗喂狗时间
(5)关闭看门狗

/* 关闭看门狗 */
rt_device_close(wdg_dev);
}

三、看门狗设备使用举例

1.看门狗配置过程

(1)在RT-Thread studio中创建工程,并启动看门狗设备
在这里插入图片描述
(2)打开stm32f7xx_hal_conf.h,确保开启看门狗功能
在这里插入图片描述

2.看门狗完整例程

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

#define LED0 GET_PIN(B,0)
#define WDT_DEVICE_NAME "wdt"//定义看门狗设备名
static rt_device_t wdg_dev;//定义看门狗设备句柄

static void idle_hook(void)//空闲钩子函数
{
    rt_device_control(wdg_dev,RT_DEVICE_CTRL_WDT_KEEPALIVE,NULL);//喂狗
    rt_kprintf("feed the dog!\n ");
}

static int wdt_sample(void)
{
    rt_err_t ret=RT_EOK;
    rt_uint32_t timeout=5;//看门狗溢出时间

    wdg_dev=rt_device_find(WDT_DEVICE_NAME);//查找看门狗设备
    if(!wdg_dev)
    {
        rt_kprintf("find %s failed!\n", WDT_DEVICE_NAME);
        return RT_ERROR;
    }
    ret = rt_device_init(wdg_dev);//初始化看门狗
    if (ret != RT_EOK)
    {
        rt_kprintf("initialize %s failed!\n", WDT_DEVICE_NAME);
        return RT_ERROR;
    }
    ret=rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);//设置看门狗喂狗溢出时间
    if(ret!=RT_EOK)
    {
        return RT_ERROR;
    }
    ret=rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);//启动看门狗
    if(ret!=RT_EOK)
    {
        return -RT_ERROR;
    }
    rt_thread_idle_sethook(idle_hook);//启动空闲钩子函数
    return ret;
}

int main(void)
{

    wdt_sample();
    rt_pin_mode(LED0, PIN_MODE_OUTPUT);
    while (1)
    {
        rt_pin_write(LED0, PIN_HIGH);
        rt_thread_mdelay(1000);
        rt_pin_write(LED0, PIN_LOW);
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}


总结

看门狗设备的使用相对比较简单,其本质是定时器,在系统异常需要自动重启时,看门狗非常有用。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值