全部文档
概述 硬件支持 快速开发指南 内核 驱动 通用组件 专业组件 常见问题

Watchdog设备用户开发指南

简介

本开发指南给用户提供了Watchdog的基本配置,工程构建编译、操作API介绍以及使用示例展示。

目录

配置指南

建立工程文件

以STM32为例,如果在提供的oneos源码中已经有适合的工程DEMO工程,则可以直接使用;如果没有请参照快速上手中的操作指南,新建一个适合的工程。

STM32CubeMX配置硬件

  1. 打开 oneos\projects\xxxxx(project文件夹)\board\CubeMX_Config下 的 CUBE 工程文件(xxx.ioc);
  2. 在 CUBE 工程中进行 Watchdog配置,主要使用独立看门狗,配置如下图所示,单击独立看门狗IWDG,勾选Activated,在Clock Configuration检查IWDG的时钟选择是否配置到位,最后点击④的GENARATE CODE 生成代码; cube_clock_generate
  3. 确认是否修改时钟配置,如有修改,则使用board\CubeMX_Config\Src文件夹中main.c的void SystemClock_Config(void)替换掉bsp.c中的void SystemClock_Config(void)函数。
  1. 在对应的 oneos\projects\xxxxx(project文件夹) 目录下打开OneOS-Cube工具,在命令行输入 menuconfig 打开可视化配置界面;
  2. 通过[↑]、[↓]按键、空格、enter键或向右方向键选择 Drivers->WDG 下的 Using watchdog drivers选项,如下所示:
(Top) → Drivers→ WDG
[*] Using watchdog drivers

3.Esc键退出menuconfig,注意保存所修改的设置。

Scons 构建工程

在上一步打开的OneOS-Cube 工具命令行中输入 scons --ide=mdk5重新构建keil工程;

工程编译及实现

  1. 打开对应的 oneos\projects\xxxxx(project文件夹) 目录下的 project.uvprojx 工程文件,此时即可在工程中添加相应的应用程序。

  2. 在打开的工程application 文件夹中右键选择Manage Project Items,按下图所示添加自己编写的或所提供的wdt_test.c文件(路径:oneos\demos\drivers\);

    cube_clock_generate

  3. 编译并下载工程,运行程序;

  4. 打开串口工具如xshell等,通信成功后,输入wdt_test命令,即可观察到代码在喂狗一段时间后停止喂狗会产生的复位现象。

  5. 如不再使用Watchdog设备,可再次使用OneOS-Cube工具取消,在Drivers-> WDG 下取消Using watchdog drivers选项的选择,保存设置后重新生成工程即可。

Watchdog API介绍

API 列表

应用程序通过系统提供的IO设备模型接口来访问Watchdog设备,接口如下:

函数 说明
os_device_find 根据Watchdog设备名称查找设备指针
os_device_open 打开Watchdog设备
os_device_control 控制Watchdog设备
os_device_close 关闭Watchdog设备

API 说明

os_device_find

该函数用于查找系统中已经注册的Watchdog设备,函数原型如下:

os_device_t *os_device_find(const char *name);
参数 说明
name Watchdog设备名称
返回 说明
设备指针 名为name的设备指针
OS_NULL 没有找到设备

os_device_open

打开Watchdog设备,函数原型如下:

os_err_t os_device_open(os_device_t *dev)
参数 说明
dev 设备指针
返回值 说明
OS_EOK 设备打开成功
其他错误码 设备打开失败

os_device_control

该函数发送控制命令以控制Watchdog设备,函数原型如下:

os_err_t os_device_control(os_device_t *dev, int cmd, void *arg)
参数 说明
dev 设备指针
cmd 控制命令
arg 可变参数
返回值 说明
OS_EOK 函数执行成功
OS_ENOSYS 函数执行失败,dev为空
其他错误码 函数执行失败

cmd控制命令取值如下

#define OS_DEVICE_CTRL_WDT_GET_TIMEOUT    (1) /* 获取溢出时间(秒) */
#define OS_DEVICE_CTRL_WDT_SET_TIMEOUT    (2) /* 设置溢出时间(秒) */
#define OS_DEVICE_CTRL_WDT_GET_TIMELEFT   (3) /* 获取剩余时间(秒) */
#define OS_DEVICE_CTRL_WDT_KEEPALIVE      (4) /* 喂狗 */
#define OS_DEVICE_CTRL_WDT_START          (5) /* 开启 */
#define OS_DEVICE_CTRL_WDT_STOP           (6) /* 关闭 */

os_device_close

该函数用于关闭Watchdog设备,需要同os_device_open配对使用,函数原型如下:

os_err_t os_device_close(os_device_t *dev)
参数 说明
dev 设备指针
返回值 说明
OS_EOK 设备关闭成功
其他错误码 设备关闭失败

使用示例

#include <os_task.h>
#include <device.h>
#include <os_errno.h>
#include <watchdog/watchdog.h>
#include <string.h>
#include <shell.h>

#define WDT_DEVICE_NAME "iwdg1"

static int wdg_test(int argc, char *argv[])
{
    os_err_t    ret     = OS_EOK;
    os_uint32_t timeout = 10;
    char        device_name[OS_NAME_MAX];
    int         count = 0;
    os_device_t *wdg_dev;

    if (argc == 2)
    {
        strncpy(device_name, argv[1], OS_NAME_MAX);
    }
    else
    {
        strncpy(device_name, WDT_DEVICE_NAME, OS_NAME_MAX);
    }

    wdg_dev = os_device_find(device_name);
    if (!wdg_dev)
    {
        os_kprintf("find %s failed!\r\n", device_name);
        return OS_ERROR;
    }

    ret = os_device_open(wdg_dev);
    if (ret != OS_EOK)
    {
        os_kprintf("initialize %s failed!\r\n", device_name);
        return OS_ERROR;
    }

    ret = os_device_control(wdg_dev, OS_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
    if (ret != OS_EOK)
    {
        os_kprintf("%s not support set timeout!\r\n", device_name);
    }

    ret = os_device_control(wdg_dev, OS_DEVICE_CTRL_WDT_START, OS_NULL);
    if (ret != OS_EOK)
    {
        os_kprintf("start %s failed!\r\n", device_name);
        return OS_ERROR;
    }

    os_device_control(wdg_dev, OS_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
    while (count < 11)
    {
        os_task_msleep(1000);
        count++;
        os_kprintf("watch dog keep alive for :%ds\r\n", count);
        os_device_control(wdg_dev, OS_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
    }
    count = 0;
    os_kprintf("\r\n");
    while (1)
    {
        os_kprintf("watch dog stop feed for :%d.%ds\r\n", count / 10, count % 10);
        os_task_msleep(100);
        count++;
    }
}

SH_CMD_EXPORT(wdg_test, wdg_test, "test Independent watchdog!");

运行结果如下:

sh>wdt_test
watch dog keep alive for :1s
watch dog keep alive for :2s
watch dog keep alive for :3s
watch dog keep alive for :4s
watch dog keep alive for :5s
watch dog keep alive for :6s
watch dog keep alive for :7s
watch dog keep alive for :8s
watch dog keep alive for :9s
watch dog keep alive for :10s
watch dog keep alive for :11s

watch dog stop feed for :0.0s
watch dog stop feed for :0.1s
watch dog stop feed for :0.2s
watch dog stop feed for :0.3s
watch dog stop feed for :0.4s
.... ...
watch dog stop feed for :10.0s

results matching ""

    No results matching ""