1. 程式人生 > >FreeRTOS軟體定時器

FreeRTOS軟體定時器

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");
}