STM32F103C8T6芯片TIM功能详细描述+通用模板+关键代码参数修改解析

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.​参数调整指南
  1. 修改PWM频率

    • 固定ARR,调整PSC:频率 = 72MHz / [(PSC+1)*(ARR+1)]
    • 固定PSC,调整ARR:同上公式反向计算
    • 权衡:ARR越大占空比分辨率越高,但频率降低
  2. 动态调整占空比

    TIM_SetCompare2(TIM3, new_CCR_value);  // 修改CCR2值(需在运行时调用)
  3. 死区时间配置(仅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_PeriodTIM_PrescalerTIM_Pulse参数可快速适配不同应用场景(如LED调光、电机调速等)。


9. 注意事项

  • 时钟配置:确保定时器时钟源与总线频率匹配(APB1最大36 MHz,APB2最大72 MHz)。
  • 中断优先级:高频率定时器中断可能影响系统实时性,需合理分配优先级。
  • PWM占空比精度:ARR值越大,占空比调节分辨率越高,但频率降低。
  • 死区时间计算:需根据开关器件特性(如MOSFET关断延迟)调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值