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