STM32CubeMX教程6 TIM 通用定时器 - 生成PWM波
1、準備材料
開發(fā)板(STM32F407G-DISC1)
ST-LINK/V2驅(qū)動
STM32CubeMX軟件(Version 6.10.0)
keil μVision5 IDE(MDK-Arm)
邏輯分析儀nanoDLA
3、實驗流程
3.0、前提知識
STM32F407有10個通用定時器,其中TIM2、TIM3、TIM4和TIM5有4個捕獲/比較通道,TIM9、TIM12兩個定時器有2個捕獲/比較通道,剩下的TIM10、TIM11、TIM13和TIM14只有一個捕獲/比較通道,只有一個捕獲/比較通道的通用定時器在CubeMX配置頁面無“Slave Mode”和“Trigger Source”的選項,也不能聯(lián)合通道,相較于擁有多個捕獲/比較通道的定時器較為簡單,這10個通用定時器具體特性如下表所示(注釋1)
對于通用定時器來說,其每個通道均可以實現(xiàn)①輸入捕獲、②輸出比較、③PWM波生成三種功能,接下來我將分三個實驗來分別介紹通用定時器的這三個功能,本小節(jié)只介紹通用定時器如何生成PWM波
在“GPIO輸出-點亮LED燈”小節(jié)我們介紹了如何使用GPIO輸出點亮開發(fā)板上的LED燈,從而知道了開發(fā)板上控制LED燈的四個引腳分別為PD12、PD13、PD14和PD15,這四個引腳剛好可以配置為通用定時器TIM4的四個輸出通道,因此接下來我們將配置這四個引腳為通用定時器TIM4的4個通道的PWM輸出引腳
3.1、CubeMX相關(guān)配置
請先閱讀“STM32CubeMX STM32F4 HAL庫 工程建立”實驗3.4.1小節(jié)配置RCC和SYS
3.1.1、時鐘樹配置
系統(tǒng)時鐘樹配置與上一實驗一致,均設(shè)置為STM32F407總線能達到的最高時鐘頻率,具體如下圖所示
3.1.2、外設(shè)參數(shù)配置
在Pinout & Configuration頁面右邊芯片引腳預(yù)覽Pinout view中找到LED燈的四個控制引腳PD12、PD13、PD14和PD15,依次左鍵單擊并配置其功能為TIM4_CHx
然后在頁面左側(cè)功能分類欄目中點開Timers欄目,單擊欄目下的TIM4,并將其Channel1~4全部配置為PWM Generation CHx
具體配置如下圖所示
然后對啟用的TIM4定時器的四個通道參數(shù)進行設(shè)置,下面對重要參數(shù)簡單介紹
①PSC:該參數(shù)為時鐘源預(yù)分頻系數(shù),由于TIM4時鐘來源為APB1 Timer clocks (MHz),筆者這里為84MHz,因此經(jīng)過8399+1=8400分頻后的頻率為10KHz;
②計數(shù)模式:可以選擇向上、向下、中心對齊等計數(shù)方式;
③ARR:該參數(shù)決定了生成PWM的周期,這里設(shè)置為199,表示周期為20ms,注意這里周期不能太長(注釋2);
④預(yù)裝載自動重裝:設(shè)置為Enable后,當修改ARR的值時會在下一個UEV事件生效,否則表示不適用預(yù)裝載,修改其值會立即生效
⑤PWM模式選擇:可以選擇模式1/模式2,這兩種模式區(qū)別為生成的PWM波形不一樣,選擇PWM模式1且向上計數(shù)時,當Pulse值<計數(shù)值A(chǔ)RR時此時通道輸出有效狀態(tài),否則為無效狀態(tài),當選擇PWM模式2時剛好與模式1相反。如下面兩個PWM波形中,上圖為采用PWM模式1,通道極性為高電平時產(chǎn)生的PWM波,下圖為采用PWM模式2,通道極性為高時產(chǎn)生的PWM波;
⑥Pulse值:即捕獲/比較寄存器CRR的值,通過設(shè)置該參數(shù)可以決定PWM的脈沖寬度,這里設(shè)置為0,因為程序中可以動態(tài)修改該參數(shù)
⑦輸出比較預(yù)裝載:設(shè)置為Enable后,當修改Pulse的值時會在下一個UEV事件生效,否則會立即生效
⑧通道極性:設(shè)置通道有效狀態(tài)
如下圖所示為具體參數(shù)設(shè)置
3.1.3、外設(shè)中斷配置
在Pinout & Configuration頁面左邊System Core/NVIC中勾選TIM4全局中斷,然后選擇合適的中斷優(yōu)先級即可
3.2、生成代碼
請先閱讀“STM32CubeMX STM32F4 HAL庫 工程建立”實驗3.4.3小節(jié)配置Project Manager
單擊頁面右上角GENERATE CODE生成工程
3.2.1、外設(shè)初始化調(diào)用流程
在工程代碼主函數(shù)main()中調(diào)用MX_TIM4_Init()函數(shù)對定時器TIM4計數(shù)器參數(shù)及四個 PWM通道參數(shù)進行了配置
在該MX_TIM4_Init()函數(shù)中調(diào)用了HAL_TIM_PWM_Init()對定時器PWM輸出進行了初始化
然后在HAL_TIM_PWM_Init()函數(shù)中調(diào)用了HAL_TIM_PWM_MspInit()函數(shù)對TIM4時鐘和中斷設(shè)置/使能
如下圖所示為具體的TIM4四通道PWM輸出初始化調(diào)用流程
3.2.2、外設(shè)中斷調(diào)用流程
勾選了TIM4的全局中斷之后,在工程文件stm32f4xx_it.c中生成了TIM4全局中斷服務(wù)函數(shù)TIM4_IRQHandler()
該函數(shù)調(diào)用了HAL庫的定時器中斷統(tǒng)一處理函數(shù)HAL_TIM_IRQHandler(),最終調(diào)用PWM脈寬調(diào)制完成回調(diào)函數(shù) HAL_TIM_PWM_PulseFinishedCallback(),該函數(shù)為虛函數(shù)
如下圖所示為TIM4四通道PWM輸出中斷調(diào)用流程
3.2.3、添加其他必要代碼
在tim.c中重新實現(xiàn)PWM脈寬調(diào)制完成回調(diào)函數(shù)HAL_TIM_PWM_PulseFinishedCallback(),在該回調(diào)函數(shù)中實現(xiàn)了對四個通道PWM的占空比重新調(diào)節(jié)的目的,即重新配置參數(shù)里的Pulse,實現(xiàn)了從最低占空比逐漸到最大占空比然后再逐漸減少至最低占空比的無限循環(huán),具體代碼如下所示
源代碼如下
uint16_t pulseWidth=0;
uint8_t dirInc=1;
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance != TIM4)
return;
if(dirInc == 1)
{
pulseWidth ++;
if(pulseWidth >= 195)
{
pulseWidth = 195;
dirInc = 0;
}
}
else
{
pulseWidth --;
if(pulseWidth <= 5)
{
pulseWidth = 5;
dirInc = 1;
}
}
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, pulseWidth);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, pulseWidth);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, pulseWidth);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_4, pulseWidth);
}
最后在主函數(shù)中以中斷方式啟動生成PWM即可,如下所示為啟動代碼
4、常用函數(shù)
/*啟動定時器*/
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)
/*停止定時器*/
HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim)
/*啟動PWM輸出*/
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
/*停止PWM輸出*/
HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
/*以中斷方式啟動定時器*/
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
/*以中斷方式停止定時器*/
HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim)
/*以中斷方式啟動PWM輸出*/
HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
/*以中斷方式停止PWM輸出*/
HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
/*PWM輸出完畢回調(diào)函數(shù)*/
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
/*設(shè)置PWM占空比函數(shù)*/
__HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__)
5、燒錄驗證
5.1、具體步驟
“設(shè)置TIM4的4個通道為PWM輸出 -> 配置TIM4基本參數(shù)及4個PWM通道參數(shù) -> NVIC中勾選TIM4全局中斷并設(shè)置合適中斷優(yōu)先級 -> 在生成的工程tim.c文件中重新實現(xiàn)PWM脈寬調(diào)制完成回調(diào)函數(shù)void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) -> 在回調(diào)函數(shù)中利用__HAL_TIM_SET_COMPARE(HANDLE, CHANNEL, COMPARE)宏定義設(shè)置4個通道PWM的占空比 -> 在主函數(shù)中使用HAL_TIM_Base_Start_IT(&htim4)啟動定時器TIM4 -> 然后使用HAL_TIM_PWM_Start_IT(&htim4, TIM_CHANNEL_x)函數(shù)開啟四個通道PWM波的輸出”
5.2、實驗現(xiàn)象
燒錄程序,會發(fā)現(xiàn)開發(fā)板上電后四個LED燈亮度由最暗到最亮然后從最亮再到最暗循環(huán)往復(fù),實現(xiàn)呼吸燈的效果
使用邏輯分析儀監(jiān)測TIM4的四個通道輸出引腳狀態(tài),可以看出TIM4的四個通道輸出的PWM波型周期均為20ms,并且占空比不斷地在發(fā)生變化
6、注釋詳解
注釋1:圖片來源STM32Cube高效開發(fā)教程(基礎(chǔ)篇)9.1小節(jié)
注釋2:這里的周期設(shè)置為20ms,也即頻率為50Hz,人眼睛對于80Hz以上刷新頻率完全沒有閃爍感,因此如果你實現(xiàn)LED呼吸燈效果有閃爍情況的話,頻率不能設(shè)置的太低
更多內(nèi)容請瀏覽 OSnotes的CSDN博客
總結(jié)
以上是生活随笔為你收集整理的STM32CubeMX教程6 TIM 通用定时器 - 生成PWM波的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 神经网络优化篇:详解梯度检验(Gradi
- 下一篇: 摆脱自研难题,AUI Kit助力企业快速