電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 35|回復: 0
收起左側

HAL庫 CubeMX 配置 高級定時器 TIM1 詳解

[復制鏈接]
跳轉到指定樓層
樓主
匿名  發(fā)表于 2024-11-16 09:33:00 回帖獎勵 |倒序瀏覽 |閱讀模式
實驗目標:
通過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é)省運行資源。

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有賬號?立即注冊

x
回復

使用道具

發(fā)表回復

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關注微信 下載APP 返回頂部 返回列表