12 定时器和看门狗
12.1 功能概述
ING918xx系列有三个定时器:Timer0
、Timer1
和Timer2
。三个定时器功能基本相同,可以实现定时、比较等功能。唯一的区别在于,Timer0
可以用作看门狗。
12.2 TIMER使用说明
12.2.1 获取Timer计数值
可以通过TMR_GetCNT
获取计数器的当前计数值。
uint32_t TMR_GetCNT(TMR_TypeDef *pTMR);
pTMR
:可以设置为APB_TMR0
、APB_TMR1
、APB_TMR2
,对应Timer0
、Timer1
和Timer2
。
注意计数器只有使能后,计数值才会随着程序的运行递加,如果计数器未使能,计数值是不变的。
12.2.3 设置TIMER的比较值
可以通过TMR_SetCMP
设置计数器的比较值。
void TMR_SetCMP(TMR_TypeDef *pTMR, uint32_t value);
pTMR
:选择要设置的计数器,APB_TMR0
、APB_TMR1
或APB_TMR2
;
value
:设置的比较值。
12.2.7 设置TIMER的工作模式
通过TMR_SetOpMode
设置计数器的工作模式。
void TMR_SetOpMode(TMR_TypeDef *pTMR, uint8_t mode);
三种模式的定义如下:
#define TMR_CTL_OP_MODE_WRAPPING 0
#define TMR_CTL_OP_MODE_ONESHOT 1
#define TMR_CTL_OP_MODE_FREERUN 2
具体说明见上文。
12.2.8 使能TIMER中断
通过TMR_IntEnable
使能中断,使能中断后计时器计数值达到比较值后,会触发中断。
void TMR_IntEnable(TMR_TypeDef *pTMR);
12.3 TIMER中断使用流程
配置对应
Timer
的时钟,下面的代码中配置了三个Timer
的时钟,使用时可以根据自己使用的Timer
进行配置。SYSCTRL_ClearClkGateMulti( (1 << SYSCTRL_ClkGate_APB_TMR0) | (1 << SYSCTRL_ClkGate_APB_TMR1) | (1 << SYSCTRL_ClkGate_APB_TMR2));
对
Timer
进行初始化,以Timer1
为例。TMR_SetCMP(APB_TMR1, TMR_CLK_FREQ); TMR_SetOpMode(APB_TMR1, TMR_CTL_OP_MODE_WRAPPING); TMR_Reload(APB_TMR1); TMR_IntEnable(APB_TMR1);
上面四条语句分别设置了定时器的比较值,设置工作模式,将定时器的当前计数值清零,并使能中断。
注册中断处理函数。
platform_set_irq_callback(PLATFORM_CB_IRQ_TIMER1, hr_timer1_isr, NULL);
hr_timer1_isr
为Timer1
的中断处理函数。编写中断处理函数。
uint32_t hr_timer1_isr(void *user_data) { TMR_IntClr(APB_TMR1); //user code return 0; }
需要注意,中断处理函数中,要优先清理对应的中断请求。