Timer和counter
什么是Timer,什么是Counter
幾乎每個嵌入式板都會有counter和timer,重要性比肩gpio.本質(zhì)上來看timer和counter幾乎是一樣的東西,底層都是一個硬件counter,如果是按照規(guī)律的時間跳表,就是timer,如果是按照不規(guī)律的事件訊號跳表就是counter.一般timer/counter統(tǒng)一稱作timer.
?
Timer.
一個典型的Timer包含以下元件:
- prescaler -- 除頻器,分頻器
- N-bit的counter register
- 一個或者多個capture register
- 一個或者多個compare register
timer底層實際是counter,counter會計算輸入脈沖的數(shù)量,如果輸入脈沖式每隔固定時間發(fā)出一次,就是timer.至于這個計數(shù)器的大小其實和處理器架構(gòu)一點關(guān)系沒有,8bit的處理器也可以有16bit size的counter.32bit的處理器也可以有16bit的counter。
?
prescaler(除頻器)
prescaler是一個硬件元件,可以把用于驅(qū)動timer的clock(可能是cpu的clock,或是bus上的clock),以頻率已特定的倍數(shù)下降。一般來說可以除以2^n,或是除以1~2^P, P是prescaler存放除頻參數(shù)的bit數(shù)。
?
為什么需要使用prescaler
因為你必須把timer的觸發(fā)clock調(diào)整到你想要的頻率。因為counter的size是有限的,你使用的clock頻率越高,你的時間精密度就越高,但是相對的,你的timer最高能記得時間就會減少。例如你想要1us的精確度,但是你只有16bit-timer,那你就只能數(shù)到約65ms,counter就要重新數(shù)了。如果你想要讓counter一次可以數(shù)完一秒,那你就要每次16us才跳表。這就要透過除頻器來做取舍。不過改進的方法就是另外加一個repetition register,用于設(shè)定一個重復的次數(shù),可以讓你的counter重新數(shù)完n次之后,在發(fā)出數(shù)完了的中斷訊號。
假如每1us跳一次counter,16bit可以跳65546次,就只能數(shù)到65ms.
如果timer當計數(shù)器使用,通常會搭配另外一個time-based的timer,這樣你就可以衡量一個時間周期內(nèi),該事件發(fā)生幾次。
?
Timer Register
Timer Register其實就是一個N-bit的counter,可以向上數(shù),也可以向下,甚至可以向上數(shù)完再向下。你可以讀取,寫入,停止,歸零這個counter.當然,決定這個counter什么時候會計數(shù)跳表,取決于觸發(fā)該counter的來源.
Capture Register
capture register是一種如果被觸發(fā),就會把目前counter的值存起來的register。觸發(fā)的條件通常是輸入pin教改變了狀態(tài)。也就是說,Capture Register是一種當時間發(fā)生時,截取timer snapshot的register。capture register也可以設(shè)定產(chǎn)生一個interrupt,讓handler去保存剛剛街渠道的timer狀態(tài)。因為這是硬件觸發(fā)的,所以不會像軟件計數(shù)會有l(wèi)atency.所以capture register最簡單的用途就是計算兩個脈沖之間的時間間隔,把第一個和第二個訊號的snapshot counter相減,乘上每次counter+1的時間間隔,就代表兩次訊號的時間差。
Compare Register
也有人稱match register。他的用途和capture register正好相反。compare register會保存一個值。這個值會一直和timer目前的值做比較。如果當兩個值一樣時,就會發(fā)出一個訊號。因此這個是用于output訊號的register.如果你的timer是當成timer(計時)使用,那么compare register就可以用作每隔固定時間發(fā)出訊號。如果你的timer是當做計數(shù)器,那么compare register就變成一種當某個事件發(fā)生固定次數(shù)后,就會發(fā)出訊號的裝置。
因此這就可以當作稱PWM的功能。在timer=0是把output訊號設(shè)成high,然后設(shè)定compare register的值作為脈沖的寬度(pulse width),然后當比較相等的事件發(fā)生時,把output拉成low,再用另外一個compare register設(shè)定一個更大的時間,當時間到了之后把timer歸0,你就做出了PWM了。
參考:
https://embedded-note.hackpad.com/ep/pad/static/aUAsaFTHTUf
?
轉(zhuǎn)載于:https://www.cnblogs.com/biglucky/p/4894982.html
總結(jié)
以上是生活随笔為你收集整理的Timer和counter的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在企业工作一年多的几点感悟
- 下一篇: 对于路由地址并未切换,但是地址栏发生地址