溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

STM32基礎(chǔ)定時器有什么用

發(fā)布時間:2021-12-27 11:13:31 來源:億速云 閱讀:292 作者:小新 欄目:互聯(lián)網(wǎng)科技

小編給大家分享一下STM32基礎(chǔ)定時器有什么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

定時器最基本的功能就是定時處理事情。比如定時發(fā)送USART數(shù)據(jù)、定時采集AD數(shù)據(jù)、定時檢測IO口電位、還可以通過IO口輸出波形等??梢詫崿F(xiàn)非常豐富的功能。定時器是一個很強大的外設(shè),不同行業(yè)使用的方式不同,知識面很廣。

01、定時器介紹

首先我們可以在STM32F207數(shù)據(jù)手冊找到定制器的資源,從下圖可以看到STM32F207一共10個通用定時器,2個高級定時器,2個基本定時器。

STM32基礎(chǔ)定時器有什么用

不同定時器的區(qū)別

STM32基礎(chǔ)定時器有什么用

在STM32F207的用戶參考手冊中可以看到定時器的基本框圖,下圖是定時器1&8的看圖。

STM32基礎(chǔ)定時器有什么用

①CK_PSC是定時器時鐘TIMxCLK,經(jīng)APB1預(yù)分頻器后分頻提供。

②定時器時鐘經(jīng)過PSC 預(yù)分頻器之后,即CK_CNT,用來驅(qū)動計數(shù)器計數(shù)。

③計數(shù)器CNT 是一個16 位的計數(shù)器,向上,向下,向上/下計數(shù)模式,最大計數(shù)值為65535。當計數(shù)達到自動重裝載寄存器的時候產(chǎn)生更新事件,并清零從頭開始計數(shù)。

④自動重裝載寄存器ARR 是一個16位的寄存器,這里面裝著計數(shù)器能計數(shù)的最大數(shù)值。當計數(shù)到這個值的時候,如果使能了中斷的話,定時器就產(chǎn)生溢出中斷。

定時器說白了就是個計數(shù)器,就像我們用心跳粗略估算時間一樣,心臟跳動粗略可以認為是1s,那么我們計時60次心跳就過了60秒。其中CK_CNT時鐘就類似心跳,CNT計數(shù)器就類似心跳次數(shù)。舉一個極端簡單的例子,我們要實現(xiàn)60秒定時,CK_CNT是1s,我們設(shè)置CNT計數(shù)器向上計數(shù)開啟中斷,因為只有溢出時,也就是計數(shù)到65535時才會有中斷,那么我們設(shè)置CNT計數(shù)器為65535-60=65475,開始及時,那么60秒后就會產(chǎn)生中斷。我們設(shè)置自動重裝載寄存器ARR也為65475,當CNT計數(shù)器溢出時,自動重裝載寄存器ARR就會自動裝載到CNT計數(shù)器中,就能實現(xiàn)自動循環(huán)定時60秒。

經(jīng)過上面分析,精確定時的關(guān)鍵在于CK_CNT的頻率,而CK_CNT是由定時器時鐘分頻而來的。那么我們就要知道timer3的定時器時鐘。我們就要看時鐘系統(tǒng)部分,具體看文章《STM32F207時鐘系統(tǒng)解析》,這篇文章主要講解了系統(tǒng)的120M時鐘如何從外部的25M的晶振得到的。其中說到APB外設(shè)時鐘的問題。

定時器在APB定時器時鐘下,具體在APB1還是在APB2時鐘下我們可以從STM32F207數(shù)據(jù)手冊上看到,圖片名字STM32F20xblock diagram。

STM32基礎(chǔ)定時器有什么用

從上文我們看timer3是在APB1下的。

那么我們來分析APB1的頻率

STM32基礎(chǔ)定時器有什么用

從上圖看出,APB1定時器的從系統(tǒng)120M時鐘(系統(tǒng)時鐘可配置的,我們使用默認的120M時鐘)經(jīng)過AHB分頻,APB分頻得到的。

