跳转至

通用定时器(TIMER)


1、简介

TIMER(定时器)功能是在指定的时间间隔内反复触发指定窗口的定时器事件。

CI14LP芯片内置TIMER0 ~ TIMER5共6个32位定时器(TIMER1时钟源为PDA APB时钟,其余为NPU APB时钟),支持单周期/自动重装/自由计数三种计数模式、½/4/16分频、脉冲输入检测(捕获)模式。


2、API

函数名 描述
timer_init 初始化TIMER设备(计数模式/分频/计数值)
timer_en TIMER设备使能/关闭
timer_pause_en TIMER暂停使能
timer_set_mode 设置TIMER设备计数模式
timer_set_count TIMER设置计数值(计时周期)
timer_get_count TIMER设备获取当前计数值
timer_restart 重置计数值并重启定时器
timer_irq_mask_config TIMER中断屏蔽配置
timer_get_irq_raw_status 获取TIMER原始中断状态
timer_get_irq_mask_status 获取TIMER屏蔽后中断状态
timer_clear_irq 清除TIMER中断标志

2.1 脉冲检测(捕获)接口

函数名 描述
timer_capture_init 初始化脉冲输入检测(边沿/分频/脉冲阈值)
timer_get_capture_level 获取捕获电平状态
timer_get_current_edge_count 获取当前边沿计数值
timer_get_previous_edge_count 获取上一个边沿计数值

3、TIMER相关说明

TIMER名 时钟基准 计时1s的count值 中断服务函数
TIMER0 NPU APB时钟 TIMER_S_COUNT(get_apb_clk()/32) TIMER0_IRQHandler
TIMER1 PDA APB时钟 TIMER1_S_COUNT(get_pda_apb_clk()/16) TIMER1_IRQHandler
TIMER2 ~ TIMER5 NPU APB时钟 TIMER_S_COUNT TIMERx_IRQHandler

4、示例

TIMER中断服务函数是wake类型,可以在其他任意位置定义该函数:

//TIMER0中断服务函数定义
void TIMER0_IRQHandler(void)
{
    mprintf("timer0 irq\n");
    timer_clear_irq(TIMER0);
}

//TIMER1中断服务函数参考TIMER0

以下代码配置并启动TIMER0,1S来一次定时器中断:

void timer_s(uint32_t s)
{
    eclic_irq_enable(TIMER0_IRQn);
    scu_set_device_clock_en(HAL_TIMER0_BASE, ENABLE);
    timer_init_t init;
    init.mode = TIMER_COUNT_MODE_AUTO;
    init.div = TIMER_CLK_DIV_1;
    init.count = TIMER_S_COUNT * s;
    timer_init(TIMER0, init);
    timer_en(TIMER0, ENABLE);
}

以下代码配置并启动TIMER0,1ms来一次定时器中断:

void timer_ms(uint32_t ms)
{
    eclic_irq_enable(TIMER0_IRQn);
    scu_set_device_clock_en(HAL_TIMER0_BASE, ENABLE);
    timer_init_t init;
    init.mode = TIMER_COUNT_MODE_AUTO;
    init.div = TIMER_CLK_DIV_1;
    init.count = TIMER_MS_COUNT * ms;
    timer_init(TIMER0, init);
    timer_en(TIMER0, ENABLE);
}

注意

计数模式为单周期模式(TIMER_COUNT_MODE_SINGLE)时,计数到0后定时器停止;需要周期性中断请使用自动重装模式(TIMER_COUNT_MODE_AUTO)。产生中断后需调用接口 timer_clear_irq 清除中断标志。


5、常见问题

  • TIMER定时范围(TIMER模块基础时钟CLK_S为APB时钟)

分频系数:DIV(取值范围:1,2,4,16)

计数时钟:CLK = CLK_S / DIV 单位:Hz

最小定时:MIN = 1s / CLK 单位:S

最大定时:MAX = 0xFFFFFFFF * MIN 单位:S

警告

CI14LP系列芯片内置32位计数器,计数范围:0x0 - 0xFFFFFFFF;如果需要更长时间的定时设置,需要对定时器进行分频操作(最大16分频)。


6、API 参考

本模块接口声明于 driver\ci14lp_chip_driver\inc\ci14lp_timer.h,实现位于 driver\ci14lp_chip_driver\src\ci14lp_timer.c。