STM32 定时器主从模式配置解析

发布于:2025-05-17 ⋅ 阅读:(11) ⋅ 点赞:(0)

STM32 定时器主从模式配置解析

下面这两行代码是配置STM32定时器主从模式的关键设置

代码功能解析

TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);  // 选择从模式输出的触发源
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);  // 选择从模式

1. TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2)

作用:设置定时器TIM3的触发输入源

参数说明

  • TIM3:目标定时器
  • TIM_TS_TI2FP2:选择定时器输入2的滤波后信号(TI2FP2)作为触发源

可选触发源

  • TIM_TS_ITR0~TIM_TS_ITR3:内部触发(其他定时器)
  • TIM_TS_TI1F_ED:TI1的边沿检测器
  • TIM_TS_TI1FP1:滤波后的TI1输入
  • TIM_TS_TI2FP2:滤波后的TI2输入
  • TIM_TS_ETRF:外部触发输入

2. TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset)

作用:设置定时器TIM3的从模式

参数说明

  • TIM3:目标定时器
  • TIM_SlaveMode_Reset:选择复位模式

可选从模式

  • TIM_SlaveMode_Reset:触发信号上升沿时重新初始化计数器
  • TIM_SlaveMode_Gated:触发信号高电平时计数
  • TIM_SlaveMode_Trigger:触发信号作为时钟
  • TIM_SlaveMode_External1:外部时钟模式1

典型应用场景

这种配置通常用于:

  1. 频率测量:主定时器测量信号,从定时器(TIM3)被配置为在输入信号边沿复位
  2. 脉冲计数:精确测量脉冲间隔
  3. 同步多个定时器

完整配置示例

以下是使用TIM3作为从定时器的完整配置示例:

void TIM3_Slave_Configuration(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_ICInitTypeDef TIM_ICInitStructure;
    
    // 使能TIM3时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    
    // 时基配置
    TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
    TIM_TimeBaseStructure.TIM_Prescaler = 72-1; // 1MHz计数频率
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    
    // 输入捕获配置(使用通道2)
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICFilter = 0x0;
    TIM_ICInit(TIM3, &TIM_ICInitStructure);
    
    // 关键配置部分
    TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);  // 选择TI2作为触发源
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);  // 复位模式
    
    // 使能定时器
    TIM_Cmd(TIM3, ENABLE);
}

工作原理

在这种配置下:

  1. 当TIM3的通道2(TI2)检测到上升沿时
  2. 定时器计数器会被自动复位(归零)
  3. 同时可以产生更新事件中断
  4. 主程序可以通过读取计数器值来计算两个上升沿之间的时间间隔

注意事项

  1. 引脚映射:确保TIM3_CH2正确映射到目标GPIO引脚
  2. 时钟配置:正确配置定时器时钟频率
  3. 模式限制:不是所有定时器都支持全部从模式,需参考参考手册
  4. 中断使用:如需更精确测量,可以配合更新中断使用

这种配置方式特别适合需要精确测量外部信号周期或频率的应用场景。
是的,当使用 TIM_SlaveMode_Reset 从模式时,定时器会在每次触发信号(如上升沿)到来时自动复位计数器,因此不需要手动计算两次捕获值之差(即不需要 capture_value = current_capture - last_capture)。

为什么不需要相减?

TIM_SlaveMode_Reset 模式下:

  1. 每次触发信号(如上升沿)到来时,计数器会自动归零(CNT = 0)
  2. 计数器会重新开始递增,直到下一个触发信号到来。
  3. 读取的 TIM_GetCaptureX(TIMx) 值就是两次触发之间的计数值(即一个完整的周期)。

因此,直接读取捕获寄存器的值 TIM_GetCapture1(TIM3) 就是信号的周期(单位:定时器计数周期),无需像普通输入捕获模式那样计算差值。


示例代码(适用于 TIM_SlaveMode_Reset 模式)

#include "stm32f10x.h"