在這里說上圖紅框中的“錯誤”,萌新可能不太理解。首先手冊中少了個右括號。修改后應(yīng)該為:

if(APBx presc == 1)
    X1
else
    X2

也就是說

APB分頻系數(shù)如果是1,頻率不變,APB輸出的頻率就是APB下面時鐘的頻率。

APB分頻系數(shù)不是1,頻率X2,APB輸出的頻率乘以2是APB下面時鐘的頻率。

下面我們分析APB1時鐘,從system_stm32f2xx.c中的SetSysClock函數(shù)中如下

/* HCLK = SYSCLK / 1*/
RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
    
/* PCLK2 = HCLK / 2*/
RCC->CFGR |=RCC_CFGR_PPRE2_DIV2;
    
/* PCLK1 = HCLK / 4*/
RCC->CFGR|= RCC_CFGR_PPRE1_DIV4;

可以看到AHB分頻系數(shù)是1,APB1分頻系數(shù)是4。

timer3的時鐘為120M/1/4*2= 60MHZ。

這里有個疑問,ST提供的system_stm32f2xx.c注釋為什么是HCLK,PCLK2,PCLK1,卻沒有上文提到的APB,AHB字眼,具體看下我之前寫過的文章《STM32F207時鐘系統(tǒng)解析》。

其實我們出了分析代碼,system_stm32f2xx.c文件頭也是有注釋的,方便查看。

STM32基礎(chǔ)定時器有什么用

當然,這要求我們的外部晶振是25M的,且system_stm32f2xx.c是沒有被修改過的,如果大家需要修改這個文件單片機超頻運行,建議把文件頭的注釋修改,養(yǎng)成一個良好的習慣。

03、時基單元

可編程高級定時器控制模塊主要是一個帶有相關(guān)自動重載16位計數(shù)器。這個計數(shù)器可以向上計數(shù),向下計數(shù)或者交替遞增和遞減計數(shù)。計數(shù)器時鐘可以通過一個分頻器分頻。

計數(shù)器的自動重載寄存器和預(yù)分頻寄存器可以通過軟件讀寫。即使當計數(shù)器正在運行也可以讀寫。

時基單元包括

  1. 計數(shù)器寄存器 (TIMx_CNT)

  2. 預(yù)分頻器寄存器 (TIMx_PSC)

  3. 自動重載寄存器 (TIMx_ARR)

  4. 重復(fù)計數(shù)器寄存器 (TIMx_RCR)

自動重載寄存器是預(yù)裝載的。從自動重載寄存器寫入或讀取會訪問預(yù)裝載寄存器。預(yù)裝載寄存器的內(nèi)容既可以直接傳送到影子寄存器,也可以在每次發(fā)生更新事件(UEV)時傳送到影子寄存器,這取決于TIMx_CR1 寄存器中的自動重載預(yù)裝載使能位(ARPE)。當計數(shù)器達到上溢值(或者在遞減計數(shù)時達到下溢值)并且TIMx_CR1 寄存器中的UDIS 位為0時,將發(fā)送更新事件。該更新事件也可由軟件產(chǎn)生。

計數(shù)器由預(yù)分頻器輸出CK_CNT 提供時鐘,僅當TIMx_CR1 寄存器中的計數(shù)器啟動位(CEN)置1 時,才會啟動計數(shù)器。

預(yù)分頻器說明

預(yù)分頻器可對計數(shù)器時鐘頻率進行分頻,分頻系數(shù)介于1 和65536 之間。該預(yù)分頻器基于TIMx_PSC寄存器中的16 位寄存器所控制的16位計數(shù)器。由于該控制寄存器具有緩沖功能,因此可對預(yù)分頻器進行實時更改。而新的預(yù)分頻比將在下一更新事件發(fā)生時被采用。

下圖以一些示例說明在預(yù)分頻比實時變化時計數(shù)器的行為。

預(yù)分頻器分頻由1 變?yōu)? 時的計數(shù)器時序圖

STM32基礎(chǔ)定時器有什么用

