STM32之TIM定時器的使用詳解
一、簡介
定時器可以對輸入的時鐘進行計數(shù),并在計數(shù)值達到設定值時觸發(fā)中斷
定時器最核心的部分叫做時基單元,由計數(shù)器、預分頻器、自動重裝寄存器構成
STM32定時器的功能十分豐富,不僅有定時中斷功能,還有內外時鐘源選擇、輸入捕獲、輸出比較、主從觸發(fā)模式等多種功能
根據(jù)復雜度和應用場景定時器分為高級、通用、基本三個類型的定時器,我們一起來梳理一下基本定時器和通用定時器,高級定時器就不再梳理了,太復雜
二、基本定時器
基本定時器是定時器里結構最簡單的,功能最少的定時器,我們先從基本定時器開始學習
基本定時器只能接內部時鐘,所以上方控制器相當于通路,然后連接到PSC預分頻器上,這個預分頻器就是用來對時鐘分頻的,計數(shù)器占用一份,預分頻器占用x份,由于時基單元的三個器件都是16位的,所以x的取值在0 ~ 2^16-1,所以最大的分頻效果為1/(2 ^16),此時計數(shù)器的分頻最小,可計時的時間最長,每一個上升沿計數(shù)器就加1,在72MHz的內部時鐘的頻率下的計時時間最長是59s多,超過這個時間就要從0再開始計時了
自動重裝寄存器的作用是存儲一個閾值,當計數(shù)器達到這個值時觸發(fā)中斷(就是上圖的UI,更新中斷),清零計數(shù)器(就是上圖的U,更新事件,觸發(fā)內部其他電路的工作)
U更新事件通過主模式可以映射到TRGO直接觸發(fā)DAC(數(shù)模轉換器,就是實現(xiàn)數(shù)字信號與模擬信號的轉換),過程不需要軟件參與,實現(xiàn)了硬件的自動化,這就是主模式的作用
三、通用定時器
1、時鐘源選擇
- 在通用定時器中的時鐘源可以有選擇了,不一定非得要用內部時鐘,在TIMx_ETR引腳處接入外部時鐘經(jīng)過極性選擇、邊沿檢測和預分頻器以及濾波后接入觸發(fā)控制器,此時這個外部時鐘就可以被使用了
- 通過TRGI這一路可以實現(xiàn)定時器級聯(lián)功能,因為TRGO可以連接至ITR,這一路可以開啟定時器的從模式,實現(xiàn)定時器1更新事件驅動定時器2時基單元的效果,定時器1達到閾值時定時器2加1,這樣就可以實現(xiàn)計時時長指數(shù)級的增長
- 然后時鐘還可以通過TIIF_ED也就是CH1引腳,以及TI1FP1也就是CH1引腳的時鐘、TI2FP2也就是CH2引腳的時鐘來設定
2、時基單元
通用定時器的計數(shù)器除了向上計數(shù)還有向下計數(shù)和中央對齊計數(shù)
- 向下計數(shù):設置一個基準值,從這個基準值開始向下減,直到計數(shù)器值為0,申請中斷
- 中央對齊計數(shù):設置一個基準值,從0開始計數(shù)到該值,申請中斷,計數(shù)器不清零,然后向下減直到計數(shù)器為0,申請中斷,再重復自增再自減的過程
3、輸出比較和輸入捕獲電路
最下邊這一塊電路是輸入捕獲和輸出比較電路
(1)輸出比較
輸出比較可以通過比較CNT(計數(shù)器)與CCR(捕獲/比較)寄存器值的關系,來對輸出電平進行置1、置0或翻轉的操作,用于輸出一定頻率和占空比的PWM波形
①PWM波形
PWM就是脈沖寬度調制,在具有慣性的系統(tǒng)中,可以對一系列脈沖的寬度進行調制,來等效地獲得所需要的模擬參量,可以通過控制頻率來做到電機控速等效果
- 頻率為1/Ts , 占空比為Ton/Ts , 分辨率為占空比的變化步距
- 占空比越高,越接近高電平,占空比越低,越接近低電平
- 占空比如果按照1%、2%、3%的步距變化,那么分辨率就是1%
- 占空比如果按照10%、20%、30%的步距變化,分辨率就是10%
②通用定時器的輸出比較電路
CNT與CCR1進行比較,當CNT>=CCR1時,就會給輸出模式控制器傳一個信號,然后輸出模式控制器就會改變它輸出OC1ref的電平(然后可以將OCref映射到主模式TRGO輸出上去),然后遇到一個門,是一個極性選擇門,CC1P寄存器寫0,信號從上通道通過,也就是信號電平不翻轉,CC1P寄存器寫1,信號從下通道非門通過,執(zhí)行邏輯取反,也就是信號電平翻轉
③輸出模式控制器的邏輯
該控制器是可以由寄存器OC1M[2:0]控制的
模式 | 描述 |
---|---|
凍結 | CNT=CCR時,REF保持原狀態(tài) |
匹配時置有效電平 | CNT=CCR時,REF置有效電平 |
匹配時置無效電平 | CNT=CCR時,REF置無效電平 |
匹配時電平翻轉 | CNT=CCR時,REF電平翻轉 |
強制為無效電平 | REF強制為無效電平 |
強制為有效電平 | REF強制為有效電平 |
PWM模式1 | 向上計數(shù):CNT<CCR時,REF置有效電平,CNT>=CCR時,REF置無效電平 |
PWM模式2 | 向上計數(shù):CNT<CCR時,REF置無效電平,CNT>=CCR時,REF置有效電平 |
這里的有效電平和無效電平可以被認為是高電平和低電平
其實除了PWM模式以外其他的都沒啥用
④輸出比較基本結構
時鐘接到預分頻器上,像上面提到的一樣,通過運行控制寄存器來操作時基單元,然后計數(shù)器CNT不斷計數(shù)并且不斷與CCR進行比較,這里我們CCR的模式是比較常用的PWM1,然后輸出REF波形,原理如下圖所示:
- 當CNT < CCR,輸出REF高電平,當CNT >= CCR時,輸出REF低電平
- 可以看出PWM頻率就等于計數(shù)器的更新頻率
- 占空比就是CCR/(ARR+1),與計數(shù)器值無關,因為計數(shù)器計數(shù)值是一個線性變化的量
- 分辨率就是占空比變化步距,與CCR和ARR有關
(2)輸入捕獲
- 輸入捕獲模式下,當通道輸入引腳出現(xiàn)指定電平跳變時,當前CNT的值被寫入到CCR中,可用于測量PWM波形的頻率、占空比、脈沖間隔、電平持續(xù)時間等參數(shù)
- 可配置為PWMI模式,同時測量頻率和占空比
- 可配合主從觸發(fā)模式,實現(xiàn)硬件全自動測量
①測頻率的方法
- 高頻信號測量頻率適合用測頻法:在一定時間T內,對上升沿計N次,頻率為N/T,且更新慢,得到的值波動小,可以通過計數(shù)器計數(shù)以及計時器計時來達到效果
- 低頻信號測量頻率適合用測周法:在兩個上升沿也就是一個周期內,用一頻率f計N次,頻率為f/N,且更新快,得到的值波動大,
- 測量頻率的時候N越大,誤差越小,測頻法與測周法誤差相等的頻率為中界頻率,此時兩種方法計次N相同
②輸入捕獲電路
- 濾波器:連續(xù)多個采樣,在多個采樣相同時輸出采樣電平,不同時輸出不變,起到濾波的作用
- CCER寄存器中的CC1P位選擇信號極性
- CCMR1中的CC1S位對數(shù)據(jù)進行選擇,ICPS位控制上面的分頻器
- CCER中的CC1E可以控制控制信號使能或者失能
③主從觸發(fā)模式
- 主從是一個形象的描述,被描述者就是STM32
- 主模式就是將內部信號映射到TRGO引腳,用于觸發(fā)別的外設
- 從模式就是接受一個外設產(chǎn)生的觸發(fā)源信號,產(chǎn)生TRGI控制自身
④輸入捕獲基本結構
時基單元連接到時鐘上,這都是基本操作,不必多說,然后GPIO輸入上方波形信號,經(jīng)過濾波器選擇TI1FP1為上升沿(下降沿)觸發(fā),經(jīng)過分頻器分頻,當TI1FP1出現(xiàn)上升沿(下降沿)之后,CNT當前計數(shù)值傳到CCR1里,同時選擇TI1FP1為觸發(fā)源,然后開啟從模式,可以設置從模式觸發(fā)CNT清零
可以看到波形圖在上升沿時將CNT的值給到CCR1,同時將CNT的值置為0,然后在沒有再次出現(xiàn)上升沿的過程中CNT持續(xù)計數(shù),再次出現(xiàn)上升沿時重復上述過程
⑤PWMI基本結構
- PWMI模式:使用兩個通道來捕獲頻率和占空比
可以看到和上一個電路里的區(qū)別就是下路加了一個TI1FP2,用來捕獲下降沿,出現(xiàn)下降沿時讓CNT的值賦給CCR2,這樣就記錄了電平為高電平期間的計數(shù)值,且不清零CNT,占空比就可以用CCR2/CCR1得出
4、定時中斷基本結構
up整理的圖是非常通俗易懂的,時鐘可以選擇內部時鐘和外部時鐘(編碼器就不看了),外部時鐘又可以選擇直接接入GPIO的外部時鐘ETR引腳,也可以選擇觸發(fā)輸入外部時鐘,也就是ERT、ITRx、TIx某一個,通過運行控制來操作時基單元,然后接到中斷輸出控制,中斷輸出控制用來控制中斷,它對于NVIC的作用就相當于NVIC對于CPU的作用,起到一個篩選的作用,被允許才能接到NVIC
5、預分頻器時序
- CK_PSC是預分頻器的輸入時鐘
- CNT_EN是計數(shù)器使能,高電平計數(shù)器正常運行,低電平計數(shù)器停止
開始時,計數(shù)器未使能,定時器時鐘不運行,使能后前半段預分頻器系數(shù)為1,此時定時器時鐘CK_CNT與預分頻器的輸入時鐘CK_PSC相同,后半段預分頻器系數(shù)為2,此時定時器時鐘CK_CNT一個周期等于預分頻器的輸入時鐘CK_PSC兩個周期
- 在計數(shù)器時鐘的驅動下,計數(shù)器寄存器在時鐘上升沿時自增,從圖中可以看出自動重裝器的數(shù)值為FC,因為在此之后變?yōu)?
- 在計數(shù)器寄存器由FC變?yōu)?時,產(chǎn)生一個更新事件
下面三行表示的是預分頻器的緩沖機制:
在更改預分頻控制寄存器時,預分頻控制寄存器立刻變化,但是會在當前這個計數(shù)周期結束后更新到預分頻緩沖器中
預分頻計數(shù)器用來做分頻指示,在1分頻時計數(shù)器就是000000這樣計數(shù),控制相應的波形不會發(fā)生變化,在2分頻時計數(shù)器就是010101這樣計數(shù),波形在0的上升沿發(fā)生變化,周期變?yōu)樵瓉淼膬杀?,如?分頻,那么計數(shù)器就是012012這樣計數(shù),相對應的周期就會變?yōu)樵瓉淼娜?/p>
6、計數(shù)器時序
內部時鐘分頻因子就是分頻系數(shù),也就是2分頻
在計數(shù)器寄存器置0的時候,計數(shù)器溢出,發(fā)生更新事件,更新中斷標志置1,當更新中斷標志置1時會去申請中斷,中斷響應后需要在中斷程序中手動清零
當然,計數(shù)器、預分頻器、自動重裝寄存器、捕獲/比較寄存器都是有緩沖機制的,效果與上小節(jié)一樣,而且它們是可以手動選擇是否開啟的
四、RCC時鐘樹
先來看時鐘的初始化:
ST公司幫我們實現(xiàn)了SystemInit函數(shù),這個函數(shù)是先將內部晶振①線路接通,先以8MHz運行,然后接通外部晶振②線路,走到PLLMUL中,發(fā)生倍頻,從外部輸入的8MHz倍頻為72MHz
下邊有個CSS,時鐘安全系統(tǒng),負責切換時鐘,一旦外部時鐘失效,自動切換為內部時鐘,保證系統(tǒng)時鐘的運行,防止程序卡死
我們一般使用外部晶振,因為外部石英晶振比內部的RC震蕩電路要穩(wěn)定
進入到AHB中,AHB總線中有預分頻器,在SystemInit里配置的分配系數(shù)為1,所以AHB中的時鐘為72MHz,進入APB1總線,APB1的預分頻器在SystemInit里配置的分頻系數(shù)為2,所以APB1的時鐘為36MHz,它連接的普通外設的時鐘為36MHz,而因為APB1的預分頻系數(shù)不為1,所以連接定時器2~7的頻率要 * 2,也就是連接定時器2 ~ 7的時鐘為72MHz
APB2在SystemInit里配置的分配系數(shù)為1,所以APB2連接所有外設的時鐘都是72MHz
除此以外我們可以看到每一個線路連接外設之前都會和外設時鐘使能經(jīng)過一個與門,這個外設時鐘使能就是RCC_APB2/1PeriphClockCmd作用的地方,打開時鐘就是在這個位置寫1,可以讓時鐘通過與門輸出給外設
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
一文掌握C++ const與constexpr及區(qū)別
C++ 11標準中,const 用于為修飾的變量添加“只讀”屬性而 constexpr關鍵字則用于指明其后是一個常量,編譯器在編譯程序時可以順帶將其結果計算出來,而無需等到程序運行階段,這樣的優(yōu)化極大地提高了程序的執(zhí)行效率,本文重點介紹C++ const與constexpr區(qū)別介紹,一起看看吧2024-02-02Win10下最新版CLion(2020.1.3)安裝及環(huán)境配置教程詳解
這篇文章主要介紹了Win10下最新版CLion(2020.1.3)安裝及環(huán)境配置,CLion 是 JetBrains 推出的全新的 C/C++ 跨平臺集成開發(fā)環(huán)境,本文給大家介紹的非常詳細,需要的朋友可以參考下2020-08-08