STM32F407 通用定时器
文章目录
- 1 定时器
- 1.1 定时器基础
- 1.2 定时器触发信号
- 1. 触发输入信号(TRGI)
- 15.4.3 TIMx 从模式控制寄存器 (TIMx_SMCR)
- 2. 触发输出信号(TRGO)
- 定时器计算公式
- 1. 定时器计时公式
- 2. 举例说明
- 总结
- 2 通用定时器框图
- 2.1 时钟选择
- 1. 内部时钟(CK_INT)
- 2. 外部时钟模式 1:外部输入引脚脚 (TIx)
- 3. 外部时钟模式 2:外部触发输入 ETR,仅适用于 TIM2、TIM3 和 TIM4
- 4. 外部触发输入 (ITRx):使用一个定时器作为另一定时器的预分频器
- 2.2 时基单元
- 2.3 各个寄存器
- 15.4.7 TIMx 捕获/比较模式寄存器 1 (TIMx_CCMR1)【STM32F4xx中文参考手册 P432】
- 15.4.9 TIMx 捕获/比较使能寄存器 (TIMx_CCER)【STM32F4xx中文参考手册 P436】
- 15.4.13 TIMx 捕获/比较寄存器 1 (TIMx_CCR1)【STM32F4xx中文参考手册 P439】
- 输入捕获
- 输出比较
- 模式选择(CCMR1->OC1M[2:0])
- 常用模式PWM1
- `CCMR` 寄存器中的 `CC1S` 配置为 `00` 表示 CC1 通道配置为输出模式
- `CCMR` 寄存器中的 `OC1M` 配置为 `110` 代表选用 `PWM模式1`
- 互补PWM的应用场景
- 正弦脉宽调制(SPWM)
- 编程实战(利用PWM互补实现交替呼吸灯实验)
- 1. 时间变量的获取与转换
- 2. 正弦规律占空比的计算
- 与SPWM的关联
- 一、输出比较基础原理与核心概念
- 1.1 输出比较的基本机制
- 1.2 关键寄存器与功能映射
- 二、输出比较模式与时序分析
- 2.1 PWM模式(PWM1与PWM2)
- 时序示例(向上计数模式)
- 2.2 非PWM模式(翻转、强制、冻结)
- 三、影子寄存器与预装载机制
- 3.1 影子寄存器的作用
- 3.2 预装载的应用场景
- 四、计数模式对输出的影响
- 4.1 递增计数(Upcounting)
- 4.2 递减计数(Downcounting)
- 4.3 中心对齐计数(Center-Aligned)
- 五、STM32F407通用定时器的新特性
- 5.1 32位计数器(TIM2与TIM5)
- 5.2 高级同步与级联功能
- 5.3 动态预装载与双缓冲机制
1 定时器
1.1 定时器基础
定时器类似于我们生活中的闹钟,可以设定一个时间来提醒我们。定时器可以作为基本的定时器/计数器,用于生成周期性的定时中断或作为计数器来计数外部事件的脉冲数。例如1秒钟进入定时器中断干一件事,定时器可以配置为产生脉冲宽度调制(PWM)信号,用于控制电机速度、LED亮度调节,风扇风速调节等应用。
定时器是存在于STM32F407IGH单片机中的一个外设,总共有14个定时器,分别是2个高级定时器(TIM1,TIM8)10个通用定时器(TIM2,TIM3,TIM4,TIM5,TIM9,TIM10,TIM11,TIM12,TIM13,TIM14)和2个基本定时器(TIM6,TIM7)
定时器类别 | 定时器编号 | 特征 | 产生DMA请求 | 捕获/比较通道 | 应用场景 |
---|---|---|---|---|---|
高级定时器 | TIM1,TIM8 | 16 位递增,递减,中央对齐模式 | 可以 | 6 | 带死区控制和紧急刹车,可用于PWM电机控制 |
通用定时器 | TIM2,TIM3,TIM4,TIM5 | 16 位或32位,递增,递减,中央对齐模式 | 可以 | 4 | 定时计数,PWM输出,输入捕获,输出比较 |
通用定时器 | TIM9,TIM10,TIM11,TIM12,TIM13,TIM14 | 16 位自动加载计数器 | 可以 | 2 | 定时计数,PWM输出,输入捕获,输出比较 |
基本定时器 | TIM6,TIM7 | 16 位自动加载计数器 | 可以 | 0 | 主要应用用于驱动DAC |
1.2 定时器触发信号
定时器的触发信号分两大类
1. 触发输入信号(TRGI)
从外部过来(也可能是自己输入通道过来)到本定时器的信号。
用来控制本定时器一些动作,比如复位。
这个时候本定时器就处于主从模式中的从模式
- 内部外设信号 (Internal Peripheral Signals) - ETR
- 内部定时器互连 (Internal Timer Connections) - ITRx
- 外部输入引脚 (External Input Pins) - TIx_ED, TI1F_ED, TI1FP1, TI2FP2
15.4.3 TIMx 从模式控制寄存器 (TIMx_SMCR)
常用复位模式:TIMx_SMCR->SMS
TIMx_SMCR->TS:触发选择
000:内部触发 0 (ITR0)
001:内部触发 1 (ITR1)
010:内部触发 2 (ITR2)
011:内部触发 3 (ITR3)
100:TI1 边沿检测器 (TI1F_ED)
101:滤波后的定时器输入 1 (TI1FP1)
110:滤波后的定时器输入 2 (TI2FP2)
111:外部触发输入 (ETRF)
触发输入信号
第1类
TS[2:0]=000-011 共4个:来源于其他定时器的TRGO信号经过芯片内部连接,来到本定时器的ITRO/1/2/3;内部连接是定死的,不能更改。如下图:
第2类
TS[2:0]=111 共1个
来源于外部触发脚ETR
经过极性选择,边沿检测和预分频器,输入滤波器,成为TRGI信号
TRGI信号通过从模式控制器控制本定时器实现复位或使能或更改计数方式等。
第3类
TS[2:0]=100 共1个
来源于定时器自身的通道1信号
经过输入滤波器和边缘检测器,得到TI1FED信号
上升沿和下降沿都会产生TI1F ED信号
经过信号选择器最终成为TRGI信号
第4类
TS[2:0]=101/110共2个
来源于定时器自身的通道1或通道2信号
经过输入滤波器和边沿检测器得到TI1FP1和TI2FP2信号
他们是上升沿或下降沿,只能选择一种
最终成为TRGI信号
2. 触发输出信号(TRGO)
是本定时器输出到其他定时器或其他外设的信号
用于与其他定时器的级联(触发其他定时器的一些工作)或触发一些其他外设工作。
这个时候本定时器就是主从模式中的主模式
定时器计算公式
1. 定时器计时公式
定时器产生一次更新事件(如溢出中断)的周期 T
(单位:秒)计算公式为:
T = (PSC + 1) * (ARR + 1) / T_CLK
或者,计算输出频率 F_out
(单位:Hz)的公式为:
F_out = T_CLK / [ (PSC + 1) * (ARR + 1) ]
其中:
T_CLK
:定时器的时钟源频率(单位:Hz)。- 例如,在STM32F407中,如果APB1预分频器≠1,则通用定时器(TIM2-TIM5)的时钟
T_CLK
为 84 MHz。
- 例如,在STM32F407中,如果APB1预分频器≠1,则通用定时器(TIM2-TIM5)的时钟
PSC
:预分频器寄存器 (Prescaler) 的值(16位寄存器,取值范围0~65535)。ARR
:自动重载寄存器 (Auto-Reload Register) 的值(16位或32位,取决于定时器,取值范围0~65535或更大)。
公式的核心思想是:
定时器的实际计数频率 F_CNT
由 PSC
对 T_CLK
分频得到:F_CNT = T_CLK / (PSC + 1)
然后,计数器从0计到 ARR
,总共需要 (ARR + 1)
个 F_CNT
的周期。
所以总时间(周期的倒数) T = (计数次数) / (计数频率) = (ARR + 1) / F_CNT = (ARR + 1) / [T_CLK / (PSC + 1)] = (PSC + 1) * (ARR + 1) / T_CLK
2. 举例说明
目标: 使用STM32F407的TIM3(时钟为84MHz)产生一个1Hz的闪烁频率(即定时周期为1秒)。
我们需要计算 PSC
和 ARR
的值。
-
公式:
T = 1s = (PSC + 1) * (ARR + 1) / 84,000,000 Hz
-
计算:
我们需要让(PSC + 1) * (ARR + 1) = 84,000,000
这个数很大,我们需要把它分解为两个相乘的整数。- 一个常见的选择是让
(PSC + 1)
和(ARR + 1)
都接近84000000的平方根(约9165)。 - 例如,令
PSC = 8399
,那么PSC + 1 = 8400
。 - 则
ARR + 1 = 84,000,000 / 8400 = 10,000
。 - 因此,
ARR = 9999
。
- 一个常见的选择是让
-
验证:
- 计数器实际频率:
F_CNT = 84 MHz / 8400 = 10,000 Hz = 10 kHz
- 计数一次的时间:
1 / 10 kHz = 0.1 ms
- 从0计数到9999(共10000次)的时间:
10000 * 0.1 ms = 1000 ms = 1s
- 验证正确。
- 计数器实际频率:
-
代码配置:
// 在初始化函数中 htim3.Instance = TIM3; htim3.Init.Prescaler = 8399; // PSC htim3.Init.Period = 9999; // ARR // ... 其他设置 HAL_TIM_Base_Init(&htim3);
总结
项目 | 正确公式 |
---|---|
周期 | T = (PSC + 1) * (ARR + 1) / T_CLK |
频率 | F_out = T_CLK / [ (PSC + 1) * (ARR + 1) ] |
关键 | PSC+1 是一个整体,代表分频系数 |
2 通用定时器框图
2.1 时钟选择
1. 内部时钟(CK_INT)
- 当对 TIMx_CR1->CEN 位写入1时,预分频器的时钟就由内部时钟 CK INT 提供
- TIMx_SMCR->SMS 设置为 “000” 表示禁止从模式––如果 TIMx_CR1->CEN =“1”,预分频器时钟直接由内部时钟提供
2. 外部时钟模式 1:外部输入引脚脚 (TIx)
3. 外部时钟模式 2:外部触发输入 ETR,仅适用于 TIM2、TIM3 和 TIM4
4. 外部触发输入 (ITRx):使用一个定时器作为另一定时器的预分频器
2.2 时基单元
2.3 各个寄存器
15.4.7 TIMx 捕获/比较模式寄存器 1 (TIMx_CCMR1)【STM32F4xx中文参考手册 P432】
位 1:0 CC1S: 捕获/比较 1 选择 (Capture/Compare 1 selection)
位 2 OC1FE: 输出比较 1 快速使能 (Output compare 1 fast enable)
位 3 OC1PE: 输出比较 1 预装载使能 (Output compare 1 preload enable)
位 6:4 OC1M:输出比较 1 模式 (Output compare 1 mode)
位 7 OC1CE: 输出比较 1 清零使能 (Output compare 3 clear enable)
15.4.9 TIMx 捕获/比较使能寄存器 (TIMx_CCER)【STM32F4xx中文参考手册 P436】
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
CC4NP | Res. | CC4P | CC4E | CC3NP | Res. | CC3P | CC3E | CC2NP | Res. | CC2P | CC2E | CC1NP | Res. | CC1P | CC1E |
位 0 CC1E:捕获/比较 1 输出使能 (Capture/Compare 1 output enable)
位 1 CC1P:捕获/比较 1 输出极性 (Capture/Compare 1 output Polarity)
位 3 CC1NP:捕获/比较 1 输出极性 (Capture/Compare 1 output Polarity)
15.4.13 TIMx 捕获/比较寄存器 1 (TIMx_CCR1)【STM32F4xx中文参考手册 P439】
CCR1[15:0]
CCR1[31:16] (depending on timers)
如果通道 CC1(指的是TIMx_CCMR1->CC1S)
配置为输出,CCR1 是捕获/比较寄存器 1 的预装载值
如果通道 CC1(指的是TIMx_CCMR1->CC1S)
配置为输入,CCR1 为上一个输入捕获 1 事件 (IC1) 发生时的计数器值
输入捕获
输出比较
测:测量外部输出的占空比、周期
产生:根据时钟频率产生方波信号
模式选择(CCMR1->OC1M[2:0])
常用模式PWM1
CCMR
寄存器中的 CC1S
配置为 00
表示 CC1 通道配置为输出模式
CCMR
寄存器中的 OC1M
配置为 110
代表选用 PWM模式1
CNT< CCR 输出高电平 CNT >= CCR 输出低电平
互补PWM的应用场景
同步buck电路(降压电源)
SW1 和 SW2 交替导通
正弦脉宽调制(SPWM)
编程实战(利用PWM互补实现交替呼吸灯实验)
高级定时器需要闭合
MOE
开关: TIM CtrlPWMOutputs(TIMl, ENABLE);
float t = GetTick() * 1.0e-3f;
float duty=0.5*(sin(2*3.14*t)+ 1);
这两行代码用于生成随时间按正弦规律变化的占空比,为后续生成正弦脉宽调制(SPWM)信号做准备,结合SPWM原理解释如下:
1. 时间变量的获取与转换
float t = GetTick() * 1.0e-3f;
GetTick()
通常是获取系统的“滴答计数”(一般为毫秒级,记录系统运行的累计时间)。- 乘以
1.0e-3f
(即0.001
),是将毫秒单位的时间转换为秒,使得t
表示“从起始时刻到当前的时间(单位:秒)”,作为正弦变化的时间基准。
2. 正弦规律占空比的计算
float duty=0.5*(sin(2*3.14*t)+ 1);
这一行计算占空比的比例值(范围 0~1
),步骤分解:
sin(2*3.14*t)
:2*3.14
近似为2π
,因此这是一个周期为1秒的正弦函数(角频率ω=2π
,周期T=2π/ω=1s
),取值范围[-1, 1]
,描述“正弦变化的周期性趋势”。sin(2*3.14*t) + 1
:将正弦波上移1,使取值范围从[-1, 1]
变为[0, 2]
,实现“单极性化”(占空比无负区间,只需要正区间变化)。0.5 * (...)
:将[0, 2]
的范围缩放为[0, 1]
,此时duty
表示“占空比的比例”(0
对应0%占空比,1
对应100%占空比)。
与SPWM的关联
后续若要生成SPWM信号,需将 duty
映射到**捕获比较寄存器(CCR)**的值:
假设定时器的“自动重装载寄存器(ARR)”设为 1000
(对应PWM周期的计数上限),则 CCR1 = duty * 1000
(即 CCR1
随 duty
按正弦规律变化)。
最终,定时器输出的PWM信号占空比会随时间按正弦规律变化,经滤波后可还原为平滑的正弦波,常用于逆变器、电机变频控制等场景。
一、输出比较基础原理与核心概念
输出比较是通用定时器(TIM2~TIM5)的核心功能之一,其本质是通过计数器(CNT)与捕获/比较寄存器(CCR)的实时比较,控制GPIO引脚输出特定电平或脉冲。典型应用包括PWM波形生成(如LED亮度调节、舵机控制)、单脉冲输出、频率占空比测量等。
1.1 输出比较的基本机制
当定时器计数器CNT
的值与捕获/比较寄存器TIMx_CCRx
的值匹配时,硬件会根据配置的输出模式(如PWM模式1/2、翻转模式等)改变输出引脚的电平状态。核心流程如下:
- 计数器计数:
CNT
从0递增(或递减/中心对齐)至自动重载值ARR
,再循环。 - 比较触发:当
CNT == CCR
时,触发比较事件,输出逻辑根据OCxM
位配置改变电平。 - 输出使能:通过
CCER
寄存器的CCxE
位控制通道输出到GPIO引脚。
1.2 关键寄存器与功能映射
寄存器 | 作用 |
---|---|
TIMx_CCRx | 存储比较值,决定PWM占空比或触发时刻 |
TIMx_ARR | 自动重载值,决定PWM周期或计数范围 |
TIMx_CCMR1/2 | 配置输出模式(OCxM[2:0] )、预装载使能(OCxPE )等 |
TIMx_CCER | 使能通道输出(CCxE )、配置输出极性(CCxP ) |
TIMx_CR1 | 控制计数模式(DIR 、CMS )、自动重载预装载(ARPE ) |
二、输出比较模式与时序分析
2.1 PWM模式(PWM1与PWM2)
PWM(脉冲宽度调制)是输出比较最典型的应用,通过OCxM[2:0]
配置为110
(PWM模式1)或111
(PWM模式2)实现。两者的核心区别在于有效电平的判定逻辑:
- PWM模式1:向上计数时,
CNT < CCR
输出有效电平;向下计数时,CNT > CCR
输出无效电平。 - PWM模式2:向上计数时,
CNT < CCR
输出无效电平;向下计数时,CNT > CCR
输出有效电平。
时序示例(向上计数模式)
timelinetitle PWM模式1时序(ARR=1000, CCR=300)0 : CNT=0, OC1REF=高(有效)300 : CNT=300, OC1REF=低(无效)1000 : CNT=1000, 溢出,OC1REF=高(重新计数)
2.2 非PWM模式(翻转、强制、冻结)
除PWM外,输出比较还支持以下模式(通过OCxM
配置):
- 翻转模式(Toggle):每次
CNT==CCR
时,输出电平翻转(如高→低或低→高)。 - 强制模式(Force):强制输出高/低电平(由
OCxM
子位选择)。 - 冻结模式(Freeze):输出电平保持初始状态,仅在更新事件时刷新。
三、影子寄存器与预装载机制
3.1 影子寄存器的作用
TIMx_CCRx
和TIMx_ARR
均配备影子寄存器(Shadow Register),用于缓冲写入值,确保多通道同步或周期内参数无抖动更新。当OCxPE
(CCR预装载使能)或ARPE
(ARR预装载使能)置1时,写入的新值仅在**更新事件(UEV)**发生时才会加载到影子寄存器,否则立即生效。
3.2 预装载的应用场景
- 多通道PWM同步更新:多通道PWM需同时改变占空比时,可通过
UEV
同步加载所有CCR的新值。 - 动态调整周期/占空比:在定时器运行时修改
ARR
或CCR
,通过预装载确保参数在周期结束后统一更新。
四、计数模式对输出的影响
4.1 递增计数(Upcounting)
计数器从0递增至ARR
,溢出后重新从0开始。PWM模式下,一个周期内仅触发一次比较事件(CNT==CCR
)。
4.2 递减计数(Downcounting)
计数器从ARR
递减至0,下溢后重新从ARR
开始。适用于需要从高到低触发比较的场景(如中心对齐PWM的下半周期)。
4.3 中心对齐计数(Center-Aligned)
计数器先递增至ARR-1
(上溢),再递减至1(下溢),循环往复。中心对齐PWM可实现对称波形,但需注意CCR
的取值范围(需小于ARR
)。
五、STM32F407通用定时器的新特性
5.1 32位计数器(TIM2与TIM5)
TIM2和TIM5支持32位计数模式,可处理更长的定时周期(最大计数值2³²-1),适用于低频或长时间的PWM控制(如电机调速、电源管理)。
5.2 高级同步与级联功能
通过TIMx_SMCR
寄存器可配置定时器级联,实现多定时器同步或分频。例如,TIM3的更新事件可作为TIM2的触发源,形成复杂的时序控制。
5.3 动态预装载与双缓冲机制
ARPE
和OCxPE
的组合使用可实现运行时参数无扰更新。例如,在PWM输出过程中动态调整占空比,新值在下次更新事件时自动加载,避免波形抖动。