預(yù)分頻器分頻由1 變?yōu)? 時的計數(shù)器時序圖

STM32基礎(chǔ)定時器有什么用

04、計數(shù)模式

4.1、向上計數(shù)模式

在向上計數(shù)模式中,計數(shù)器從0增加到自動重載值(TIMx_ARR寄存器的值),然后從0重新開始并產(chǎn)生一個計數(shù)器溢出事件。

如果使用重復(fù)計數(shù)器,則當遞增計數(shù)的重復(fù)次數(shù)達到重復(fù)計數(shù)器寄存器中編程的次數(shù)加一次(TIMx_RCR+1)后,將生成更新事件(UEV)。否則,將在每次計數(shù)器上溢時產(chǎn)生更新事件。

將TIMx_EGR寄存器的UG位置1通過軟件或使用從模式控制器時,也將產(chǎn)生更新事件。

通過軟件將TIMx_CR1寄存器中的UDIS位置1可禁止UEV事件。這可避免向預(yù)裝載寄存器寫入新值時更新影子寄存器。在UDIS位寫入0之前不會產(chǎn)生任何更新事件。不過,計數(shù)器和預(yù)分頻器計數(shù)器都會重新從0開始計數(shù)(而預(yù)分頻比保持不變)。此外,如果TIMx_CR1寄存器中的URS位(更新請求選擇)已置1,則將UG位置1會生成更新事件UEV,但不會將UIF標志置1(因此,不會發(fā)送任何中斷或DMA請求)。這樣一來,如果在發(fā)生捕獲事件時將計數(shù)器清零,將不會同時產(chǎn)生更新中斷和捕獲中斷。

發(fā)生更新事件時,將更新所有寄存器且將更新標志(TIMx_SR寄存器中的UIF位)置1取決于URS位)

  1. 重復(fù)計數(shù)器中將重新裝載TIMx_RCR寄存器的內(nèi)容

  2. 自動重載影子寄存器將以預(yù)裝載值 (TIMx_ARR) 進行更新

  3. 預(yù)分頻器的緩沖區(qū)中將重新裝載預(yù)裝載值(TIMx_PSC寄存器的內(nèi)容)

計數(shù)器時序圖,1 分頻內(nèi)部時鐘

STM32基礎(chǔ)定時器有什么用

計數(shù)器時序圖,2 分頻內(nèi)部時鐘

STM32基礎(chǔ)定時器有什么用

從上面兩圖看出,中斷標志是需要軟件清除的

計數(shù)器時序圖,ARPE=0 時更新事件(TIMx_ARR 未預(yù)裝載)

STM32基礎(chǔ)定時器有什么用

從上面兩圖看出,向上計數(shù),還沒有到達0x36,就把自動重載寄存器修改為0x36,就會在計數(shù)到0x36時產(chǎn)生動作。

計數(shù)器時序圖,ARPE=1 時更新事件(TIMx_ARR 預(yù)裝載)

STM32基礎(chǔ)定時器有什么用

從上面兩圖看出,向上計數(shù),還沒有到達0x36,就把自動重載預(yù)裝載寄存器修改為0x36,就不會在計數(shù)到0x36時產(chǎn)生動作,會在這個時將自動重載預(yù)裝載寄存器值賦給自動重載影子寄存器。

4.2、向下計數(shù)模式

