freertos 定時器 不啟動 定時器

2021-10-11 08:13:29 字數 3010 閱讀 4324

工作方式0,13位定時器/計數器。下面以定時器0為例講解。

上圖可以知道定時器工作方式0的邏輯結構,與工作方式1相差不遠,只是方式1是兩個8位計數器,而方式0是乙個8位,乙個低5位組成的13位計數器。程式設計控制兩個非常像。方式0的計數器最大值為2的13次方=8192,計數一次時間最大值為8192*1.09=8929us(以晶振為11.0592mhz為例)。下面示範講解使用,比如說設定乙個10ms的間距,哎哦,最大間距為9ms,設定不了,那就以5ms為例

n=5*1000/1.09=4587,

tl0(低五位計數器)最大值為2的5次方=32,所以th0(高八位)=4587/32=143,十六進製制為0x8f。

tl0=4587%32=11,十六進製制為0x0b。

所以 th0=0x8f; //注意高低位,h=high, 高

tl0=0x0b; //l=low, 低

下面寫乙個簡單的完整程式:`

#include//標頭檔案

sbit led=p1^1; //位定義

unsigned char count; //定義乙個無符號型變數count,記錄中斷次數

main () //主函式

void timer_t0() interrupt 1 //中斷函式,1表示中斷源為定時器0

}

方式0的使用至此已經講解完畢,方式0與方式1的使用差不多,可以對照來看,兩者使用場景也差不多,能使用方式1的地方也可以使用方式0.

工作方式2,8位初值自動過載的8位定時器/計數器

在這裡說明一下,定時器是比簡單的延時函式實用,精確。但定時器也是有誤差的,在賦值時,採用的是約等數。人工過載時時間上也會造成誤差。種種原因,時間一久,誤差累積就會很大,在一些要求精確度功能時,比方說串列埠通訊設定波特率,就會出錯。所以就出現了方式2,計數器自動過載。

來看一下方式2的邏輯圖,右邊部分的圖不用說了,重點來看左邊。th0被作為常數緩衝器,當tl0計數溢位,在溢位標誌tf0置1的同時,自動將th0的常數重新裝入tl0中,時tl0從初值開始重新計數。

方式2,8位計數器,最大值為2的8次方=256,計數時間最大值為2561.09=279us,以100ms為間距時, n=1001000/279=358 .同樣來個範例:

#include//標頭檔案

sbit led=p1^1; //位定義

unsigned int count; //定義乙個無符號型變數count,記錄中斷次數

main () //主函式

void timer_t0() interrupt 1 //中斷函式,1表示中斷源為定時器0

}

方式2的講解告一段落,方式2特別適合用於做較精確的脈衝訊號發射器。

工作方式3,僅使用於t0,分成兩個8位計數器,t1停止計數。

上圖結構簡單,就不多講解。就是定時器0的計數器分成兩個,th0作用於tf1,tr1.

tl0作用於tf0,tr0.那就是說使用工作方式3時,不使用t1定時器,或使用時不使用中斷,這個情況就是定時器1使用工作方式2,不然會出錯,因為tf1,tr1已經讓定時器0占用。計算已經大同小異,把式子就算了。th0定時5ms,tl0定時10ms。

n=51000/(2561.09)=18 //th0

n=101000/(2561.09)= 36 //thl0

#include//標頭檔案

sbit led_1=p1^1; //位定義

sbit led_2=p1^2;

unsigned char count; //定義乙個無符號型變數count,記錄th0中斷次數

unsigned char num; //定義乙個無符號型變數num,記錄tl0中斷次數

main () //主函式

void timer_th0() interrupt 1 //中斷函式,1表示中斷源為定時器0

}void timer_thl0() interrupt 1 //中斷函式,1表示中斷源為定時器0

}

方式3的使用也講完了。下面介紹兩個定時器巢狀使用。

兩個定時器一起使用也沒有什麼困難,很簡單的,只要乙個的會用,兩個也不成問題,小小意思。這和方式3有點像。看看下面例程就回了。

#include//標頭檔案

sbit led_1=p1^1; //位定義

sbit led_2=p1^2;

unsigned char count; //定義乙個無符號型變數count,記錄th0中斷次數

unsigned char num; //定義乙個無符號型變數num,記錄tl0中斷次數

main () //主函式

void timer_t0() interrupt 1 //中斷函式,1表示中斷源為定時器0

}void timer_t1() interrupt 3 //中斷函式,3表示中斷源為定時器1

}

定時器的講解已經結束,大家對定時器的認知肯定也提公升不少。定時器非常重要,在大部分的程式中都會運用到,這個要求會用。上面的講解已經非常直白了,不懂的多看幾遍,每次都會有新的體悟。定時器就一計數器,到點了就中斷,卡準中斷時間,不就可知道時間,定時器就這樣子,不難。

freeRTOS 定時器服務

一 概念 軟體定時器 定時器服務任務 定時器命令佇列 軟體定時器允許設定一段時間,當設定的時間到達之後就執行指定的 函式。不能在 函式中呼叫任何會阻塞任務的 api 函式 定時器是乙個可選的 不屬於 freertos 核心的功能,它是由定時器服務 或 daemon 任務來提供的。freertos 提...

FreeRTOS學習6 軟體定時器

timerhandle t timerhandle tim1 定義定時器1變數 timerhandle t timerhandle tim2 定義定時器2變數 timerhandle tim1 xtimercreate tim1 1000,pdtrue,void 1,timerhandle tim1...

FreeRTOS軟體定時器的使用

先貼上乙個建立的 先宣告乙個控制代碼 timerhandle t pump wakeup timer handle null 建立定時器和啟動定時器,第三個引數,pdfalse是只定時一次,pdtrue是自動過載定時器,也就是一直迴圈。if pump wakeup timer handle null...