intro❗
STM32F407 拥有多达14个定时器 ❗
- 类型与特点:
- TIM1, TIM8: 高级控制定时器 (16位自动重装载)。
- TIM2, TIM5: 通用定时器 (32位自动重装载)。
- TIM3, TIM4: 通用定时器 (16位自动重装载)。
- TIM6, TIM7: 基本定时器 (16位自动重装载)。
- TIM9-TIM14: 通用定时器 (16位自动重装载)。
- 相互独立,不共享任何资源
- 功能强大,可用于定时、计数、PWM控制等。
TIM1和TIM8特性
- 16位递增、递减、递增/递减自动重装载计数器。
- 16位可编程预分频器。
- 4个输入或输出通道,可用于输入捕获、输出比较、PWM生成、带死区的PWM互补输出。
- 可实现多个定时器同步互连。
TIM1和TIM8框图

包括时钟源、触发控制器、从模式控制器、预分频器 (PSC)、计数器 (CNT)、自动重载寄存器 (ARR)、重复计数器 (REP)、捕获/比较寄存器 (CCRx)、输出控制逻辑和断路输入 (BRK)。
三种计数方式

- 递增计数:CNT从0到ARR,周期ARR+1。
- 递减计数:CNT从ARR到0,周期ARR+1。
- 中心对齐模式:CNT在0和ARR间来回计数,周期2*ARR。
计数器时序
描述各计数模式下,CK_PSC, CNT_EN, 定时器时钟, 计数器寄存器, 上溢/下溢, 更新事件 (UEV), 更新中断标志 (UIF) 的关系。
PWM❗❗
PWM工作方式❗
- 设计原理:设置计数方式、计数周期 (ARR决定频率)、比较值 (CCRx决定占空比)。
- PWM输出 (TIM_CHx):CNT与CCRx比较,满足条件时输出电平变化。
- 递增方式PWM波形:根据CCRx值与ARR的关系,输出不同占空比波形。
- 自动控制GPIO口电平翻转
- 不需要在中断中通过CPU控制,不占用硬件资源
- 中断中可以修改CRRx、ARR的值来实现频率以及占空比的调节


PWM程序设计❗
- 设置计数方式 (Counter Mode):
- 计数方式决定了定时器计数器的递增、递减或中心对齐模式。
- 在库函数编程中,这通常通过设置定时器基本初始化结构体(
TIM_TimeBaseInitTypeDef
)的TIM_CounterMode
成员来完成。 - 常见的计数方式包括:
- 向上计数 (TIM_CounterMode_Up):计数器从 0 开始计数到
TIM_Period
(ARR) 值,然后重新从 0 开始计数。 - 向下计数 (TIM_CounterMode_Down):计数器从
TIM_Period
(ARR) 值开始计数到 0,然后重新从TIM_Period
(ARR) 开始计数。 - 中心对齐模式 (TIM_CounterMode_CenterAligned1/2/3):计数器从 0 计数到
TIM_Period
(ARR) 值,然后向下计数到 0。这种模式常用于生成对称的 PWM 波形。 - 配置方式示例 (库函数):
- 设定预分频 (Prescaler):
- 预分频器用于降低定时器时钟的频率,从而控制计数器计数的速度。
- 定时器时钟频率 = 外设总线时钟频率 / (预分频值 + 1)。
- 在库函数编程中,这通过设置
TIM_TimeBaseInitTypeDef
的TIM_Prescaler
成员来完成。 - 例如,如果主频为 168MHz,要得到 1MHz 的定时器时钟,预分频值应设为 168 - 1 = 167。
- 配置方式示例 (库函数):
- 设定计数周期(TIMx_ARR 寄存器):
- 计数周期(也称为自动重装载值 ARR)决定了 PWM 波形的周期。
- PWM 周期 = (ARR + 1) * 定时器时钟周期。
- 在向上计数模式下,计数器从 0 计数到 ARR 值,完成一个周期。
- 在库函数编程中,这通过设置
TIM_TimeBaseInitTypeDef
的TIM_Period
成员来完成。 - 配置方式示例 (库函数):
- 设定占空比(TIM_CCRx 寄存器):
- 占空比由比较值(Capture/Compare Register, CCRx)决定。
- 对于向上计数模式的 PWM 模式 1:当计数器值小于 CCRx 时,输出为高电平;当计数器值大于等于 CCRx 时,输出为低电平。
- 占空比 = (CCRx / (ARR + 1)) * 100%。
- 在库函数编程中,这通常通过设置
TIM_OCInitTypeDef
结构体的TIM_Pulse
成员来完成。 - 配置方式示例 (库函数):
整体配置流程(库函数编程示例):
通过以上步骤,您就可以在 Cortex-M 微控制器上配置并生成所需的 PWM 波形了。