FreeRTOS笔记-定时器

  1. 定时器
    1. 创建定时器
    2. Tick中断

定时器

创建定时器

使用动态分配内存的方法创建定时器

1
2
3
4
5
TimerHandle_t xTimerCreate( const char * const pcTimerName,             
const TickType_t xTimerPeriodInTicks,
const UBaseType_t uxAutoReload,
void * const pvTimerID,
TimerCallbackFunction_t pxCallbackFunction )

pcTimerName:定时器名字,用处不大,尽在调试时用到

xTimerPeriodInTicks:周期,以Tick为单位

uxAutoReload:类型,pdTRUE表示自动加载,pdFALSE表示一次性

pvTimerID:回调函数可以使用此参数,比如分辨是哪个定时器

pxCa11backFunction:回调函数

返回值:成功则返回TimerHandle_t,否则返回NULL

Tick中断

FreeRTOS中存在一个Tick中断,软件定时器基于Tick来运行,在Tick中断里,它会判断定时器是否超时,超时了就进入回调函数。

守护任务:创建了一个prvTimerTask任务。开启后需要对这个任务进行配置(优先级、栈大小、队列)。

守护任务队列的作用:在执行定时器函数时,本质是操作数据发送到队列中,。

在开启宏定义功能模块后,自定义了函数:

1
2
3
4
5
6
7
8
9
10
StackType_t xIdleTimerStack[100];
StaticTask_t xTimerTask;
void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,
StackType_t ** ppxTimerTaskStackBuffer,
uint32_t * pulTimerTaskStackSize )
{
*ppxTimerTaskTCBBuffer = &xTimerTask;
*ppxTimerTaskStackBuffer = xIdleTimerStack;
*pulTimerTaskStackSize = 100;
}

编写定时器回调函数

1
2
3
4
5
void Timer1CallbackFunction()
{
static int sum = 0;
printf("Timer has run : %d \r\n", sum++);
}

定时器回调函数会以设定时间进行运行,可选择是否循环运行或者运行单次

定时器的运用:按键消抖
通过定时器的不循环模式,设定消抖时间,在按键中断抖动时,进入定时器,中断回调函数一直在reset定时器,就能实现按键抖动啦。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 1186703947@qq.com

💰

×

Help us with donation

相册 动态菜单1