STM32Cubev6 PWM波输出
工作环境:
STM32CubeMXv6
Keil5
PWM波输出和时钟有关,所以我们需要先配置时钟,打开左侧的下拉框System Core,点击RCC选项;

我选用的是8M的外部高速时钟(以实际情况为准),在下方的配置框中更改High Speed Clock(HSE)为Crystal/Ceramic Resonator;

配置HSE为8Mhz,APB1为54Mhz;

打开左侧的下拉框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触发输入捕获
Output Compare No Output:输出比较无输出
Output Compare CH1:输出比较CH1
PWM Generation No Output:PWM生成无输出
PWM Generation CH1:PWM生成CH1
Forced Output CH1:强制输出CH1

我首先需要配置一个1ms触发一次的定时器中断(1Khz),我们先通过芯片对应的datasheet查到TIM6是在APB1上的,我们通过RCC配置它为54Mhz(最高),根据公式
Tout = (PSC+1)* (ARR+1)/Tclk
得到预分频值为1(实际填入需要-1,所以在配置中填入0),自动重载值为54000-1=53999,允许自动重载;

PWM模式我们选择PWM Mode 1;
PWM Mode 1:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平,否则为有效电平。
PWM Mode 2:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
比较寄存器分别设置为13499(占空比25%)和26999(占空比50%);
注意,如果需要输出两个不同频率的PWM波则需要两个定时器;
通道输出极性为Low;

设置完成后
点击Project Manager页面,输入工程名和工程位置,选择工具链和IDE为MDK-ARM,版本为5.27;

打开左侧Code Generater菜单勾选Generate peripheral initialization as a pair of'.c/.h'file per peripheral;

最后点击右上角的GENERATE CODE按钮后生成代码。
生成代码后打开工程文件夹,用Keil5打开工程。

编译
在while循环前初始化加入启动PWM输出
其中,第一个参数为TIM定时器名,第二个参数为通道名
运行,即可生成两路频率为1Khz,占空比分别为25%和50%的方波。
如果需要更改PWM波的占空比,可以使用__HAL_TIM_SetCompare()
其中,第一个参数为TIM定时器名,第二个参数为通道名,第三个参数为CCRx的值
参考资料:
STM32F7开发指南-HAL库版本_V1.1
HAL库教程10:定时器的PWM模式应用 https://yatao.blog.csdn.net/article/details/89326363