跳转至

通用定时器(TIMER)


简介

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


API

函数名 描述
timer_init 初始化TIMER设备
timer_start 启动TIMER设备
timer_stop 停止TIMER设备
timer_set_mode 设置TIMER设备计数模式
timer_event_start TIMER设备触发事件计数
timer_set_count TIMER设置计时周期
timer_get_count TIMER设备获取计数值
timer_cascade_set TIMER设备设置级联模式

TIMER相关说明

TIMER名 中断名 中断服务函数 描述
TIMER0 TIMER0_IRQn TIMER0_IRQHandler
TIMER1 TIMER1_IRQn TIMER1_IRQHandler
TIMER2 TIMER2_IRQn TIMER2_IRQHandler
TIMER3 TIMER3_IRQn TIMER3_IRQHandler
AON_TIMER0 AON_TIM_INT0_IRQn AON_TIM_INT0_IRQHandler HAL_PWM4_BASE 可当做 AON_TIMER0
AON_TIMER1 AON_TIM_INT1_IRQn AON_TIM_INT0_IRQHandler HAL_PWM5_BASE 可当做 AON_TIMER1


示例

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

void timer_s(uint32_t s)
{
    eclic_irq_enable(TIMER0_IRQn);
    scu_set_device_gate(HAL_TIMER0_BASE,ENABLE);
    timer_init_t init;
    init.mode = timer_count_mode_auto;
    init.div = timer_clk_div_0;
    init.width = timer_iqr_width_f;
    init.count = get_apb_clk() * s;
    timer_init(TIMER0,init);
    timer_start(TIMER0);
}

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

void timer_ms(uint32_t ms)
{
    eclic_irq_enable(TIMER0_IRQn);
    scu_set_device_gate(HAL_TIMER0_BASE,ENABLE);
    timer_init_t init;
    init.mode = timer_count_mode_auto;
    init.div = timer_clk_div_0;
    init.width = timer_iqr_width_f;
    init.count = (get_apb_clk() / 1000) * ms;
    timer_init(TIMER0,init);
    timer_start(TIMER0);
}

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

void timer_us(uint32_t us)
{
    eclic_irq_enable(TIMER0_IRQn);
    scu_set_device_gate(HAL_TIMER0_BASE,ENABLE);
    timer_init_t init;
    init.mode = timer_count_mode_auto;
    init.div = timer_clk_div_0;
    init.width = timer_iqr_width_f;
    init.count = (get_apb_clk() / 1000000) * us;
    timer_init(TIMER0,init);
    timer_start(TIMER0);
}

警告

CI13XX系列芯片内置32位计数器,计数范围:0x0 - 0xFFFFFFFF;如果需要更长时间的定时设置,需要对定时器进行分频操作,或使用级联模式。


常见问题

  • TIMER定时范围(TIMER模块基础时钟CLK_S = 120000000Hz)

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

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

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

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

以上做法,最大定时9分钟左右,若需要更长时间定时,请使用定时器级联模式。以下对级联模式进行描述:

TODO:

基础定时器 级联定时器
TIMER0 TIMER1\2\3
TIMER1 TIMER2\3
TIMER2 TIMER3
AON_TIMER0 AON_TIMER1

举个例子: 我们现在将TIMER0作为基础定时器,将时钟分频系数配置为16(这里追求定时最大化),TIMER1、TIMER2、TIMER3都配置为级联模式,且TIMER1、TIMER2、TIMER3的计数值都配置为最大值(0xFFFFFFFF),那么每一个TIMER定时是多久呢?

定时器 定时时间
TIMER0 13分钟左右
TIMER1 0xFFFFFFFF * 13分钟左右
TIMER2 0xFFFFFFFF * 0xFFFFFFFF * 13分钟左右
TIMER3 0xFFFFFFFF * 0xFFFFFFFF * 0xFFFFFFFF * 13分钟左右
AON_TIMER0 13分钟左右
AON_TIMER1 0xFFFFFFFF * 13分钟左右