1.8. GPTIMER

gptimer支持计数、延时、定时、PWM、捕获。捕获模式支持滤波,双边沿触发

1.8.1. gptimer_init

timer模块初始化。

原型:

u32 gptimer_init(const timer_dev timerx, const struct gptimer_config *gt_cfg);

参数:

gptimer

timer配置

返回值

tiemr句柄(id号)

1.8.2. gptimer_deinit

timer模块释放。

原型:

u32 gptimer_deinit(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

0

1.8.3. gptimer_start

timer/pwm/capture功能启动。

原型:

u32 gptimer_start(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

0

1.8.4. gptimer_pause

timer/pwm/capture功能暂停。

原型:

u32 gptimer_pause(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

0

1.8.5. gptimer_resume

timer/pwm/capture功能恢复。

原型:

u32 gptimer_resume(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

保留

1.8.6. gptimer_set_timer_period

设置timer功能定时时间,单位us。

原型:

u32 gptimer_set_timer_period(u32 tid, u32 period_us);

参数:

tid

init时返回的句柄(id号)

us

定时时间,单位:us

返回值

0

1.8.7. gptimer_get_timer_period

获取timer功能定时时间,单位us。

原型:

u32 gptimer_get_timer_period(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

定时时间,单位:us

1.8.8. gptimer_set_pwm_freq

设置pwm功能输出频率,单位Hz。

原型:

u32 gptimer_set_pwm_freq(u32 tid, u32 freq);

参数:

tid

init时返回的句柄(id号)

freq

输出频率,单位:Hz

返回值

0

1.8.9. gptimer_get_pwm_freq

获取pwm功能输出频率,单位Hz。

原型:

u32 gptimer_get_pwm_freq(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

输出频率,单位:Hz

1.8.10. gptimer_set_pwm_duty

设置pwm功能输出占空比。

原型:

u32 gptimer_set_pwm_duty(u32 tid, u32 duty);

参数:

tid

init时返回的句柄(id号)

duty

占空比,例:5123,占空比51.23%

返回值

0

1.8.11. gptimer_get_pwm_duty

获取pwm功能输出占空比。

原型:

u32 gptimer_get_pwm_duty(u32 tid);

参数:

tid

init时返回的句柄(id号)

duty

占空比,例:5123,占空比51.23%

1.8.12. gptimer_pwm_flip

翻转pwm输出。

原型:

u32 gptimer_pwm_flip(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

0

1.8.13. gptimer_pwm_enable

pwm输出使能。

原型:

u32 gptimer_pwm_enable(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

0

1.8.14. gptimer_pwm_disable

pwm输出关闭。

原型:

u32 gptimer_pwm_disable(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

0

1.8.15. gptimer_set_capture_edge_type

设置capture功能捕获边沿,边沿类型:上升沿、下降沿、双边沿。

原型:

u32 gptimer_set_capture_edge_type(u32 tid, enum gptimer_mode edge_type);

参数:

tid

init时返回的句柄(id号)

edge_type

边沿类型

返回值

0

1.8.16. gptimer_get_capture_edge_type

获取capture功能捕获边沿。

原型:

enum gptimer_mode gptimer_get_capture_edge_type(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

边沿类型:上升沿、下降沿、双边沿

1.8.17. gptimer_set_irq_callback

设置回调函数。

原型:

u32 gptimer_set_irq_callback(u32 tid, void (*irq_cb)(u32 tid, void *private_data));

参数:

tid

init时返回的句柄(id号)

irq_cb

回调函数

返回值

0

1.8.18. gptimer_get_work_mode

获取当前工作模式。

原型:

enum gptimer_mode gptimer_get_work_mode(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

工作模式

1.8.19. gptimer_set_work_mode

设置工作模式。

原型:

u32 gptimer_set_work_mode(u32 tid, enum gptimer_mode type);

参数:

tid

init时返回的句柄(id号)

type

工作模式

返回值

0

1.8.20. gptimer_set_capture_filter

设置capture功能滤波参数。小于滤波参数的波被过滤。

原型:

u32 gptimer_set_capture_filter(u32 tid, u32 filter);

参数:

tid

init时返回的句柄(id号)

filter_us

滤波参数,单位:us。

1.8.21. gptimer_get_capture_filter

获取capture功能滤波时间。

原型:

u32 gptimer_get_capture_filter(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

滤波参数,单位:us。

1.8.22. gptimer_set_capture_count

设置capture功能count计数器的原始值。

原型:

u32 gptimer_set_capture_count(u32 tid, u32 cnt);

参数:

tid

init时返回的句柄(id号)

返回值

0

1.8.23. gptimer_get_capture_count

获取capture功能count计数器的原始值。

原型:

u32 gptimer_get_capture_count(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

count计数器原始值

1.8.24. gptimer_get_capture_cnt2us

获取capture功能count计数器值,并转换为时间 us。

原型:

u32 gptimer_get_capture_cnt2us(u32 tid); //捕获发生时调用有效

参数:

tid

init时返回的句柄(id号)

返回值

时间 单位:us

1.8.25. gptimer_set_count

设置count计数器的值。

原型:

u32 gptimer_set_count(u32 tid, u32 cnt);

参数:

tid

init时返回的句柄(id号)

cnt

conut值

返回值

0

1.8.26. gptimer_get_count

获取count计数器的原始值。

原型:

u32 gptimer_get_count(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

count计数器原始值

1.8.27. gptimer_set_prd

设置prd寄存器的值。

原型:

u32 gptimer_set_prd(u32 tid, u32 prd);

参数:

tid

init时返回的句柄(id号)

prd

prd值

返回值

0

1.8.28. gptimer_get_prd

获取prd寄存器的原始值。

原型:

u32 gptimer_get_prd(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

prd寄存器原始值

1.8.29. gptimer_tick2us

把tick 转换为时间,单位:us

原型:

u32 gptimer_tick2us(u32 tid, u32 tick);

参数:

tid

init时返回的句柄(id号)

tick

tick

返回值

时间 单位:us

1.8.30. gptimer_get_private_data

获取私有参数的指针。

原型:

void *gptimer_get_private_data(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

私有参数指针

1.8.31. gptimer_set_private_data

设置私有参数。

原型:

void gptimer_set_private_data(u32 tid, void *private_data);

参数:

tid

init时返回的句柄(id号)

private_data

私有参数指针

返回值

1.8.32. gptimer_measure_time_init

计时功能初始化

原型:

u32 gptimer_measure_time_init(const timer_dev timerx, u32 max_time_us);

参数:

timerx

选择一个timer 硬件模块

max_time_us

最大计时时间

返回值

tiemr句柄(id号)

1.8.33. gptimer_measure_time_start

计时功能启动

原型:

u32 gptimer_measure_time_start(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

0

1.8.34. gptimer_measure_time_end

计时功能停止

原型:

u32 gptimer_measure_time_end(u32 tid);

参数:

tid

init时返回的句柄(id号)

返回值

从计时开始到停止的时间,单位:us

1.8.35. gptimer_dump

打印timer 相关的所有寄存器

原型:

void gptimer_dump();

参数:

返回值

1.8.36. gptimer_demo, 可参考 gptimer_demo.c 文件

static void timer_callback_func_0(u32 tid, void *private_data)
{
        putchar('t');
        //可以翻转IO口测量时间
        gpio_set_mode(PORTA, BIT(0), PORT_OUTPUT_HIGH);
        gpio_set_mode(PORTA, BIT(0), PORT_OUTPUT_LOW);
}
static void timer_callback_func_1(u32 tid, void *private_data)
{
        putchar('T');
        //可以翻转IO口测量时间
        gpio_set_mode(PORTA, BIT(1), PORT_OUTPUT_HIGH);
        gpio_set_mode(PORTA, BIT(1), PORT_OUTPUT_LOW);
}
static void timer_callback_func_2(u32 tid, void *private_data)
{
        gpio_set_mode(PORTA, BIT(2), PORT_OUTPUT_HIGH);
        gpio_set_mode(PORTA, BIT(2), PORT_OUTPUT_LOW);
}

static void timer_demo()
{
        printf("timer_demo()\n");
        const struct gptimer_config timer_config = {
                .timer.period_us = 1 * 1000 * 1000, //定时周期, 1000000us
                .irq_cb = timer_callback_func_0, //设置中断回调函数
                .irq_priority = 1, //中断优先级
                .mode = GPTIMER_MODE_TIMER, //设置工作模式
                .private_data = NULL,
        };
        u32 id = gptimer_init(TIMERx, &timer_config); //初始化timer配置,成功会返回分配的timer_id, 失败返回-1
        printf("timer_demo id:%d\n", id);

        gptimer_start(id); //启动timer
        gptimer_set_timer_period(id, 500 * 1000); //设置定时周期为500ms
        /* gptimer_set_timer_period(id, 250 * 1000); //设置定时周期为250ms */
        u32 timer_us = gptimer_get_timer_period(id); //获取定时周期
        printf("timer period_us = %dus\n", timer_us);
        gptimer_set_irq_callback(id, timer_callback_func_1); //设置回调函数
}

static void pwm_demo()
{
        printf("pwm_demo()\n");
        const struct gptimer_config pwm_config = {
                .pwm.freq = 1 * 1000 * 1000, //设置输出频率
                /* .pwm.freq = 1 * 1000, //设置输出频率 */
                .pwm.duty = 5000, //设置占空比为34.56%
                .pwm.port = PORTA, //设置pwm输出IO_ PORTA_02
                .pwm.pin = BIT(3), //设置pwm输出IO_PORTA_02
                .mode = GPTIMER_MODE_PWM, //设置工作模式
        };
        u32 id = gptimer_init(TIMERx, &pwm_config);
        printf("pwm_demo id:%d\n", id);
        gpio_set_mode(PORTA, BIT(3), PORT_OUTPUT_LOW); //IO口设为输出

        gptimer_start(id); //启动timer
}


static void capture_demo()
{
        printf("capture_demo()\n");
        const struct gptimer_config capture_config = {
                .capture.filter = 1000, //设置滤波频率, 1000Hz
                .capture.max_period = 0,//110000, //最大计时周期, 单位us, 默认给0
                .capture.port = PORTA, //设置捕获口IO_PORTA_04
                .capture.pin = BIT(5), //设置捕获口IO_PORTA_04
                .irq_cb = timer_callback_func_2, //设置回调函数
                .irq_priority = 1, //设置捕获中断优先级
                .mode = GPTIMER_MODE_CAPTURE_EDGE_ANYEDGE, //设置工作模式
        };
        u32 id = gptimer_init(TIMERx, &capture_config);
        printf("capture_demo id:%d\n", id);
        gpio_set_mode(PORTA, BIT(5), PORT_INPUT_FLOATING); //IO口设为浮空输入

        gptimer_start(id); //启动timer
        gptimer_set_capture_filter(id, 100000); //设置滤波参数为10000Hz
        gptimer_set_capture_count(id, 0); //设置cnt寄存器
        u32 cnt = gptimer_get_capture_count(id);
        printf("capture cnt = %d\n", cnt);
        u32 us = gptimer_get_capture_cnt2us(id); //获取捕获时间间隔, 单位:us
        printf("capture_us = %dus \n", us);
}

static void measure_demo()
{
        printf("measure_demo()\n");
        u32 id = gptimer_measure_time_init(TIMER2, 0);
        u32 time_us;
        while (1) {
                gptimer_measure_time_start(id);
                gpio_set_mode(PORTA, BIT(3), PORT_OUTPUT_HIGH);
                udelay(10000); //需配合示波器或逻辑分析仪测量IO间隔时间
                gpio_set_mode(PORTA, BIT(3), PORT_OUTPUT_LOW);
                time_us = gptimer_measure_time_end(id);
                printf("time_us = %d\n", time_us);
                udelay(500 * 1000);
                wdt_clear();
        }
}