1. TIM模块概述
STM32F103C8T6集成了多种类型的定时器(TIM),涵盖基本定时、通用控制及高级应用场景,支持复杂的时间管理、信号生成与测量功能。其定时器资源如下:
- 高级控制定时器(TIM1):支持复杂PWM波形生成、死区插入、编码器接口,适用于电机控制、电源转换等。
- 通用定时器(TIM2-TIM4):提供输入捕获、输出比较、PWM生成等通用功能,适用于信号测量、简单控制。
- 基本定时器(TIM6-TIM7):仅支持基础计时与中断触发,用于系统节拍、DMA触发等场景。
2. 核心功能特性
2.1 基础计时与计数
- 计数器模式:
- 向上计数:从0递增至自动重载值(ARR),触发更新事件(UEV)。
- 向下计数:从ARR递减至0,触发UEV。
- 中央对齐(向上/向下):交替递增/递减,生成对称波形。
- 时钟源:
- 内部时钟(CK_INT):APB总线时钟分频后输入(最高72 MHz)。
- 外部时钟(ETR):外部引脚输入的脉冲信号。
- 编码器模式:通过正交编码器信号驱动计数。
2.2 PWM(脉冲宽度调制)
- PWM生成模式:
- 边沿对齐:固定频率,占空比通过比较寄存器(CCR)调节。
- 中央对齐:对称波形,降低电磁干扰(EMI)。
- 多通道支持:每个定时器支持4路独立PWM输出(如TIM1的CH1-CH4)。
- 互补输出(TIM1/TIM8):支持带死区的互补PWM信号,驱动H桥电路。
2.3 输入捕获(Input Capture)
- 信号边沿检测:记录外部信号(如脉冲、方波)的上升沿/下降沿时间戳。
- 应用场景:测量脉冲宽度、频率或占空比(如超声波测距、红外遥控解码)。
2.4 输出比较(Output Compare)
- 比较匹配触发:当计数器值等于比较寄存器(CCR)时,触发输出电平翻转、中断或DMA请求。
- 模式类型:强制输出、翻转、PWM、单脉冲等。
2.5 编码器接口
- 正交编码器支持:通过两个相位差90°的信号(A/B相)自动计算方向与计数值。
- 应用场景:电机转速/位置检测、旋转编码器读取。
2.6 中断与DMA
- 事件触发:更新事件(计数器溢出)、捕获/比较事件、触发输入事件等。
- DMA请求:定时器溢出或匹配时触发DMA传输,实现高速数据搬运(如ADC采样同步)。
2.7 高级功能(TIM1/TIM8)
- 死区插入(Dead Time):互补PWM通道间插入延迟,防止H桥短路。
- 刹车输入(Break):紧急情况下强制关闭PWM输出,确保系统安全。
- 重复计数器(RCR):生成周期性中断或DMA请求,降低CPU负载。
3. 关键参数与性能
- 计数器分辨率:16位(通用定时器)或16/32位(TIM2/TIM5)。
- 最大时钟频率:
- TIM1/TIM8(APB2):72 MHz。
- TIM2-TIM7(APB1):36 MHz(APB1分频后最高72 MHz)。
- PWM频率范围:从数Hz到数MHz(取决于分频系数与ARR值)。
- 死区时间调节:典型范围0-1588 ns(72 MHz时钟下)。
4. 应用场景
- 电机控制:TIM1生成互补PWM驱动无刷电机,结合编码器反馈实现闭环控制。
- 电源管理:TIM2生成PWM控制DC-DC转换器开关频率。
- 信号测量:TIM3捕获超声波回波时间差,计算距离。
- 定时任务:TIM6触发周期性ADC采样,通过DMA存储数据。
- 用户交互:TIM4生成PWM调节LED亮度或蜂鸣器音调。
5. 功能对比
定时器类型 | 通道数 | 互补输出 | 编码器接口 | 适用场景 |
---|---|---|---|---|
高级(TIM1) | 4 | 支持 | 支持 | 电机驱动、电源逆变 |
通用(TIM2-4) | 4 | 不支持 | 支持(部分) | 信号测量、通用PWM |
基本(TIM6-7) | 0 | 不支持 | 不支持 | 系统节拍、定时触发 |
6.上完整程序模版,复制可用,已详细注释
#include "stm32f10x.h"
int main(void) {
//---------------- 1. 时钟配置 -----------------
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); // 使能GPIOA和复用功能时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 使能TIM3时钟(挂载在APB1总线)
//---------------- 2. GPIO初始化 -----------------
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7; // 选择PA7引脚(TIM3_CH2复用功能)
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 引脚速度50MHz
GPIO_Init(GPIOA, &GPIO_InitStruct); // 应用配置
//---------------- 3. 定时器基本参数配置 -----------------
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_TimeBaseStruct.TIM_Prescaler = 71; // 预分频系数(PSC):72MHz/(71+1)=1MHz计数器时钟
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseStruct.TIM_Period = 999; // 自动重载值(ARR):周期= (999+1)/1MHz=1ms(1kHz频率)
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频因子(无分频)
TIM_TimeBaseStruct.TIM_RepetitionCounter = 0; // 重复计数器(高级定时器专用)
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStruct); // 初始化TIM3
//---------------- 4. PWM输出模式配置 -----------------
TIM_OCInitTypeDef TIM_OCStruct;
TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM2; // PWM模式2(CNT > CCR时输出有效)
TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable; // 使能输出
TIM_OCStruct.TIM_Pulse = 500; // 比较寄存器值(CCR):占空比=500/(999+1)=50%
TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_High; // 输出极性高电平有效
TIM_OC2Init(TIM3, &TIM_OCStruct); // 初始化通道2(TIM3_CH2)
//---------------- 5. 使能预装载寄存器 -----------------
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); // 使能CCR2预装载,防止运行时参数突变
//---------------- 6. 启动定时器 -----------------
TIM_Cmd(TIM3, ENABLE); // 启动TIM3计数器
TIM_CtrlPWMOutputs(TIM3, ENABLE); // 高级定时器专用(TIM1/TIM8需要此命令)
while(1) { /* 主循环(可动态修改CCR调整占空比) */ }
}
7.代码功能说明与参数详解
1. 时钟配置
- **
RCC_APB2Periph_GPIOA
**:启用GPIOA时钟(PWM引脚所在端口) - **
RCC_APB1Periph_TIM3
**:TIM3挂载在APB1总线,需单独开启时钟 - 关键点:APB1最大时钟36MHz,但通过倍频器可实现72MHz(需检查系统时钟配置)
2. GPIO初始化
- **
GPIO_Pin_7
**:选择PA7引脚(TIM3_CH2的复用功能映射) - **
GPIO_Mode_AF_PP
**:复用推挽输出模式,确保PWM信号稳定驱动 - 注意:不同定时器通道对应引脚需查数据手册(如TIM3_CH2对应PA7或PB5)
3. 定时器基本参数
- **
TIM_Prescaler
**:预分频系数(PSC),计算公式实际分频值 = PSC + 1
- 示例:72MHz/(71+1)=1MHz → 计数器每微秒计数一次
- **
TIM_Period
**:自动重载值(ARR),决定PWM周期- 周期计算:
T = (ARR + 1) / 计数器时钟频率
- 示例:ARR=999 → 周期=1000/1MHz=1ms(频率1kHz)
- 周期计算:
4. PWM模式配置
- **
TIM_OCMode_PWM2
**:- PWM模式1:CNT < CCR时输出有效电平
- PWM模式2:CNT > CCR时输出有效电平
- **
TIM_Pulse
**:比较寄存器值(CCR),决定占空比- 占空比计算:
占空比 = CCR / (ARR + 1)
- 示例:CCR=500 → 占空比50%
- 占空比计算:
- **
TIM_OCPolarity_High
**:有效电平为高,可根据外设需求调整
5. 预装载寄存器
- **
TIM_OCPreload_Enable
**:使能后,CCR值的修改在更新事件生效,避免信号抖动 - 重要性:在动态调整PWM参数时保证波形连续性
6. 启动定时器
- **
TIM_Cmd()
**:启动计数器运行 - **
TIM_CtrlPWMOutputs()
**:仅高级定时器(TIM1/TIM8)需要,通用定时器无需此命令
8.参数调整指南
-
修改PWM频率:
- 固定ARR,调整PSC:
频率 = 72MHz / [(PSC+1)*(ARR+1)]
- 固定PSC,调整ARR:同上公式反向计算
- 权衡:ARR越大占空比分辨率越高,但频率降低
- 固定ARR,调整PSC:
-
动态调整占空比:
TIM_SetCompare2(TIM3, new_CCR_value); // 修改CCR2值(需在运行时调用)
-
死区时间配置(仅TIM1):
TIM_BDTRInitTypeDef BDTR; BDTR.TIM_DeadTime = 0x10; // 死区时间=16*Tdts(Tdts=1/72MHz) BDTR.TIM_Break = TIM_Break_Disable; TIM_BDTRConfig(TIM1, &BDTR); // 需配合互补通道使用
本模板实现了TIM3通道2的1kHz、50%占空比PWM输出,通过修改TIM_Period
、TIM_Prescaler
和TIM_Pulse
参数可快速适配不同应用场景(如LED调光、电机调速等)。
9. 注意事项
- 时钟配置:确保定时器时钟源与总线频率匹配(APB1最大36 MHz,APB2最大72 MHz)。
- 中断优先级:高频率定时器中断可能影响系统实时性,需合理分配优先级。
- PWM占空比精度:ARR值越大,占空比调节分辨率越高,但频率降低。
- 死区时间计算:需根据开关器件特性(如MOSFET关断延迟)调整。