一、定时器理论
定时器是一种允许在特定时间间隔后或在将来的某个时间点调用回调函数的机制。对于需要周期性任务或延迟执行任务的嵌入式应用程序特别有用。
1.1定时器创建和使用
TimerHandle_t xTimerCreate( const char * const pcTimerName,
const TickType_t xTimerPeriodInTicks,
const UBaseType_t uxAutoReload,
void * const pvTimerID,
TimerCallbackFunction_t pxCallbackFunction );
BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait );
二、定时器实践
2.1周期触发定时器
static TimerHandle_t xMyTimerHandle;
xMyTimerHandle = xTimerCreate("mytimer", 100, pdTRUE, NULL, MyTimerCallbackFunction);
void MyTimerCallbackFunction( TimerHandle_t xTimer )
{
static int cnt = 0;
flagTimer = !flagTimer;
printf("MyTimerCallbackFunction_t cnt = %d\r\n", cnt++);
}
void Task1Function(void * param)
{
volatile int i = 0;
xTimerStart(xMyTimerHandle, 0);
while (1)
{
printf("Task1Function ...\r\n");
}
}
结果:每隔100ms进入回调函数
2.2按键消抖
在嵌入式开发中,我们使用机械开关时经常碰到抖动问题:引脚电平在短时间内反复变化。针对这个问题,我们在中断函数中添加定时器,在产生中断后定时器延时20ms,假如由于抖动再次进入中断,继续延时20ms直到按键趋于稳定。
static TimerHandle_t xMyTimerHandle;
xMyTimerHandle = xTimerCreate("mytimer", 2000, pdFALSE, NULL, MyTimerCallbackFunction);
void MyTimerCallbackFunction( TimerHandle_t xTimer )
{
static int cnt = 0;
flagTimer = !flagTimer;
printf("Get GPIO Key cnt = %d\r\n", cnt++);
}
void EXTI0_IRQHandler(void)
{
static int cnt = 0;
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
printf("EXTI0_IRQHandler cnt = %d\r\n", cnt++);
/* 使用定时器消除抖动 */
xTimerReset(xMyTimerHandle, 0); /* Tcur + 2000 */
EXTI_ClearITPendingBit(EXTI_Line0); //清除中断
}
}