通用定时器(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。