float Calculate_Period(void)
{
    uint32_t capture_value = TIM_GetCapture1(TIM3);  // 直接读取当前计数值
    
    if (capture_value > 0)
    {
        // 计算周期(单位:秒)
        float period = (float)capture_value / 1000000.0f;  // 假设定时器时钟=1MHz(72MHz/72)
        return period;
    }
    return 0;
}

int main(void)
{
    // 初始化TIM3为从模式(复位模式)
    TIM3_Slave_Configuration();  // 参考前面的配置
    
    while (1)
    {
        float period = Calculate_Period();
        if (period > 0)
        {
            // 计算频率(Hz)
            float frequency = 1.0f / period;
            
            // 可以通过串口打印或处理频率值
            // printf("Period: %.6f s, Frequency: %.2f Hz\n", period, frequency);
        }
    }
}

对比普通输入捕获 vs. 从模式复位

方式 是否需要计算差值 适用场景 优点 缺点
普通输入捕获 需要 (capture_value = current - last) 通用频率测量 灵活,适用于各种信号 需要处理计数器溢出
从模式复位 (TIM_SlaveMode_Reset) 不需要(自动归零) 精确周期测量 无需手动计算,避免溢出问题 仅适用于周期性信号

总结

  1. TIM_SlaveMode_Reset 模式下,定时器会在每次触发时自动复位,因此 TIM_GetCaptureX() 直接返回周期值,无需计算差值。
  2. 适用于精确测量周期或频率,尤其适合 PWM、方波等周期性信号。
  3. 计算频率时,只需 frequency = 1 / period,其中 period = capture_value / timer_clock

这种模式比普通输入捕获更简单,特别适合需要高精度测量的应用(如编码器、PWM输入等)。

注意:

由于从模式只能选择一个触发源,多通道同时测量需要采用其他方法,如:

分时复用

使用多个定时器

采用普通输入捕获模式

STM32定时器从模式(Slave Mode)详解

定时器从模式是STM32定时器系统中一个强大的功能,它允许一个定时器(从定时器)受另一个定时器(主定时器)或外部信号控制。理解从模式对于实现精确的定时、同步和测量非常重要。

从模式基本概念

1. 主从定时器关系

  • 主定时器(Master):产生触发信号的定时器
  • 从定时器(Slave):接收触发信号并作出响应的定时器

2. 从模式核心思想

从定时器可以配置为在特定事件(如另一个定时器的更新事件、外部信号边沿等)发生时自动执行预定义的操作,如复位计数器、启动/停止计数等。

从模式的6种工作方式

STM32提供了多种从模式,以下是主要模式:

从模式 功能描述 典型应用
复位模式(SlaveMode_Reset) 触发信号使计数器复位 频率测量、脉冲计数
门控模式(SlaveMode_Gated) 触发信号高电平期间计数 脉冲宽度测量
触发模式(SlaveMode_Trigger) 触发信号作为计数器时钟 外部时钟同步
外部时钟模式1(SlaveMode_External1) 外部引脚上升沿计数 编码器接口
组合复位+触发 复位后使用触发信号计数 复杂定时序列
编码器模式 专用编码器接口模式 旋转编码器

从模式配置关键步骤

1. 选择触发源(Trigger Source)

TIM_SelectInputTrigger(TIMx, TIM_TS_XXX);

常见触发源:

  • TIM_TS_ITRx:内部触发(其他定时器)
  • TIM_TS_TI1F_ED:TI1边沿检测
  • TIM_TS_TI1FP1:滤波后的TI1输入
  • TIM_TS_TI2FP2:滤波后的TI2输入
  • TIM_TS_ETRF:外部触发输入

2. 设置从模式

TIM_SelectSlaveMode(TIMx, TIM_SlaveMode_XXX);

3. 配置滤波器(可选)

TIM_ICInitStructure.TIM_ICFilter = 0x0F; // 最大滤波

典型应用实例

实例1:精确频率测量(复位模式)

// 配置TIM3为从模式,使用TI2作为触发源
void Config_FreqMeasurement(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    
    // 时基配置
    TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
    TIM_TimeBaseStructure.TIM_Prescaler = 72-1; // 1MHz
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    
    // 选择TI2作为触发源
    TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);
    
    // 设置为复位模式
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
    
    TIM_Cmd(TIM3, ENABLE);
}

