STM32Cubev6 PWM波輸出
工作環(huán)境:
STM32CubeMXv6
Keil5
? ? PWM波輸出和時鐘有關(guān),所以我們需要先配置時鐘,打開左側(cè)的下拉框System Core,點擊RCC選項;

????我選用的是8M的外部高速時鐘(以實際情況為準(zhǔn)),在下方的配置框中更改High Speed Clock(HSE)為Crystal/Ceramic Resonator;

????配置HSE為8Mhz,APB1為54Mhz;

? ? ? ? 打開左側(cè)的下拉框Timers,點擊TIM3選項;

????打開PWM Channel1(通道一)和?PWM Channel2(通道二)選擇為PWM Generation CH1和PWM Generation CH2,此時我們可得到兩路頻率相同的方波,因為他們用的是同一個定時器,如果需要生成不同頻率的PWM波那么我們就需要開啟兩個不同的定時器。

Input Capture direct mode:輸入直接捕獲模式
Input Capture indirect mode:輸入間接捕獲模式
Input Capture triggered by TRC:TRC觸發(fā)輸入捕獲
Output Compare No Output:輸出比較無輸出
Output Compare CH1:輸出比較CH1
PWM Generation No Output:PWM生成無輸出
PWM Generation CH1:PWM生成CH1
Forced Output CH1:強(qiáng)制輸出CH1

????我首先需要配置一個1ms觸發(fā)一次的定時器中斷(1Khz),我們先通過芯片對應(yīng)的datasheet查到TIM6是在APB1上的,我們通過RCC配置它為54Mhz(最高),根據(jù)公式
Tout =?(PSC+1)* (ARR+1)/Tclk
得到預(yù)分頻值為1(實際填入需要-1,所以在配置中填入0),自動重載值為54000-1=53999,允許自動重載;

PWM模式我們選擇PWM Mode 1;?
???PWM Mode 1:在向上計數(shù)時,一旦TIMx_CNT<TIMx_CCR1時通道1為有效電平,否則為無效電平;在向下計數(shù)時,一旦TIMx_CNT>TIMx_CCR1時通道1為無效電平,否則為有效電平。
????PWM Mode 2:在向上計數(shù)時,一旦TIMx_CNT<TIMx_CCR1時通道1為無效電平,否則為有效電平;在向下計數(shù)時,一旦TIMx_CNT>TIMx_CCR1時通道1為有效電平,否則為無效電平。
????比較寄存器分別設(shè)置為13499(占空比25%)和26999(占空比50%);
????注意,如果需要輸出兩個不同頻率的PWM波則需要兩個定時器;
????通道輸出極性為Low;

設(shè)置完成后
????點擊Project Manager頁面,輸入工程名和工程位置,選擇工具鏈和IDE為MDK-ARM,版本為5.27;

????打開左側(cè)Code Generater菜單勾選Generate peripheral initialization as a pair of'.c/.h'file per peripheral;?

????最后點擊右上角的GENERATE CODE按鈕后生成代碼。
? ? 生成代碼后打開工程文件夾,用Keil5打開工程。

????編譯
????在while循環(huán)前初始化加入啟動PWM輸出
???其中,第一個參數(shù)為TIM定時器名,第二個參數(shù)為通道名
???運(yùn)行,即可生成兩路頻率為1Khz,占空比分別為25%和50%的方波。
? ?如果需要更改PWM波的占空比,可以使用__HAL_TIM_SetCompare()
????其中,第一個參數(shù)為TIM定時器名,第二個參數(shù)為通道名,第三個參數(shù)為CCRx的值
參考資料:
STM32F7開發(fā)指南-HAL庫版本_V1.1
HAL庫教程10:定時器的PWM模式應(yīng)用 ? https://yatao.blog.csdn.net/article/details/89326363