天天看點

STM32Cube-定時器中斷

stm32的定時器功能非常強大,包括基本定時器,通用定時器以及進階定時器。 本章介紹定時器的基本應用,通過定時器中斷控制LED閃爍,間隔1s.

這一章我們在前一章GPIO的工程修改。複制GPIO的工程,修改檔案夾名。點XXX.ioc擊打開STM32cubeMX的工程檔案重新配置。開啟定時器TIM3,選擇内部時鐘。

另外,關于HAL庫API的使用方法可以到ST官網下載下傳:https://www.stmcu.com.cn/Index/search?search_keywords=UM1725

STM32Cube-定時器中斷

定時器就相當于單片機的鬧鐘,下面我們以基本定時器為例簡單介紹一下定時器。

STM32Cube-定時器中斷

從上圖我們可以看到,基本定時器主要由下面三個寄存器組成。

· 計數器寄存器 (TIMx_CNT)

· 預分頻器寄存器 (TIMx_PSC)

· 自動重載寄存器 (TIMx_ARR)

計數器寄存器 (TIMx_CNT)存儲的是目前的計數值。預分頻器 (TIMx_PSC)為多少個SK_PSC脈沖計數一次,如圖145 預分頻器的值為1(預分頻寄存器預設為0,為不分頻),則為兩個脈沖計數一次。即為二分頻。如果要10000分頻,則預分頻器的值為1000-1。

STM32Cube-定時器中斷

自動重裝寄存器 (TIMx_ARR)存儲的是計數器的溢出值,例如圖147中計數器遞增計數到36計數器溢出,觸發一次事件。而實際上為37個脈沖觸發一次溢出事件(從0開始計數)。

STM32Cube-定時器中斷

要确定定時的時間我們必須先确定CK_PSC的頻率,TIM3配置中選擇内部時鐘作為時鐘源,檢視資料手冊可以知道TIM3是挂接到APB1時鐘線上。

STM32Cube-定時器中斷

這裡時鐘選擇為 APB1 的 2 倍,而 APB1 為 36M。

STM32Cube-定時器中斷

定時器計算公式:Tout= ((arr+1)*(psc+1))/Tclk;

其中:

Tclk: TIM3 的輸入時鐘頻率(機關為 Mhz)。

Tout: TIM3 溢出時間(機關為 us)。

若要定時時間為1s,則即可設定7200分頻(預分頻器寄存器 (TIMx_PSC)的值為7200-1),定時器的時鐘CK_CNT的頻率為10000Hz.則自動重載寄存器 (TIMx_ARR)設定為10000-1即定時為1s.TRGO為觸發輸出,可以觸發内部ADC/DAC,這裡我們沒有用到這個功能,參數為預設設定。

STM32Cube-定時器中斷
STM32Cube-定時器中斷

定時器有如下三種計數模式

遞增計數模式:計數器從 0 計數到自動重載值,然後重新從 0 開始計數并生成計數器上溢事件。

遞減計數模式:計數器從自動重載值開始遞減到 0,然後重新從自動重載值開始計數并生成計數器下溢事件。

中心對齊模式:計數器從 0 開始計數到自動重載值 – 1 ,生成計數器上溢事件;然後從自動重載值開始向下計數到 1 并生成計數器下溢事件。之後從0 開始重新計數。

在NVIC Settings框勾選開啟定時器中斷。優先級為預設。或者在NVIC配置中使能TIM3中斷。

STM32Cube-定時器中斷
STM32Cube-定時器中斷

生成報告,以及生成代碼,編譯程式。

打開main.c檔案。把main()函數裡while循環上一章的代碼删掉,while循環裡面為空。在main.c檔案後面USER CODE BEGIN 4 和 USER CODE END 4 中間添加中斷回調函數。定時器中斷處理函數中翻轉一次LED2的電平。

STM32Cube-定時器中斷
STM32Cube-定時器中斷

在main.c檔案中while(1)循環前面添加代碼啟動基本定時器中斷模式計數

STM32Cube-定時器中斷

在main()函數中調用HAL_TIM_Base_Start_IT(&htim3)開啟定時器,定時器從0開始計數,當計數到10000-1,即9999時,産出上溢出事件,計數器又從0開始繼續計數。由于我們開啟了定時器中斷,是以發生上溢出事件時會觸發定時器中斷。程式會轉跳到中斷服務函數中運作。我們在中斷服務函數中翻轉LED的電平。下次定時器再次溢出觸發中斷繼續翻轉LED的電平。是以我們會看到LED不斷閃爍。

我也總結了這章的文檔,可以去下載下傳 https://download.csdn.net/download/zdw6868/10653993

關于HAL庫API的使用方法可以到ST官網下載下傳:https://www.stmcu.com.cn/Index/search?search_keywords=UM1725