從來沒有一個外設能夠這么騷~那說的就是定時器了,或者說沒有了定時器的MCU就不完整。
只能說沒有定時器的單片機不值得被愛
OKOK,不騷了,這篇文章就是回答幾個在我研究過程中比較疑惑的問題。
所以是可以確定一點的就是,如果你想讓你的定時器非常精確,那你一定要有一個很穩的時基,這里就是時鐘樹。
痛苦的回憶來了,具體要查你的定時器在哪里掛著
還想罵的一點是,不知道為什么定時器還排起了輩分按說是從簡單到難,但是ARM構架似乎是一把梭哈。
事實上大多數文章都是拿這個圖說事情的,我也不能免俗
這個可編程定時器的主要部分是一個帶有自動重裝載的16位累加計數器,計數器的時鐘通過一個預分頻器得到。
軟件可以讀寫計數器、自動重裝載寄存器和預分頻寄存器,即使計數器運行時也可以操作。這個的優點就是可以在運行時改變定時器的計數功能。
時基單元包含:
這三個寄存器之間的關系正是本文要說明的
寫32的對這個不陌生吧?
那你一定知道,這個就叫定時器的溢出時間
定時器溢出是指定時器在計數過程中由于計數器位數有限,導致計數值從最大值溢出到0的情況。這一般會觸發定時器溢出中斷,用于周期性任務調度。
定時器溢出的工作原理是:
定時器包含一個計數器寄存器,例如16位,則可以計數0-65535。
定時器以某個時鐘頻率進行計數累加。
當計數值增大到計數器的最大值65535時,在下一個時鐘沿到來時,計數器會重新循環回0。
這就是溢出情況,在硬件上會觸發溢出標志位。
如果溢出中斷被使能,則會觸發中斷服務程序。
這樣每當定時器計數一次0-65535的周期,就會觸發一次溢出中斷。
通過設置定時器的預分頻和定時周期,可以確定溢出中斷的周期。
在中斷服務程序中可以進行需要周期執行的任務,例如定時發送、系統節拍等。
OK,溢出時間就是一個計數值(其實是一種標志),和你的手表上面的秒針一樣。假如你還是看不懂,那你看我以前寫的文章吧。
關于單片機定時器的個人看法
51單片機定時器詳細全解.上
51單片機定時器詳細全解.下
ESP8266定時器.上
51單片計4種定時器應用場景詳解
現在繼續說,上面的Tout是兩個寄存器的值控制的,直觀的來說,我們就關心比值而已,但是具體他們兩個怎么給,是沒有文章給的,那鄙人就斗膽給出看法。
STM32定時器中的ARR和PSC寄存器分別用于設置定時器的自動重裝載值和預分頻系數,它們共同決定了定時器的溢出時間。
ARR寄存器:自動重裝載寄存器,包含一個32位的值,用于設置定時器從0開始計數到ARR值后再清零的循環周期。這個周期時間就是定時器的溢出時間。
PSC寄存器:預分頻寄存器,包含一個16位的值,可以對定時器的時鐘進行預分頻,即將外部時鐘頻率分頻后用于定時器計數。
溢出時間計算:
周期時間 = (PSC+1) * (ARR+1) / 時鐘頻率
舉例: 時鐘頻率=1MHz
如果PSC=9,ARR=999
則周期時間 = (10*1000)/1MHz = 10ms
通過調整PSC和ARR的值,可以獲得需要的溢出周期時間。
所以簡單來說,PSC控制分頻比例,ARR控制計數最大值,兩者結合產生定時器的溢出周期及中斷間隔時間。
好像也和其它的文章沒有不一樣,那假如這樣呢?
對于STM32定時器的ARR和PSC寄存器在設置定時周期時間時,通常的考慮是: 優先設置PSC進行分頻,將時鐘頻率降低到某個合適的范圍。 然后設置ARR的值來獲得想要的定時周期。 這樣的主要考慮有: PSC決定了計數器計數的速度,ARR則決定了計數的最大值。
在主鏈路上面
如果不設置PSC,在高頻時鐘下ARR的計數速度會非常快,難以達到較長定時周期。 分頻比PSC設置合理,可以讓計數速度在一個易控制的范圍內。 一般將PSC設置為能讓計數周期在1ms到幾十ms的范圍內。 而后通過ARR的值剛好可以讓計數剛好溢出,得到想要的定時。 所以通常情況下,會首先考慮PSC的分頻比,然后再設置ARR計數周期的值,PSC對定時周期影響較大。 如果時鐘源較低頻,可直接設置較大的ARR值,不必過多分頻。 那簡單的設計一個東西先,
對于使用STM32定時器進行精確計時和定時操作,一個通用的設計思路是:
選擇一個定時器,例如TIM2。
配置定時器的時鐘源,預分頻值PSC和自動重裝載ARR,以生成想要的定時周期,例如設置為1ms。
配置定時器工作在計數模式,從0開始向上計數,到ARR值產生更新中斷或溢出中斷。
在中斷服務函數中,檢查當前的計數值,根據所設定的定時需求執行操作:
通過不斷比較當前計數值,當計數到設定定時周期時,執行所需的處理操作。
定時精度取決于定時器時鐘源頻率,可以通過配置更高頻率時鐘來獲得更高精度。
再給出寄存器的一些干預場景
生成定時中斷
ARR設置中斷周期,例如設置為1000,則每1000計數周期會觸發一次更新中斷。
PSC設置時鐘分頻系數,例如分頻比為7200,時鐘頻率72MHz。則中斷周期為1000 * 7200 / 72000000 = 0.1s。
輸入捕獲
當外部信號被捕獲時,會寫入定時器的捕獲寄存器中。
可以設置兩個通道捕獲,通過讀取兩個寄存器的值計算出信號的周期、頻率、占空比等。
輸出比較輸出PWM
ARR設置PWM的周期,PSC設置分頻系數。
通過輸出比較寄存器可改變PWM的占空比。
編碼器模式
使用兩個定時器設置為編碼器模式,可讀取編碼器的計數值。
其中PSC可設置編碼計數的分頻系數。
設定軟件定時器
在中斷或程序中,每次讀取定時器計數值,與上次值作差計算時間差。
PSC和ARR設定計數范圍。
讓我來一個漂亮的收尾,ARR和PSC這兩個寄存器主要影響定時器的以下兩個方面:
影響定時器的計數范圍
ARR determines定時器計數器計數的最大值。ARR為16位,則計數范圍為0-65535。
PSC為定時器輸入時鐘設置預分頻系數,將輸入時鐘分頻后作為計數時鐘。
PSC越大,實際計數速度越慢,計數范圍相應變大。
影響定時器的溢出周期
定時器以分頻后的時鐘計數,當計數值增大到ARR的值時,會觸發溢出。
溢出周期= (PSC+1) * (ARR+1) / 時鐘頻率
所以改變PSC和ARR可以改變溢出周期,從而改變中斷周期。
總結一下:
ARR直接決定計數器的計數范圍
PSC決定計數器計數的速度
兩者一同決定定時器的溢出周期時間
審核編輯:劉清
-
寄存器
+關注
關注
31文章
5363瀏覽量
120940 -
計數器
+關注
關注
32文章
2261瀏覽量
94875 -
PSC
+關注
關注
0文章
15瀏覽量
7754 -
ARM架構
+關注
關注
15文章
177瀏覽量
36371 -
stm32定時器
+關注
關注
0文章
13瀏覽量
2301
原文標題:STM32定時器之ARR,PSC倆兄弟
文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論