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