FreeRTOS軟體定時器
阿新 • • 發佈:2018-11-16
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");
}