在嵌入式編程中,定時器是一個非常重要且強大的功能,用來幫我們定時性的調用中斷服務函數來幫助我們處理程序。定時器通常是用硬件來實現的,例如STM32F407就有8個硬件定時器。
而在FreeRTOS中則可以用軟件實現定時器。大大的擴展了定時器的數量。
閱讀FreeRTOS開發者文檔我們可以知道,軟件定時器的回調函數會在定時器服務函數中執行。
同時,軟件定時器的回調函數中不能調用然后可以導致阻塞的函數例如vTaskDelay()等等,包括等待信號量的函數這些也會造成阻塞。
FreeRTOS會使用隊列向定時器服務任務發送命令,這個隊列就是定時器命令隊列。
創建軟件定時器
在API引用文檔中,我們可以查詢有關創建軟件定時器創建的函數。內容有許多,但是還是總歸是分三個步驟:包含相關頭文件、啟動相關的宏、配置軟件定時器。
軟件定時器配置時也有三個參數需要注意,一個定時器的定時時間,一個是設置定時器重復使用還是一次項,最后需要注意的是傳入調用函數的句柄。
定義相關的回調函數與定時器句柄。
Timer_Handler = xTimerCreate
( (const char * const) "xTimerCreate",
(const TickType_t) 500,//500ms一次
(const UBaseType_t) pdTRUE,//重復
(void * const) 1,//定時器ID
(TimerCallbackFunction_t) CallBacl );//中斷服務函數句柄
接著我們定義一個輪詢函數,當按鍵按下時,我們就開啟定時器
void Low_Task(void * pvParameters)//參數為 void * pvParameters
{
while(1)
{
if(KEY_Scan(0)==1)
{
xTimerStart(Timer_Handler,100);//開始定時器傳入句柄以及最大等待時間
}
}
}
在回調函數中我們讓LED燈進行翻轉
void CallBacl( TimerHandle_t xTimer)
{
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);
}
同樣的,在官方的API文檔中我們還可以看到許多和軟件定時器有關的內容,在這里不一一介紹,有感興趣的小伙伴可以去官網查看API使用說明。
-
嵌入式
+關注
關注
5046文章
18823瀏覽量
298714 -
定時器
+關注
關注
23文章
3218瀏覽量
113708 -
FreeRTOS
+關注
關注
12文章
483瀏覽量
61733 -
STM32F407
+關注
關注
15文章
187瀏覽量
29205
發布評論請先 登錄
相關推薦
評論