stm32的定時器功能非常強大,包括基本定時器,通用定時器以及進階定時器。 本章介紹定時器的基本應用,通過定時器中斷控制LED閃爍,間隔1s.
這一章我們在前一章GPIO的工程修改。複制GPIO的工程,修改檔案夾名。點XXX.ioc擊打開STM32cubeMX的工程檔案重新配置。開啟定時器TIM3,選擇内部時鐘。
另外,關于HAL庫API的使用方法可以到ST官網下載下傳:https://www.stmcu.com.cn/Index/search?search_keywords=UM1725
定時器就相當于單片機的鬧鐘,下面我們以基本定時器為例簡單介紹一下定時器。
從上圖我們可以看到,基本定時器主要由下面三個寄存器組成。
· 計數器寄存器 (TIMx_CNT)
· 預分頻器寄存器 (TIMx_PSC)
· 自動重載寄存器 (TIMx_ARR)
計數器寄存器 (TIMx_CNT)存儲的是目前的計數值。預分頻器 (TIMx_PSC)為多少個SK_PSC脈沖計數一次,如圖145 預分頻器的值為1(預分頻寄存器預設為0,為不分頻),則為兩個脈沖計數一次。即為二分頻。如果要10000分頻,則預分頻器的值為1000-1。
自動重裝寄存器 (TIMx_ARR)存儲的是計數器的溢出值,例如圖147中計數器遞增計數到36計數器溢出,觸發一次事件。而實際上為37個脈沖觸發一次溢出事件(從0開始計數)。
要确定定時的時間我們必須先确定CK_PSC的頻率,TIM3配置中選擇内部時鐘作為時鐘源,檢視資料手冊可以知道TIM3是挂接到APB1時鐘線上。
這裡時鐘選擇為 APB1 的 2 倍,而 APB1 為 36M。
定時器計算公式: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,這裡我們沒有用到這個功能,參數為預設設定。
定時器有如下三種計數模式
遞增計數模式:計數器從 0 計數到自動重載值,然後重新從 0 開始計數并生成計數器上溢事件。
遞減計數模式:計數器從自動重載值開始遞減到 0,然後重新從自動重載值開始計數并生成計數器下溢事件。
中心對齊模式:計數器從 0 開始計數到自動重載值 – 1 ,生成計數器上溢事件;然後從自動重載值開始向下計數到 1 并生成計數器下溢事件。之後從0 開始重新計數。
在NVIC Settings框勾選開啟定時器中斷。優先級為預設。或者在NVIC配置中使能TIM3中斷。
生成報告,以及生成代碼,編譯程式。
打開main.c檔案。把main()函數裡while循環上一章的代碼删掉,while循環裡面為空。在main.c檔案後面USER CODE BEGIN 4 和 USER CODE END 4 中間添加中斷回調函數。定時器中斷處理函數中翻轉一次LED2的電平。
在main.c檔案中while(1)循環前面添加代碼啟動基本定時器中斷模式計數
在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