STM32CubeMX教程8 TIM 通用定时器 - 输出比较
1、準備材料
開發板(STM32F407G-DISC1)
ST-LINK/V2驅動
STM32CubeMX軟件(Version 6.10.0)
keil μVision5 IDE(MDK-Arm)
邏輯分析儀nanoDLA
2、實驗目標
使用STM32CubeMX軟件配置STM32F407通用定時器的輸出比較通道,并將其輸出到四個LED燈引腳實現LED燈流水燈效果
3、實驗流程
3.0、前提知識
STM32F407的定時器通道均可以實現輸出比較功能,輸出比較功能是利用當前計數值CNT與捕獲/比較寄存器CRR的值作比較,如果值相等就會產生輸出比較結果,此時也會產生輸出比較完成中斷或DMA請求
定時器產生的輸出比較結果可以輸出到比較通道的具體引腳上,也可以直接內部使用不輸出到引腳,具體輸出的電平由比較模式和輸出極性共同決定
輸出比較模式有①凍結:保持當前電平、②匹配時輸出有效電平、③匹配時輸出無效電平、④匹配時翻轉輸出電平、⑤強制輸出有效電平和⑥強制輸出無效電平六種模式
有效電平可以手動設置為高/低電平
3.1、CubeMX相關配置
請先閱讀“STM32CubeMX教程1 工程建立”實驗3.4.1小節配置RCC和SYS
3.1.1、時鐘樹配置
系統時鐘樹配置與上一實驗一致,均設置為STM32F407總線能達到的最高時鐘頻率,具體如下圖所示
3.1.2、外設參數配置
在Pinout & Configuration頁面右邊芯片引腳預覽Pinout view中找到LED燈的四個控制引腳PD12、PD13、PD14和PD15,依次左鍵單擊并配置其功能為TIM4_CHx
然后在頁面左側功能分類欄目中點開Timers欄目,單擊欄目下的TIM4,并將其Channel1~4全部配置為Output Compare CHx
具體配置如下圖所示
然后對啟用的TIM4定時器的四個通道參數進行設置,下面對重要參數介紹
①首先對計數器參數的設置與之前講解的一致,這里不再贅述,周期設為500ms,不分頻不預裝載
②四個通道的輸出比較模式均選擇為了Toggle on match,即當比較寄存器CCR的值和當前定時器計數值CNT匹配時翻轉通道引腳輸出狀態,四個通道從上到下其比較寄存器的值CCR依次為999、1999、2999和3999,這表示在一個時鐘500ms周期內,通道1、2、3和4分別在100ms、200ms、300ms和400ms的時候翻轉其對應通道引腳的值
③輸出比較四個通達均不啟用預裝載,通道輸出有效狀態為高電平,其他的模式如其字面意思較為好理解,這里不再過多闡述
具體的參數配置如下圖所示
3.1.3、外設中斷配置
在Pinout & Configuration頁面左邊System Core/NVIC中勾選TIM4全局中斷,然后選擇合適的中斷優先級即可
3.2、生成代碼
請先閱讀“STM32CubeMX教程1 工程建立”實驗3.4.3小節配置Project Manager
單擊頁面右上角GENERATE CODE生成工程
3.2.1、外設初始化函數調用流程
在生成的工程代碼主函數main()中調用了MX_TIM4_Init()函數完成了對TIM4基本定時器參數,輸出比較通道1/2/3/4參數的配置
然后在HAL_TIM_OC_Init()函數中調用了HAL_TIM_OC_MspInit()函數對TIM4時鐘和中斷進行了使能,并對中斷優先級進行了配置
最后在MX_TIM4_Init()函數末尾調用了HAL_TIM_MspPostInit()函數對TIM4的四個輸出比較通道引腳進行了復用設置,從而完成了整個初始化過程
如下圖所示為TIM4輸出比較初始化的具體函數調用流程
3.2.2、外設中斷函數調用流程
再來看看輸出比較中斷回調函數流程,使能定時器全局中斷后在stm32f4xx_it.c中自動生成了TIM4的中斷處理函數TIM4_IRQHandler
TIM4_IRQHandler調用了HAL庫的定時器中斷處理函數HAL_TIM_IRQHandler,這個函數負責處理所有的定時器相關中斷
通過判斷中斷來源及相關寄存器,最終輸出比較事件完成的回調函數為HAL_TIM_OC_DelayElapsedCallback(或者是HAL_TIM_PWM_PulseFinishedCallback)(注釋1),該函數為虛函數,需要用戶重新實現
如下圖所示為TIM4輸出比較中斷回調的具體函數調用流程
該實驗目標不需要動態修改輸出比較的參數,因此筆者這里沒有重新在tim.c中重新實現該回調函數,需要提醒的是,輸出比較事件完成時會同時進入HAL_TIM_OC_DelayElapsedCallback和HAL_TIM_PWM_PulseFinishedCallback兩個回調函數中,因此請注意此實驗確保注釋掉PWM輸出實驗中HAL_TIM_PWM_PulseFinishedCallback函數體內動態修改占空比的代碼,否則將達不到預期效果
3.2.3、添加其他必要代碼
最后只需要在主函數中啟動定時器(注釋2),啟動輸出比較通道就可以實現本實驗目標,啟動代碼如下圖所示
源代碼如下
HAL_TIM_Base_Start(&htim4);
HAL_TIM_OC_Start(&htim4, TIM_CHANNEL_1);
HAL_TIM_OC_Start(&htim4, TIM_CHANNEL_2);
HAL_TIM_OC_Start_IT(&htim4, TIM_CHANNEL_3);
HAL_TIM_OC_Start_IT(&htim4, TIM_CHANNEL_4);
4、常用函數
/*啟動輸出比較通道*/
HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
/*停止輸出比較通道*/
HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
/*以中斷方式啟動輸出比較通道*/
HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
/*停止以中斷方式啟動的輸出比較通道*/
HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
/*輸出比較通道完成回調函數*/
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
5、燒錄驗證
5.1、具體步驟
“設置TIM4的4個通道為輸出比較到通道 -> 配置TIM4基本參數及4個輸出比較通道參數 -> NVIC中勾選TIM4全局中斷并設置合適中斷優先級 -> 在主函數中使用HAL_TIM_Base_Start(&htim4)啟動定時器TIM4 -> 然后使用HAL_TIM_OC_Start_IT(&htim4, TIM_CHANNEL_x)函數開啟四個通道的輸出比較”
5.2、實驗現象
燒錄程序,上電單片機啟動后會發現開發板上的四個LED燈,按照綠、橙、紅和藍的順序依次點亮,然后不斷循環,實際現象如下圖所示
使用邏輯分析儀監測TIM4的四個輸出通道引腳,可以看出TIM4的四個通道輸出的電平翻轉周期均為500ms,并且4個通道間每個通道均間隔100ms相繼翻轉狀態
6、注釋詳解
注釋1:在生成PWM波的實驗中提到其使用的中斷回調函數HAL_TIM_PWM_PulseFinishedCallback也可以換成輸出比較完成的回調函數HAL_TIM_OC_DelayElapsedCallback,因為筆者發現在HAL庫的定時器中斷處理函數HAL_TIM_IRQHandler中,這兩個函數是同時調用的,也就是說調用函數1,函數2也會跟著調用,所以筆者認為兩個都可以使用
注釋2:筆者發現在啟動輸出比較/輸入捕獲/PWM輸出時,可以不調用定時器啟動函數,執行HAL_TIM_xx_Start/HAL_TIM_xx_Start_IT函數時會自動啟動定時器;另外HAL_TIM_OC_Start/HAL_TIM_OC_Start_IT兩個輸出比較啟動函數和HAL_TIM_PWM_Start/HAL_TIM_PWM_Start_IT兩個PWM輸出啟動函數,除了函數名和一些注釋外其函數體內的代碼一模一樣;
更多內容請瀏覽 OSnotes的CSDN博客
總結
以上是生活随笔為你收集整理的STM32CubeMX教程8 TIM 通用定时器 - 输出比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CMU DLSys 课程笔记 2 - M
- 下一篇: 如何在GitHub正确提PR(Pull