實驗目標:
通過CUbeMX+HAL,配置TIM1,1s中斷一次,閃爍LED。
一、常用型號的TIM時鐘頻率1. STM32F103系列:
所有 TIM 的時鐘頻率都是72MHz;
F103C8不帶基本定時器,F(xiàn)103RC及以上才帶基本定時器。
2、STM32F407系列:
TIM1、8、9、10、11的時鐘頻率是168MHz;
其它TIM的時鐘頻率是84MHz。
二、CubeMX配置 這里使用現(xiàn)有的CubeMX工程,略過工程配置部分。
如果學習如何新建CubeMX工程, 可以參考下面文章:
STM32CubeMX新建一個工程_STM32F103
STM32CubeMX新建一個工程_STM32F407
使用CubeMX對定時器進行定時配置,過程相當簡單便捷。
我們只需配置幾個重要參數(shù):時鐘源、PSC、ARR、中斷。
1、主要參數(shù)配置
主要參數(shù)講解:
① Prescaler(預分頻系數(shù)):即PSC寄存器值。簡單地理解:內(nèi)部時鐘分頻后再給CNT計數(shù)器使用,用于控制每一計數(shù)脈沖的時長。按上文內(nèi)容得知,STM32F407的TIM1時鐘是168M,在設置預分頻為168后,計數(shù)脈沖頻率:168MHz÷168=1MHz,即每秒產(chǎn)生1百萬個計數(shù)信號,每個計數(shù)脈沖的時長:1秒/1M=1us。
② Counter Mode (計數(shù)方向): 向上計數(shù);
③ Counter Period (計數(shù)周期): 即ARR寄存器值,多少個計數(shù)脈沖作為1個波形周期。
④ Repetition Counter(重復計數(shù)器): 簡單地理解,多少個周期才觸發(fā)1次中斷;
⑤ auto-reload preload (自動重載值的預裝載): 當改變周期值ARR時,是否等到下一個更新事件再寫入數(shù)值,使得數(shù)值的更改不影響執(zhí)行中的波形。
2、打開中斷
高級定時器,和通用定時器不同,即使沒有使能通道,也有多種中斷。
本篇只使用了周期更新中斷,如下圖, 打勾: update interrupt (更新中斷) 。
當計數(shù)器(CNT)的值,達到周期值(ARR)時,就會觸發(fā)中斷。
注意:打勾中斷后,生成的代碼,只是幫我們添加了中斷的配置; 而中斷的開啟,需要使用代碼“手動”開啟。
三、編寫代碼 代碼共為3部分:初始化配置、開啟TIM、中斷回調函數(shù)。
1、初始化配置
CubeMX根據(jù)我們的配置,已生成好了初始化代碼,我們不用管它。
如果想查看它的初始化實現(xiàn)過程,可以雙擊 "tim.c"。
2、開啟TIM、中斷
謹記一個,當我們使用CubeMX配置外設功能時,它只是根據(jù)參數(shù)的配置生成初始化代碼(即上面的第1步),而不會主動開啟外設功能,特別是中斷的開啟,如TIM、ADC、UART等。
所以,我們需要在main.c中,“手動”開啟TIM1。
如下圖,在while前,添加:
HAL_TIM_Base_Start_IT(&htim1);
調用HAL_TIM_Base_Start_IT(&htim1)后,TIM1就會開始工作。
下面是它的工作原理,硬件自動運行,不用干預,我們只需大概地知道工作過程、原理:
① TIM會自動檢測脈沖信號,每來一個脈沖,計數(shù)器CNT就會硬件自動加1。
② 當寄存器CNT的計數(shù)值==設定的自動重裝載值ARR,就會產(chǎn)生溢出中斷。
③ 發(fā)生溢出中斷時,CNT值被硬件置0,開始新一輪計數(shù); 硬件自動找尋中斷服務函數(shù)入口。
使用CubeMX生成的HAL代碼,我們不需要像使用標準庫時那樣自己編寫中斷函數(shù),CubeMX已幫我們整理好中斷函數(shù)的跳轉,只需要重寫中斷回調函數(shù)。
3、重寫TIM1的中斷回調函數(shù)
按上面CubeMX的配置,我們使用了周期中斷(計數(shù)器CNT溢出),當中斷觸發(fā)時,硬件會自動調用相關的中斷服務函數(shù),而中斷服務函數(shù)里,CubeMX的工程會調用回調函數(shù):
HAL_TIM_PeriodElapsedCallback();
即:即1周期結束,硬件自動調用中斷服務函數(shù),繼而調用回調函數(shù),我們無需干預。
我們只需在工程中任意一個c文件里編寫這個回調函數(shù)。
習慣上,會在main.c的尾部編寫這個函數(shù)。
如下圖,我們在main.c的 注釋行 /* USER CODE BEGIN 4 */ 下面編寫它。
如果工程中已有這個函數(shù),我們只需在函數(shù)內(nèi)增加TIM2的判斷部分;
如果工程中沒有這個函數(shù),增加即可。
注意:所有TIM的計數(shù)器溢出中斷(即1周期結束), 都會統(tǒng)一調用它。
在這個回調函數(shù)中,我們執(zhí)行的動作是:每1000ms, 反轉PB2電平(LED)。
如果你的開發(fā)板上,PB2引腳接的是 LED, 而且也初始化成輸出模式,它就會每1秒閃爍1次。
4、優(yōu)化思路:
上述操作,將會每1s進入1000次中斷,當發(fā)現(xiàn)變量cnt累加到1000后,才反轉LED。
頻繁地出入中斷,大大地浪費著芯片運行資源。本篇如此設計,僅為了直觀地展示和理解。
我們在設計時,應該盡量地節(jié)省運行資源。
上面的定時操作,有多種優(yōu)化的方法:
方法1:原參數(shù)不改,重復計數(shù)器Repetition Counter改為1000, 即1000個周期才產(chǎn)生1次中斷;
方法2:psc改為16800(脈沖0.0001s),ARR改為10000(1萬個脈沖組成1周期)
然后,修改回調函數(shù),取消計數(shù)判斷那部分。
這樣修改后,將會每1s進入1次中斷,調用回調函數(shù)1次,能有效地節(jié)省運行資源。
|