我又回來寫學習筆記了。
前面我寫過一篇 stm32 的一些新名詞的彙總,當時是剛學到定時器,現在定時器學完了,突然想來彙總一下定時器的用法,於是這篇博客誕生了。
文章出現的資料是江協視頻下的:
https://www.bilibili.com/video/BV1th411z7sn/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click&vd_source=e836ee461d07a48f2161731d0ca031f0
(一)定時器中斷#
定時器中斷,顧名思義就是通過定時器計數觸發中斷。
首先開啟時鐘,使用RCC_APB1PeriphClockCmd函數(無論做什麼事情都要先開啟時鐘),如果用外部引腳記得用使用RCC_APB2PeriphClockCmd函數開啟時鐘並且用GPIO_Init初始化引腳才行。
定時器有四種模式:內部時鐘模式、外部時鐘模式 1 和 2、編碼器模式。我們想配置定時器中斷就要從這四種模式裡挑一種出來用,其中外部中斷模式 1 跟 2 區別在於模式 2 是事件中斷,不中斷程序正常運行。
配置內部時鐘的函數為:TIM_InternalClockConfig,參數只需要配置的定時器名稱。
配置外部時鐘模式 2 的函數為:TIM_ETRClockMode2Config,參數需要定時器名稱,定時器預分頻,計數方式(高電平計數還是低電平),濾波。
配置外部時鐘模式 1 的函數為:TIM_ETRClockMode1Config,這個沒用過,上網搜索也含糊不清,就不講了。
配置捕獲通道的函數為:TIM_ICInit,參數需要定時器名稱和輸入捕獲結構體的地址,結構體後面講。
江科大視頻中是教了內部時鐘模式和外部時鐘模式 2 兩種模式使用。
然後我們配置時基單元,使用的函數是TIM_TimeBaseInit,需要定時器名稱和時基單元結構體的地址作為參數。
時機單元結構體中主要包括分頻、計數方式(一般用向上計數)、ARR 和 PSC 寄存器的值(這倆分別是計數周期和預分頻),還有個重複計數器,我們學的是通用定時器,沒有這個功能。
接下來我們使用TIM_ITConfig開啟中斷,在這之前還要用TIM_ClearFlag(TIMx, TIM_FLAG_Update)
清除更新標誌位,因為TIM_TimeBaseInit函數末尾,手動產生了更新事件,若不清除此標誌位,則開啟中斷後,會立刻進入一次中斷。
最後我們配置 NVIC,使用NVIC_PriorityGroupConfig和NVIC_Init配置中斷順序即可,然後使用TIM_Cmd開啟定時器即可。
(二)輸出比較#
輸出比較其實就是輸出一種 PWM 波(暴論),其中有很多模式選擇,但一般直接用 PWM 模式 1 或者 2。
首先還是要開啟時鐘,使用RCC_APB1PeriphClockCmd函數,記得用使用RCC_APB2PeriphClockCmd函數開啟時鐘並且用GPIO_Init初始化引腳才行。
然後用TIM_InternalClockConfig配置內部時鐘(其實沒必要,默認就是內部時鐘。)
接著配置時基單元,跟前面一樣。
然後我們需要使用TIM_OC1Init配置通道一的輸出比較函數,這邊提到一共有四個輸出比較通道,每個通道都有特定的引腳與之相連,需要查看引腳定義圖來選擇,該函數需要的參數有定時器名稱和輸出比較結構體,結構體中包括配置的模式(選 PWM1 就行)、輸出極性、CCR 的值,CCR 是輸出比較寄存器,與計數器 CNT 比較發出高低電平。
最後用TIM_Cmd開啟定時器即可。
需要提到的還有TIM_SetCompare1函數,這是用來更改 CCR 的值的。
(三)輸入捕獲#
輸入捕獲就是使用定時器捕獲電流中的高低電平計算輸入頻率用的。
前兩步跟前面的一樣,開啟時鐘並配置時基單元,不過這裡要把 ARR 拉到最大,防止計數器溢出,就需要把它設為 65535。
然後我們調用TIM_ICInit配置輸入捕獲模式(PWMI 模式則用TIM_PWMIConfig),需要的參數有通道(這裡跟輸出比較一樣有四個通道,每個通道對應不同引腳,需要查看引腳定義圖選擇)、濾波、輸入極性、預分頻、信號交叉(這個在 PWMI 模式中會用到,一般只需要選直連就可以了)
接下來用TIM_SelectInputTrigger和TIM_SelectSlaveMode選擇觸發源及從模式。
觸發源中的 TI1FP1 和 TI1FP2 分別表示通道一和二(話說怎麼沒看到通道三和四的),從模式選擇復位(Reset),即 TI1 產生上升沿時,會觸發 CNT 歸零。
最後TIM_Cmd開啟定時器即可。
需要提到的函數還有TIM_GetCapture1和TIM_GetCapture2,這倆是對 CRR1 和 CRR2 進行讀數,在普通模式下,二者都表示捕獲的頻率,而在 PWMI 模式下,CRR1 表示捕獲頻率,CRR2 表示低電平的頻率,CRR2/CRR1 為佔空比。
(四)編碼器模式#
編碼器模式是專門用於測編碼器輸出頻率的模式,只能用通道一二。
配置編碼器模式跟配置輸入捕獲的方法大致相同,區別在於編碼器模式需要兩個引腳,捕獲通道也要用TIM_ICInit配置兩個。
接下來用TIM_EncoderInterfaceConfig配置編碼器模式,需要的參數有定時器名稱、在 TI1 和 TI2 哪裡計數(選 TI12 就可以了,不知道設置另外的兩個是幹什麼用的。)、兩極性(這裡的極性的意思是是否反向,就是如果你覺得編碼器旋轉計數方向要改一下就把其中一個極性改一下就行)。
最後用TIM_Cmd開啟定時器即可。
我們可以用TIM_GetCounter函數讀取編碼器的值。
那麼學過的定時器用法就這麼多,寫博客前還覺得自己已經了解得差不多了,結果真來寫了還是理解得太膚淺了,而且寫得很匆忙,不知道有沒有錯誤的地方。