FreeRTOS软件定时器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZenNaiHeQiao/article/details/83747577

1.软件定时器:

软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器
调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期,
简而言之,当定时器的定时周期到了以后就会执行回调函数。

2.软件定时器功能:

单次定时器:(例如定时1S,当定时时间到了之后执行一次回调函数,然后定时器停止运行。需要手动重新启动。)
周期定时器:(例如定时1S,每当定时时间到了之后执行一次回调函数,然后定时器停止运行。自动重新启动。)
复位软件定时器:提供了一种思路,例如设置当LCD背光打开后,如果5S之内唤醒键没有被按下则自动熄灭。如果5S内任何时刻被按下了,从按下这个时刻其再亮5S。

3.软件定时器配置:

# define configUSE_TIMERS  1          // 设置为1 时候,定时器服务任务会在启动FreeRTOS调度器时候自动创建。
#define configTIMER_TASK_PRIORITY     //设置软件定时器服务任务的任务优先级,可以为 0~( configMAX_PRIORITIES-1)。
#define configTIMER_QUEUE_LENGTH      //此宏用来设置定时器命令队列的队列长度。
#define configTIMER_TASK_STACK_DEPTH  //此宏用来设置定时器服务任务的任务堆栈大小,单位为字,不是字节!,对于 STM32 来说一个字是 4 字节。由于定时器服务任务中会执行定时器的回调函数,因此任务堆栈的大小一定要根据定时器的回调函数来设置。

4.软件定时器函数:

复位软件定时器:

函数名 原型 功能
xTimerReset() BaseType_t xTimerReset( TimerHandle_t xTimer,TickType_t xTicksToWait ) 复位软件定时器
xTimerResetFromISR() BaseType_t xTimerResetFromISR( TimerHandle_t xTimer,BaseType_t * pxHigherPriorityTaskWoken ) 复位软件定时器中断版本

创建软件定时器:

函数名 原型 功能
xTimerCreate() TimerHandle_t xTimerCreate( const char * const pcTimerName,TickType_t xTimerPeriodInTicks,UBaseType_t uxAutoReload,void * pvTimerID,TimerCallbackFunction_t pxCallbackFunction ) 创建一个定时器
xTimerCreateStatic() TimerHandle_t xTimerCreateStatic(const char * const pcTimerName,TickType_t xTimerPeriodInTicks,UBaseType_t uxAutoReload,void * pvTimerID,TimerCallbackFunction_t pxCallbackFunction,StaticTimer_t * pxTimerBuffer ) 创建一个定时器中断版本

开启软件定时器:

函数名 原型 功能
xTimerStart() BaseType_t xTimerStart( TimerHandle_t xTimer,TickType_t xTicksToWait ) 开启一个定时器
xTimerStartFromISR() BaseType_t xTimerStartFromISR( TimerHandle_t xTimer,BaseType_t * pxHigherPriorityTaskWoken ); 开启一个定时器中断版本

停止软件定时器:

函数名 原型 功能
xTimerStop() BaseType_t xTimerStop ( TimerHandle_t xTimer,TickType_t xTicksToWait ) 停止一个定时器
xTimerStopFromISR() BaseType_t xTimerStopFromISR( TimerHandle_t xTimer,BaseType_t * pxHigherPriorityTaskWoken ); 停止一个定时器中断版本

5.软件定时器调用:

TimerHandle_t AutoReloadTimer_Handle;  //周期定时器句柄
TimerHandle_t  OneShotTimer_Handle; //单次定时器句柄
void AutoReloadCallback(TimerHandle_t xTimer); //周期定时器回调函数
void OneShotCallback(TimerHandle_t xTimer); //单次定时器回调函数

创建软件周期定时器 , 周期定时器,周期 1s(1000 个时钟节拍),周期模式

taskENTER_CRITICAL(); //进入临界区
AutoReloadTimer_Handle=xTimerCreate((const char* )"AutoReloadTimer",  
(TickType_t )1000,
(UBaseType_t  )pdTRUE,
(void* )1,
(TimerCallbackFunction_t)AutoReloadCallback);
taskEXIT_CRITICAL(); //退出临界区
//周期定时器的回调函数
void AutoReloadCallback(TimerHandle_t xTimer)
{
static u8 tmr1_num=0;
tmr1_num++; //周期定时器执行次数加 1
LCD_ShowxNum(70,111,tmr1_num,3,16,0x80); //显示周期定时器的执行次数
LCD_Fill(6,131,114,313,lcd_discolor[tmr1_num%14]);  //填充区域
}

创建单次定时器, 单次定时器,周期 2s(2000 个时钟节拍),单次模式

taskENTER_CRITICAL(); //进入临界区
OneShotTimer_Handle=xTimerCreate((const char*  )"OneShotTimer", (2)
(TickType_t  )2000,
(UBaseType_t )pdFALSE,
(void*  )2,
(TimerCallbackFunction_t)OneShotCallback);
taskEXIT_CRITICAL(); //退出临界区
//单次定时器的回调函数
void OneShotCallback(TimerHandle_t xTimer)
{
static u8 tmr2_num = 0;
tmr2_num++; //周期定时器执行次数加 1
LCD_ShowxNum(190,111,tmr2_num,3,16,0x80); //显示单次定时器执行次数
LCD_Fill(126,131,233,313,lcd_discolor[tmr2_num%14]); //填充区域
LED1=!LED1;
printf("定时器 2 运行结束\r\n");
}

猜你喜欢

转载自blog.csdn.net/ZenNaiHeQiao/article/details/83747577