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

Clockevent设备用户开发


基础BSP配置--以STM32为例

建立工程文件

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

使用STM32CUBEMX配置硬件

  1. 打开 oneos\projects\xxxxx(project文件夹)\board\CubeMX_Config 下 的 CUBE 工程文件;
  2. 在 CUBE 工程中进行定时器配置,如下图所示,选中 Timer,配置工作模式、时钟源; adc_cube
  3. 点击 GENARATE CODE 生成代码;

使用 Menuconfig 配置工程选项

  1. 在对应的 oneos\projects\xxxxx(project文件夹) 目录下打开 OneOS-Cube 工具,在命令行输入 menuconfig 打开可视化配置界面;

  2. 如下图示,通过空格或向右方向键选择 Drivers->Timer 下的选项clockevent。 clockevent 依赖 clocksource 提供高精度时间戳。

(Top) → Drivers→ Timer
                                              OneOS Configuration
[*] Using timer driver
-*-     clocksource
[ ]         clocksource show
[ ]         Timekeeping
[*]     clockevent
[ ]         clockevent show
[ ]     hrtimer(soft timer)
        cortex-m hardware timer config  --->

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

使用 Scons 构建工程

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

工程编译及实现

  1. 打开对应的 oneos\projects\xxxxx(project文件夹) 目录下的 project.uvprojx 工程文件;
  2. 编译并下载工程,运行程序。

Clockevent设备


API 列表

函数 说明
os_device_find() 查找Clockevent设备
os_device_open() 打开Clockevent设备
os_device_close() 关闭Clockevent设备
os_clockevent_register_isr() 设置Clockevent设备超时中断函数
os_clockevent_start_oneshot() 单次触发方式启动Clockevent设备
os_clockevent_start_period() 周期触发方式启动Clockevent设备
os_clockevent_stop() 停止Clockevent设备

os_device_find

该函数根据 Clockevent设备名查找对应的 Clockevent设备,函数原型如下:

os_device_t *os_device_find(const char *name);
参数 说明
name 硬件clockevent设备名称
返回 说明
clockevent设备指针 查找到对应设备将返回相应的设备指针
OS_NULL 没有找到设备

os_device_open

该函数通过设备指针打开设备,第一次打开设备会调用设备初始化接口,函数原型如下:

os_err_t os_device_open(os_device_t *dev, os_uint16_t oflag);
参数 说明
dev 硬件clockevent设备指针
oflag 0
返回 说明
OS_EOK 设备打开成功
其他错误码 设备打开失败

os_device_close

该函数用于关闭Clockevent设备,函数原型如下:

os_err_t os_device_close(os_device_t *dev);
参数 说明
dev clockevent设备指针
返回 说明
OS_EOK 关闭设备成功
OS_ERROR 设备已经完全关闭,不能重复关闭设备
其他错误码 关闭设备失败

os_clockevent_register_isr

该函数用于设置Clockevent超时中断函数,当Clockevent超时将会调用,函数原型如下:

void os_clockevent_register_isr(os_clockevent_t *ce, void (*event_handler)(os_clockevent_t *ce));
参数 说明
ce clockevent设备指针
event_handler 超时中断函数
返回 说明

os_clockevent_start_oneshot

该函数用于单次触发方式启动Clockevent,函数原型如下:

void os_clockevent_start_oneshot(os_clockevent_t *ce, os_uint64_t nsec);
参数 说明
ce clockevent设备指针
nsec 定时事件,单位:纳秒
返回 说明

os_clockevent_start_period

该函数用于周期触发方式启动Clockevent,函数原型如下:

void os_clockevent_start_period(os_clockevent_t *ce, os_uint64_t nsec);
参数 说明
ce clockevent设备指针
nsec 定时事件,单位:纳秒
返回 说明

os_clockevent_stop

该函数用于停止Clockevent设备,函数原型如下:

void os_clockevent_stop(os_clockevent_t *ce);
参数 说明
ce clockevent设备指针
返回 说明

使用示例

Clockevent设备使用示例

硬件Clockevent设备的具体使用方式和步骤如下所示:

  1. 首先根据Clockevent设备名称tim15查找设备获取设备指针。
  2. 打开设备tim15。
  3. 设置Clockevent超时中断函数。
  4. 以单次触发模式启动Clockevent,超时时间为1秒,观察1秒后的中断回调。
  5. 以周期触发模式启动Clockevent,周期为1秒,中断回调每隔1秒触发一次。
#include <drv_cfg.h>
#include <device.h>
#include <os_errno.h>
#include <os_clock.h>
#include <stdlib.h>
#include <timer/clocksource.h>
#include <timer/clockevent.h>
#include <shell.h>
#include <dlog.h>
#define DBG_TAG "clockevent_test"