工作原理:每次TI2出现上升沿时,计数器复位,读取的计数值即为信号周期。

实例2:主从定时器同步

// TIM2作为主,TIM3作为从
void Config_MasterSlaveSync(void)
{
    // 主定时器TIM2配置
    TIM_TimeBaseInit(TIM2, ...);
    
    // 配置TIM2的更新事件作为触发输出
    TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
    
    // 从定时器TIM3配置
    TIM_TimeBaseInit(TIM3, ...);
    
    // 选择ITR1作为触发源(TIM2→TIM3)
    TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1);
    
    // 设置为触发模式
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);
}

效果:TIM3的计数与TIM2同步。

从模式高级应用技巧

  1. 级联定时器

    • 多个定时器级联实现更长定时
    • 示例:TIM1触发TIM2,TIM2触发TIM3
  2. PWM输入模式

    • 实际上是两个从模式的组合(复位+触发)
    • 可同时测量PWM周期和占空比
  3. 编码器接口

    • 专用从模式配置
    • 可自动处理正交编码信号
  4. 定时器事件同步

    • 多个定时器的启动/停止同步
    • 确保多个定时器完全同步运行

常见问题解答

Q1: 一个定时器可以同时使用多个从模式吗?
A: 不可以,一个定时器一次只能选择一种从模式,但可以通过巧妙配置实现复合功能。

Q2: 从模式会影响PWM输出吗?
A: 会,某些从模式(如复位模式)会影响计数器运行,从而影响PWM生成。

Q3: 如何选择最适合的从模式?
A: 根据需求:

  • 频率测量 → 复位模式
  • 脉冲宽度测量 → 门控模式
  • 外部时钟计数 → 外部时钟模式
  • 定时器同步 → 触发模式

Q4: 从模式需要中断吗?
A: 不一定,可以轮询状态寄存器,但中断能提高实时性。

理解定时器从模式需要结合实践,建议通过实际项目加深理解。您是否有特定的应用场景需要实现?我可以提供更具体的配置建议。

STM32定时器从模式(Slave Mode)详解

定时器从模式是STM32定时器系统中一个强大而灵活的功能,它允许定时器之间或定时器与外部信号之间建立主从关系,从而实现精确的定时控制和信号测量。下面我将全面解析定时器从模式的工作原理和应用。

从模式基本概念

定时器从模式是指一个定时器(从定时器)可以受另一个定时器(主定时器)或外部信号控制的工作模式。在这种模式下,从定时器会根据配置的触发源和从模式类型,在特定事件发生时自动执行预定义的操作。

关键特点:

  1. 触发源多样性:可以选择内部定时器触发、外部引脚信号或特定定时器事件作为触发源
  2. 自动响应:从定时器在触发事件发生时自动执行操作,无需软件干预
  3. 精确同步:可以实现多个定时器之间的精确同步
  4. 减少中断:通过硬件自动处理,减少软件中断负担

从模式的主要类型

STM32提供了多种从模式工作方式,每种方式适用于不同的应用场景:

1. 复位模式(SlaveMode_Reset)

  • 功能:触发信号的上升沿重新初始化计数器(CNT清零)并产生更新事件
  • 典型应用:频率测量、脉冲周期测量
  • 特点:每次触发边沿自动复位计数器,可直接读取CNT值得到周期

2. 门控模式(SlaveMode_Gated)

  • 功能:触发信号高电平期间使能计数器
  • 典型应用:脉冲宽度测量
  • 特点:可测量输入信号的高电平持续时间

3. 触发模式(SlaveMode_Trigger)

  • 功能:触发信号作为计数器时钟
  • 典型应用:外部时钟同步
  • 特点:允许外部信号控制计数节奏

4. 外部时钟模式1(SlaveMode_External1)

  • 功能:选中的触发信号(TRGI)的上升沿时钟计数器
  • 典型应用:编码器接口、外部事件计数
  • 特点:将外部信号作为计数时钟源

从模式配置关键步骤

