对于不同底层驱动的timer操作实现,统一封装成本文所述hal timer接口。 hal相关头文件位于目录:include/aos/hal。hal相关实现位于具体的mcu目录下,如:platform/mcu/stm32f1xx/hal/。

API列表

hal_timer_init 初始化指定TIMER
hal_timer_start 启动指定的TIMER
hal_timer_stop 停止指定的TIMER
hal_timer_para_chg 改变指定TIMER的参数
hal_timer_finalize 关闭指定TIMER

API详情

请参考include/aos/hal/timer.h

相关宏定义

#define TIMER_RELOAD_AUTO  1 /* timer reload automatic */
#define TIMER_RELOAD_MANU  2 /* timer reload manual */

相关结数据结构

timer_dev_t

typedef struct {
    int8_t         port;   /* timer port */
    timer_config_t config; /* timer config */
    void          *priv;   /* priv data */
} timer_dev_t;

timer_config_t

typedef struct {
    uint32_t       period; /* us */
    uint8_t        reload_mode;
    hal_timer_cb_t cb;
    void          *arg;
} timer_config_t;

hal_timer_cb_t

typedef void (*hal_timer_cb_t)(void *arg);

hal_timer_init

初始化指定TIMER

函数原型

int32_t hal_timer_init(timer_dev_t *tim);

参数

timer_dev_t *tim 入参 TIMER设备描述,定义需要初始化的TIMER参数 用户自定义一个timer_dev_t结构体

返回值

返回成功或失败, 返回0表示TIMER初始化成功,非0表示失败

调用示例

#define TIMER1_PORT_NUM 1
/* define dev */
timer_dev_t timer1;
/* timer port set */
timer1.port = TIMER1_PORT_NUM;
/* timer attr config */
timer1.config.period         = 1000000; /* 1s */
timer1.config.reload_mode    = TIMER_RELOAD_AUTO;
timer1.config.cb             = timer_handler;
/* init timer1 with the given settings */
ret = hal_timer_init(&timer1);

hal_timer_start

启动指定的TIMER

函数原型

int32_t hal_timer_start(timer_dev_t *tim);

参数

timer_dev_t *tim 入参 TIMER设备描述 使用hal_timer_init时传入timer_dev_t结构体

返回值

返回成功或失败, 返回0表示TIMER启动成功,非0表示失败

调用示例

ret = hal_timer_start(&timer1);

hal_timer_stop

停止指定的TIMER

函数原型

int32_t hal_timer_stop(timer_dev_t *tim);

参数

timer_dev_t *tim 入参 TIMER设备描述 使用hal_timer_init时传入timer_dev_t结构体

返回值

返回成功或失败, 返回0表示TIMER停止成功,非0表示失败

调用示例

ret = hal_timer_stop(&timer1);

hal_timer_para_chg

改变指定TIMER的参数

函数原型

int32_t hal_timer_para_chg(timer_dev_t *tim, timer_config_t para);

参数

timer_dev_t *tim 入参 TIMER设备描述 使用hal_timer_init时传入timer_dev_t结构体
timer_config_t para 入参 新TIMER配置信息 {2000000}

返回值

返回成功或失败, 返回0表示TIMER参数改变成功,非0表示失败

调用示例

timer_config_t timer_cfg;
memset(&timer_cfg, 0, sizeof(timer_config_t));
timer_cfg.period = 2000000;
ret = hal_timer_para_chg(&timer1, timer_cfg);

hal_timer_finalize

关闭指定TIMER

函数原型

int32_t hal_timer_finalize(timer_dev_t *tim);

参数

timer_dev_t *tim 入参 TIMER设备描述 使用hal_timer_init时传入timer_dev_t结构体

返回值

返回成功或失败, 返回0表示TIMER关闭成功,非0表示失败

调用示例

ret = hal_timer_finalize(&timer1);

使用

添加该组件

在相应的platform/mcu的mk内,添加对应hal文件的编译包含。

包含头文件

#include "aos/hal/timer.h"

使用示例

#include <aos/hal/timer.h>

#define TIMER1_PORT_NUM 1

/* define dev */
timer_dev_t timer1;

void timer_handler(void *arg)
{
    static int timer_cnt = 0;

    printf("timer_handler: %d times !\n", timer_cnt++);
}

int application_start(int argc, char *argv[])
{
    int ret = -1;
    timer_config_t timer_cfg;
    static int count = 0;

    /* timer port set */
    timer1.port = TIMER1_PORT_NUM;

    /* timer attr config */
    timer1.config.period         = 1000000; /* 1s */
    timer1.config.reload_mode    = TIMER_RELOAD_AUTO;
    timer1.config.cb             = timer_handler;

    /* init timer1 with the given settings */
    ret = hal_timer_init(&timer1);
    if (ret != 0) {
        printf("timer1 init error !\n");
    }

    /* start timer1 */
    ret = hal_timer_start(&timer1);
    if (ret != 0) {
        printf("timer1 start error !\n");
    }

    while(1) {

        /* change the period to 2s */
        if (count == 5) {
            memset(&timer_cfg, 0, sizeof(timer_config_t));
            timer_cfg.period = 2000000;

            ret = hal_timer_para_chg(&timer1, timer_cfg);
            if (ret != 0) {
                printf("timer1 para change error !\n");
            }
        }

        /* stop and finalize timer1 */
        if (count == 20) {
            hal_timer_stop(&timer1);
            hal_timer_finalize(&timer1);
        }

        /* sleep 1000ms */
        aos_msleep(1000);
        count++;
    };
}

注:port为逻辑端口号,其与物理端口号的对应关系见具体的对接实现

移植说明

新建hal_timer_xxmcu.c和hal_timer_xxmcu.h的文件,并将这两个文件放到platform/mcu/xxmcu/hal目录下。在hal_timer_xxmcu.c中实现所需要的hal函数,hal_timer_xxmcu.h中放置相关宏定义。 参考platform/mcu/stm32l4xx/src/STM32L496G-Discovery/hal/hal_timer_stm32l4.c