static int timeout_count = 0;
static int timeout_callback_print = 1;

static void timeout_callback(os_clockevent_t * ce)
{
    timeout_count++;

    if (timeout_callback_print)
    {
        LOG_I(DBG_TAG,"clockevent timeout callback");
    }
}

static int clockevent_test(int argc, char *argv[])
{
    int i;
    int ret;

    os_clockevent_t *ce;

    if (argc != 2)
    {
        LOG_W(DBG_TAG,"usage: clockevent_test <dev>");
        LOG_W(DBG_TAG,"       clockevent_test tim1");
        return -1;
    }

#ifndef DLOG_PRINT_LVL_I
    LOG_W(DBG_TAG, "DLOG_PRINT_LVL_I not defined");
#endif

#ifndef DLOG_USING_ISR_LOG
    LOG_W(DBG_TAG, "DLOG_USING_ISR_LOG not defined");
#endif

    ce = (os_clockevent_t *)os_device_find(argv[1]);
    if (ce == OS_NULL)
    {
        LOG_E(DBG_TAG,"invalid device %s", argv[1]);
        return -2;
    }

    ret = os_device_open((os_device_t *)ce);
    if (ret != OS_EOK)
    {
        LOG_E(DBG_TAG,"device %s open failed:%d", argv[1], ret);
        return -3;
    }

    os_task_t *self = os_task_self();
    os_uint8_t task_prio = self->current_priority;
    os_uint8_t high_prio = 1;
    os_task_set_priority(self,high_prio);

    os_clockevent_register_isr(ce, timeout_callback);

    /* sync tick */
    os_task_msleep(1);

    /* 1.oneshot mode */
    for (i = 0; i < 3; i++)
    {
        LOG_I(DBG_TAG,"clockevent onshot start %d", i);        
        os_clockevent_start_oneshot(ce, NSEC_PER_SEC);
        os_task_msleep(2000);
    }

    LOG_I(DBG_TAG,"clockevent onshot before stop.");

    os_clockevent_stop(ce);
    os_task_msleep(2000);

    LOG_I(DBG_TAG,"clockevent onshot after stop.");

    /* 2.period mode */
    LOG_I(DBG_TAG,"clockevent period start...");    
    os_clockevent_start_period(ce, NSEC_PER_SEC);
    os_task_msleep(10300);

    LOG_I(DBG_TAG,"clockevent period before stop.");

    os_clockevent_stop(ce);
    os_task_msleep(2000);

    LOG_I(DBG_TAG,"clockevent period after stop.");

    os_device_close((os_device_t *)ce);

    os_task_set_priority(self,task_prio);

    return 0;
}

SH_CMD_EXPORT(clockevent_test, clockevent_test, "clockevent_test");

运行结果如下:

sh>clockevent_test tim15
[639] I/clockevent_test: clockevent onshot start 0 [clockevent_test][98]
[739] I/clockevent_test: clockevent timeout callback [timeout_callback][45]
[839] I/clockevent_test: clockevent onshot start 1 [clockevent_test][98]
[939] I/clockevent_test: clockevent timeout callback [timeout_callback][45]
[1039] I/clockevent_test: clockevent onshot start 2 [clockevent_test][98]
[1139] I/clockevent_test: clockevent timeout callback [timeout_callback][45]
[1239] I/clockevent_test: clockevent onshot before stop. [clockevent_test][103]
[1439] I/clockevent_test: clockevent onshot after stop. [clockevent_test][108]
[1439] I/clockevent_test: clockevent period start... [clockevent_test][111]
[1539] I/clockevent_test: clockevent timeout callback [timeout_callback][45]
[1639] I/clockevent_test: clockevent timeout callback [timeout_callback][45]
[1739] I/clockevent_test: clockevent timeout callback [timeout_callback][45]
[1839] I/clockevent_test: clockevent timeout callback [timeout_callback][45]
[1939] I/clockevent_test: clockevent timeout callback [timeout_callback][45]
[2039] I/clockevent_test: clockevent timeout callback [timeout_callback][45]
[2139] I/clockevent_test: clockevent timeout callback [timeout_callback][45]
[2239] I/clockevent_test: clockevent timeout callback [timeout_callback][45]
[2339] I/clockevent_test: clockevent timeout callback [timeout_callback][45]
[2439] I/clockevent_test: clockevent timeout callback [timeout_callback][45]
[2469] I/clockevent_test: clockevent period before stop. [clockevent_test][115]
sh>[2669] I/clockevent_test: clockevent period after stop. [clockevent_test][120]

results matching ""

    No results matching ""