配置定时器从模式通常需要以下步骤:

  1. 选择触发源

    TIM_SelectInputTrigger(TIMx, TIM_TS_XXX);
    

    常见触发源包括:

    • TIM_TS_ITRx:内部触发(其他定时器)
    • TIM_TS_TI1F_ED:TI1边沿检测
    • TIM_TS_TI1FP1:滤波后的TI1输入
    • TIM_TS_TI2FP2:滤波后的TI2输入
    • TIM_TS_ETRF:外部触发输入
  2. 设置从模式

    TIM_SelectSlaveMode(TIMx, TIM_SlaveMode_XXX);
    
  3. 使能主从模式(如果需要定时器作为主设备):

    TIM_SelectMasterSlaveMode(TIMx, TIM_MasterSlaveMode_Enable);
    

从模式典型应用实例

实例1:精确频率测量(复位模式)

void Config_FreqMeasurement(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    
    // 时基配置
    TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
    TIM_TimeBaseStructure.TIM_Prescaler = 72-1; // 1MHz计数频率
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    
    // 选择TI2作为触发源
    TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);
    
    // 设置为复位模式
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
    
    TIM_Cmd(TIM3, ENABLE);
}

工作原理:每次TI2出现上升沿时,计数器自动复位,读取的CNT值即为信号周期。

实例2:定时器级联(扩展计数器位数)

// TIM2作为主,TIM4作为从,组成32位计数器
void Config_TimerCascade(void)
{
    // 主定时器TIM2配置
    TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
    TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
    
    // 从定时器TIM4配置
    TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_External1);
    TIM_SelectInputTrigger(TIM4, TIM_TS_ITR2);
}

效果:TIM2每溢出一次,TIM4计数加1,实现32位计数能力。

从模式高级应用技巧

  1. PWM输入模式

    • 使用两个从模式通道(复位+触发)同时测量PWM周期和占空比
    • 一个通道测量周期,另一个通道测量高电平时间
  2. 编码器接口模式

    • 专用从模式配置
    • 可自动处理正交编码信号的正反向计数
  3. 定时器事件同步

    • 多个定时器的启动/停止同步
    • 确保多个定时器完全同步运行
  4. 复杂定时序列生成

    • 主定时器控制从定时器的启动、停止和复位
    • 实现精确的定时事件序列

从模式使用注意事项

  1. 触发源选择

    • 确保选择的触发源与实际信号来源一致
    • 注意不同定时器之间的内部触发连接关系
  2. GPIO配置

    • 外部触发信号对应的GPIO需配置为复用功能
    • 注意引脚重映射情况
  3. 中断使用

    • 从模式通常不需要中断,但可以配合中断实现更复杂功能
    • 中断优先级需合理设置
  4. 定时器资源限制

    • 不是所有定时器都支持全部从模式
    • 高级定时器(TIM1/TIM8)功能更丰富
  5. 性能考虑

    • 高频信号测量时,优先使用从模式而非中断
    • 考虑使用DMA减少CPU干预

常见问题解答

Q1: 一个定时器可以同时使用多种从模式吗?
A: 不可以,一个定时器一次只能配置一种从模式,但可以通过通道组合实现复合功能(如PWM输入模式)。

Q2: 从模式测量频率的范围是多少?
A: 取决于定时器时钟频率,理论上最高可测频率为定时器时钟频率的1/2。例如1MHz时钟最高可测500kHz。

Q3: 从模式会影响PWM输出吗?
A: 会,某些从模式(如复位模式)会影响计数器运行,从而影响PWM生成。

Q4: 如何选择最适合的从模式?
A: 根据需求选择:

  • 频率测量 → 复位模式
  • 脉冲宽度测量 → 门控模式
  • 外部时钟计数 → 外部时钟模式
  • 定时器同步 → 触发模式

定时器从模式是STM32定时器系统中的高级功能,通过合理配置可以实现精确的信号测量和定时控制。理解其工作原理和配置方法对于开发复杂的定时应用至关重要。实际应用中,建议结合具体需求选择合适的从模式,并通过实验验证配置效果。


网站公告

今日签到

点亮在社区的每一天
去签到