仅作笔记,很多内容参考网友文章。
PWM 输出,是利用定时器的比较输出功能,所以就是配置定时器。
1,选择定时器8
tim1和tim8为高级定时器
一般我们选择内部时钟,也就是由APB 外设时钟提供。根据选择的输出IO口,选择输出通道。
2,定时分频设置。
以下来自网友文章:
(3条消息) 使用HAL库开发STM32:Timer基础说明与定时功能使用_Naisu Xu的博客-CSDN博客_hal_tim_base_start_it
确定了时钟来源我们接着使用定时功能主要处理下面几项参数:
Prescaler 预分频系数
输入给计数器的信号频率 = 输入到预分频器的信号频率 / (预分频系数 + 1)
该值为0相当于对输入信号1分频,也就是不分频;该值为1相当于对输入信号2分频,依此类推;
在STM32系列中该值常见取值范围为0~65535;
CounterMode 计数模式
计数模式常见的就是 Up(向上计数模式),这个模式下计数器初始值为0,计数到下面的 Period+1 算作一个周期;
其它可选值 Down(和UP反一反),Up/down(第一个周期是UP、第二个周期是Down,反复进行);
Period 计数周期
以 Up模式 为例,在此模式下计数器从0开始计数,每一个信号计数值+1, 当计数Period次之后计数器值为Period,当再有一个信号进入后就算计数满一个周期 ,可以触发溢出中断或是其它动作;
在STM32系列中该值常见取值范围为0~65535;
AutoReloadPreload 预装载
计数器再计满一个周期之后会自动重新计数,也就是默认会连续运行。这连续运行过程中如果你修改了Period,那么根据当前状态的不同有可能发生超出预料的过程。如果使能了AutoReloadPreload,那么你对Period的修改将会在完成当前计数周期后才更新;
Timer作为定时使用时信号来源通常使用内部时钟,当我们确定Timer的时钟信号频率后根据此设定实现定时某一时间周期所需要的参数了,这里主要涉及Prescaler和Period两个参数。Prescaler是对输入定时器的时钟信号进行分频,Period为一个周期中的计数值。
根据上面的内容Timer每计数一次的时间为 1秒 ÷ (时钟频率 ÷ (Prescaler + 1)) ,
定时器计数满一个周期的时间为 计数一次时间 × (Period + 1) 秒 。
所以定时时间计算公式如下:
定时时间 = (Prescaler + 1) × (Period + 1) ÷ 时钟频率 单位:秒
STM32单片机中有很多个Timer,通常TIM6和TIM7称为基础定时器、TIM1和TIM8称为高级定时器、其余的被称为通用定时器。基础定时器基本上只有定时功能;通用定时器在定时基础上还支持外部输入捕获、比较、PWM输出等功能;高级定时器在通用定时器的基础上只要增加了用于电机控制等功能。
原文链接:https://blog.csdn.net/Naisu_kun/article/details/118703547
3,PWM设置
下面设置参考以下文章:
(3条消息) STM32Cube的PWM控制基础篇(三)定时器的PWM设置详解_ASWaterbenben的博客-CSDN博客_ch polarity
4,程序
初始化添加代码
MX_TIM8_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start(&htim8);
添加完初始化代码,就可以用示波器看相应的引脚有没有输出了。