1、準(zhǔn)備材料
開發(fā)板(STM32F407G-DISC1)
STM32CubeMX軟件(Version 6.10.0)
keil μVision5 IDE(MDK-Arm)
ST-LINK/V2驅(qū)動
邏輯分析儀nanoDLA
2、實驗?zāi)繕?biāo)
使用STM32CubeMX軟件配置STM32F407通用定時器的輸出比較通道,并將其輸出到四個LED燈引腳實現(xiàn)LED燈流水燈效果
3、實驗流程
3.0、前提知識
STM32F407的定時器通道均可以實現(xiàn)輸出比較功能,輸出比較功能是利用當(dāng)前計數(shù)值CNT與捕獲/比較寄存器CRR的值作比較,如果值相等就會產(chǎn)生輸出比較結(jié)果,此時也會產(chǎn)生輸出比較完成中斷或DMA請求
定時器產(chǎn)生的輸出比較結(jié)果可以輸出到比較通道的具體引腳上,也可以直接內(nèi)部使用不輸出到引腳,具體輸出的電平由比較模式和輸出極性共同決定
輸出比較模式有①凍結(jié):保持當(dāng)前電平、②匹配時輸出有效電平、③匹配時輸出無效電平、④匹配時翻轉(zhuǎn)輸出電平、⑤強(qiáng)制輸出有效電平和⑥強(qiáng)制輸出無效電平 六種模式
有效電平可以手動設(shè)置為高/低電平
3.1、CubeMX相關(guān)配置
3.1.0、工程基本配置
打開STM32CubeMX軟件,單擊ACCESS TO MCU SELECTOR選擇開發(fā)板MCU(選擇你使用開發(fā)板的主控MCU型號),選中MCU型號后單擊頁面右上角Start Project開始工程,具體如下圖所示
開始工程之后在配置主頁面System Core/RCC中配置HSE/LSE晶振,在System Core/SYS中配置Debug模式,具體如下圖所示
詳細(xì)工程建立內(nèi)容讀者可以閱讀“STM32CubeMX教程1 工程建立”
3.1.1、時鐘樹配置
系統(tǒng)時鐘使用8MHz外部高速時鐘HSE,HCLK、PCLK1和PCLK2均設(shè)置為STM32F407能達(dá)到的最高時鐘頻率,具體如下圖所示
3.1.2、外設(shè)參數(shù)配置
在Pinout & Configuration頁面右邊芯片引腳預(yù)覽Pinout view中找到LED燈的四個控制引腳PD12、PD13、PD14和PD15,依次左鍵單擊并配置其功能為TIM4_CHx
然后在頁面左側(cè)功能分類欄目中點(diǎn)開Timers欄目,單擊欄目下的TIM4,并將其Channel1~4全部配置為Output Compare CHx
具體配置如下圖所示
然后對啟用的TIM4定時器的四個通道參數(shù)進(jìn)行設(shè)置,下面對重要參數(shù)介紹
Prescaler 、 Counter Mode 、 Counter Period 和 auto-reload preload 等計數(shù)器參數(shù)的設(shè)置與之前的實驗講解一致,這里不再贅述,周期設(shè)為500ms,不分頻不預(yù)裝載
Output Compare Channel x / Mode (輸出比較模式)均選擇了Toggle on match,即當(dāng)比較寄存器CCR的值和當(dāng)前定時器計數(shù)值CNT匹配時翻轉(zhuǎn)通道引腳輸出狀態(tài)
四個通道從上到下其 Pulse (比較寄存器的值CCR)依次為999、1999、2999和3999,這表示在一個時鐘500ms周期內(nèi),通道1、2、3和4分別在100ms、200ms、300ms和400ms的時候翻轉(zhuǎn)其對應(yīng)通道引腳的狀態(tài)
輸出比較四個通道 Output compare preload (輸出比較預(yù)裝載)均為Disable, CH Polarity (通道輸出有效狀態(tài))均為高電平,輸出比較的其他模式如其字面意思較為好理解,這里不再過多闡述,具體的參數(shù)配置如下圖所示
3.1.3、外設(shè)中斷配置
在Pinout & Configuration頁面左邊System Core/NVIC中勾選TIM4全局中斷,然后選擇合適的中斷優(yōu)先級即可
3.2、生成代碼
3.2.0、配置Project Manager頁面
單擊進(jìn)入Project Manager頁面,在左邊Project分欄中修改工程名稱、工程目錄和工具鏈,然后在Code Generator中勾選“Gnerate peripheral initialization as a pair of 'c/h' files per peripheral”,最后單擊頁面右上角GENERATE CODE生成工程,具體如下圖所示
詳細(xì)Project Manager配置內(nèi)容讀者可以閱讀“STM32CubeMX教程1 工程建立”實驗3.4.3小節(jié)
3.2.1、外設(shè)初始化函數(shù)調(diào)用流程
在生成的工程代碼主函數(shù)main()中調(diào)用了MX_TIM4_Init()函數(shù)完成了對TIM4基本定時器參數(shù),輸出比較通道1/2/3/4參數(shù)的配置
然后在HAL_TIM_OC_Init()函數(shù)中調(diào)用了HAL_TIM_OC_MspInit()函數(shù)對TIM4時鐘和中斷進(jìn)行了使能,并對中斷優(yōu)先級進(jìn)行了配置
最后在MX_TIM4_Init()函數(shù)末尾調(diào)用了HAL_TIM_MspPostInit()函數(shù)對TIM4的四個輸出比較通道引腳進(jìn)行了復(fù)用設(shè)置,從而完成了整個初始化過程
如下圖所示為TIM4輸出比較初始化的具體函數(shù)調(diào)用流程
3.2.2、外設(shè)中斷函數(shù)調(diào)用流程
再來看看輸出比較中斷回調(diào)函數(shù)流程,使能定時器全局中斷后在stm32f4xx_it.c中自動生成了TIM4的中斷處理函數(shù)TIM4_IRQHandler
TIM4_IRQHandler調(diào)用了HAL庫的定時器中斷處理函數(shù)HAL_TIM_IRQHandler,這個函數(shù)負(fù)責(zé)處理所有的定時器相關(guān)中斷
通過判斷中斷來源及相關(guān)寄存器,最終輸出比較事件完成的回調(diào)函數(shù)為HAL_TIM_OC_DelayElapsedCallback()(或者是HAL_TIM_PWM_PulseFinishedCallback()) (注釋1),該函數(shù)為虛函數(shù),需要用戶重新實現(xiàn)
如下圖所示為TIM4輸出比較中斷回調(diào)的具體函數(shù)調(diào)用流程
該實驗?zāi)繕?biāo)不需要動態(tài)修改輸出比較的參數(shù),因此筆者這里沒有重新在tim.c中重新實現(xiàn)該回調(diào)函數(shù)
需要提醒的是,輸出比較事件完成時會同時進(jìn)入HAL_TIM_OC_DelayElapsedCallback()和HAL_TIM_PWM_PulseFinishedCallback()兩個回調(diào)函數(shù)中,因此請注意此實驗確保注釋掉PWM輸出實驗中HAL_TIM_PWM_PulseFinishedCallback函數(shù)體內(nèi)動態(tài)修改占空比的代碼,否則將達(dá)不到預(yù)期效果
3.2.3、添加其他必要代碼
最后只需要在主函數(shù)中啟動定時器 (注釋2),啟動輸出比較通道就可以實現(xiàn)本實驗?zāi)繕?biāo),啟動代碼如下圖所示
源代碼如下
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ù)
/*啟動輸出比較通道*/
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)
/*輸出比較通道完成回調(diào)函數(shù)*/
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
5、燒錄驗證
燒錄程序,上電單片機(jī)啟動后會發(fā)現(xiàn)開發(fā)板上的四個LED燈,按照綠、橙、紅和藍(lán)的順序依次點(diǎn)亮,然后不斷循環(huán),實際現(xiàn)象如下圖所示
使用邏輯分析儀監(jiān)測TIM4的四個輸出通道引腳,可以看出TIM4的四個通道輸出的電平翻轉(zhuǎn)周期均為500ms,并且4個通道間每個通道均間隔100ms相繼翻轉(zhuǎn)狀態(tài)
6、注釋詳解
注釋1:在生成PWM波的實驗中提到其使用的中斷回調(diào)函數(shù)HAL_TIM_PWM_PulseFinishedCallback也可以換成輸出比較完成的回調(diào)函數(shù)HAL_TIM_OC_DelayElapsedCallback,因為筆者發(fā)現(xiàn)在HAL庫的定時器中斷處理函數(shù)HAL_TIM_IRQHandler中,這兩個函數(shù)是同時調(diào)用的,也就是說調(diào)用函數(shù)1,函數(shù)2也會跟著調(diào)用,所以筆者認(rèn)為兩個都可以使用文章來源:http://www.zghlxwxcb.cn/news/detail-777167.html
注釋2:筆者發(fā)現(xiàn)在啟動輸出比較/輸入捕獲/PWM輸出時,可以不調(diào)用定時器啟動函數(shù),執(zhí)行HAL_TIM_xx_Start/HAL_TIM_xx_Start_IT函數(shù)時會自動啟動定時器;另外HAL_TIM_OC_Start/HAL_TIM_OC_Start_IT兩個輸出比較啟動函數(shù)和HAL_TIM_PWM_Start/HAL_TIM_PWM_Start_IT兩個PWM輸出啟動函數(shù),除了函數(shù)名和一些注釋外其函數(shù)體內(nèi)的代碼一模一樣文章來源地址http://www.zghlxwxcb.cn/news/detail-777167.html
到了這里,關(guān)于STM32CubeMX教程8 TIM 通用定時器 - 輸出比較的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!