在向下計數(shù)模式中,計數(shù)器從自動重載值(TIMx_ARR寄存器的值)向下計數(shù)到0,然后從自動重載值(重新開始并產(chǎn)生一個計數(shù)器溢出事件。

如果使用重復(fù)計數(shù)器,則當遞減計數(shù)的重復(fù)次數(shù)達到重復(fù)計數(shù)器寄存器中編程的次數(shù)加一次(TIMx_RCR+1)后,將生成更新事件(UEV)。否則,將在每次計數(shù)器下溢時產(chǎn)生更新事件。

將TIMx_EGR 寄存器的UG 位置1(通過軟件或使用從模式控制器)時,也將產(chǎn)生更新事件。

通過軟件將TIMx_CR1 寄存器中的UDIS 位置1 可禁止UEV 更新事件。這可避免向預(yù)裝載寄存器寫入新值時更新影子寄存器。在UDIS 位寫入0之前不會產(chǎn)生任何更新事件。不過,計數(shù)器會重新從當前自動重載值開始計數(shù),而預(yù)分頻器計數(shù)器則重新從0 開始計數(shù)(但預(yù)分頻比保持不變)。

此外,如果TIMx_CR1 寄存器中的URS 位(更新請求選擇)已置1,則將UG 位置1 會生成更新事件UEV,但不會將UIF 標志置1(因此,不會發(fā)送任何中斷或DMA 請求)。這樣一來,如果在發(fā)生捕獲事件時將計數(shù)器清零,將不會同時產(chǎn)生更新中斷和捕獲中斷。

發(fā)生更新事件時,將更新所有寄存器且將更新標志(TIMx_SR 寄存器中的UIF 位)置1(取決于 URS 位):

  1. 重復(fù)計數(shù)器中將重新裝載 TIMx_RCR 寄存器的內(nèi)容

  2. 預(yù)分頻器的緩沖區(qū)中將重新裝載預(yù)裝載值( TIMx_PSC 寄存器的內(nèi)容)

  3. 自動重載活動寄存器將以預(yù)裝載值( TIMx_ARR 寄存器的內(nèi)容)進行更新。注意,自動重載寄存器會在計數(shù)器重載之前得到更新,因此,下一個計數(shù)周期就是我們所希望的新的周期長度

以下各圖以一些示例說明當TIMx_ARR=0x36 時不同時鐘頻率下計數(shù)器的行為

計數(shù)器時序圖,1 分頻內(nèi)部時鐘

STM32基礎(chǔ)定時器有什么用

計數(shù)器時序圖,2 分頻內(nèi)部時鐘

STM32基礎(chǔ)定時器有什么用

計數(shù)器時序圖,未使用重復(fù)計數(shù)器時更新事件

STM32基礎(chǔ)定時器有什么用

4.3、中央對齊(向上/向下計數(shù)模式)

在中心對齊模式下,計數(shù)器從0 開始計數(shù)到自動重載值(TIMx_ARR 寄存器的內(nèi)容)-1,生成計數(shù)器上溢事件;然后從自動重載值開始向下計數(shù)到1 并生成計數(shù)器下溢事件。之后從0開始重新計數(shù)。

當TIMx_CR1 寄存器中的CMS位不為“00”時,中心對齊模式有效。將通道配置為輸出模式時,其輸出比較中斷標志將在以下模式下置1,即:計數(shù)器遞減計數(shù)(中心對齊模式1,CMS=“01”)、計數(shù)器遞增計數(shù)(中心對齊模式2,CMS =“10”)以及計數(shù)器遞增/遞減計數(shù)(中心對齊模式3,CMS =“11”)。

在此模式下,TIMx_CR1 寄存器的DIR 方向位不可寫入值,而是由硬件更新并指示當前計數(shù)器方向。

每次發(fā)生計數(shù)器上溢和下溢時都會生成更新事件,或?qū)IMx_EGR 寄存器中的UG 位置1(通過軟件或使用從模式控制器)也可以生成更新事件。這種情況下,計數(shù)器以及預(yù)分頻器計數(shù)器將重新從0 開始計數(shù)。

通過軟件將TIMx_CR1 寄存器中的UDIS 位置1 可禁止UEV 更新事件。這可避免向預(yù)裝載寄存器寫入新值時更新影子寄存器。在UDIS 位寫入0 之前不會產(chǎn)生任何更新事件。不過,計數(shù)器仍會根據(jù)當前自動重載值進行遞增和遞減計數(shù)。

此外,如果TIMx_CR1 寄存器中的URS 位(更新請求選擇)已置1,則將UG 位置1 會生成UEV 更新事件,但不會將UIF 標志置1(因此,不會發(fā)送任何中斷或DMA 請求)。這樣一來,如果在發(fā)生捕獲事件時將計數(shù)器清零,將不會同時產(chǎn)生更新中斷和捕獲中斷。

發(fā)生更新事件時,將更新所有寄存器且將更新標志(TIMx_SR 寄存器中的UIF 位)置1(取決于URS 位):

  1. 重復(fù)計數(shù)器中將重新裝載 TIMx_RCR 寄存器的內(nèi)容

  2. 預(yù)分頻器的緩沖區(qū)中將重新裝載預(yù)裝載值( TIMx_PSC 寄存器的內(nèi)容)

  3. 自動重載活動寄存器將以預(yù)裝載值( TIMx_ARR 寄存器的內(nèi)容)進行更新。注意,如果更新操作是由計數(shù)器上溢觸發(fā)的,則自動重載寄存器在重載計數(shù)器之前更新,因此,下一個計數(shù)周期就是我們所希望的新的周期長度(計數(shù)器被重載新的值)。

以下各圖以一些示例說明不同時鐘頻率下計數(shù)器的行為

計數(shù)器時序圖,1 分頻內(nèi)部時鐘,TIMx_ARR = 0x6

STM32基礎(chǔ)定時器有什么用

計數(shù)器時序圖,2 分頻內(nèi)部時鐘

STM32基礎(chǔ)定時器有什么用

計數(shù)器時序圖,ARPE=1 時的更新事件(計數(shù)器下溢)

STM32基礎(chǔ)定時器有什么用

計數(shù)器時序圖,ARPE=1 時的更新事件(計數(shù)器上溢)

STM32基礎(chǔ)定時器有什么用

05、基礎(chǔ)定時代碼

10ms中斷配置代碼

STM32基礎(chǔ)定時器有什么用

關(guān)于設(shè)置分頻值

TIM3CLK = 2 * PCLK1=2*HCLK / 4= HCLK / 2 = SystemCoreClock /2=60MHZ

所以下圖紅框內(nèi)就是TIM3CLK

STM32基礎(chǔ)定時器有什么用

這里的值是分頻系數(shù)=TIM3CLK/定時器實際頻率,所以定時器頻率是10000,也就是說除數(shù)就是定時器頻率。一個clk是1/10000s。定時時間=1/10000*定時器重載值。根據(jù)上面的配置,定時器重載值是100,也就是定時器中斷周期是=1/10000*100=0.01s=10ms,也就是100HZ。

如果在定時器翻轉(zhuǎn)LED燈,那么LED燈閃爍頻率是50Hz。

上面的的分頻值當然可以直接賦值5999,如果想修改為定時器頻率為1000,那么還要重新計算。如果按照上面的寫法,直接將除數(shù)修改為1000即可。

看到這里大家會有疑問,給的重載值明明是99,分頻率值也減去1。下面將說明分頻值和自動重載周期值都需要減去1的原因。

自動重載值:因為從0開始計算,賦值10,從0開始計數(shù)到10是11次。

分頻值:在TIMx_PSC寄存器有以下描述。

STM32基礎(chǔ)定時器有什么用

特別說明

時鐘分頻因子

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2;

其實仔細看過技術(shù)手冊后發(fā)現(xiàn)這句話與PWM輸出實驗其實是沒關(guān)系的,這句話是設(shè)置定時器時鐘(CK_INT)頻率與數(shù)字濾波器(ETR,TIx)使用的采樣頻率之間的分頻比例的(與輸入捕獲相關(guān)),0表示濾波器的頻率和定時器的頻率是一樣的。

首先這個colck_division時鐘分割系數(shù)并不是對定時器的時鐘頻率進行分割。我們都知道輸入捕獲模式下有一個數(shù)字濾波器,這個數(shù)字濾波器可以通過配置寄存器改變他的采樣頻率,從而將一些頻率濾除。

具體細節(jié)在輸入捕獲中詳解。

我們也可以根據(jù)定時器的計數(shù)器的特性,使用查詢計數(shù)器的方法實現(xiàn)精確延時。

以上是“STM32基礎(chǔ)定時器有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI