【STM32】定时器输入捕获

STM32 定时器输入捕获功能笔记

一、什么是输入捕获(Input Capture)

输入捕获是利用定时器的输入通道,在检测到信号电平变化(如上升沿或下降沿)时,立即将当前计数器的值捕获并保存到捕获寄存器(CCR)中 。这一过程由硬件完成,不会受程序运行延迟影响,可用于精确测量信号的时间特性。

典型应用场景:测量脉冲宽度、频率、信号周期等。


二、输入捕获的基本原理

  • STM32 的通用定时器和高级定时器都支持输入捕获功能。

  • 每个输入通道(TIx)都对应一个捕获寄存器 CCRx。

  • 捕获过程:
    TIx → 滤波器 → 边沿检测 → 捕获事件 → CCRx记录当前CNT值

当配置为上升沿捕获 时:

→ 信号从低跳高时,CCRx 记录当前定时器 CNT 的值。

当配置为下降沿捕获 时:

→ 信号从高跳低时,CCRx 同样记录 CNT 值。

📌 一个通道只能设置为上升沿或下降沿捕获,不能同时捕获两个。


三、直接模式与间接模式(重点)

输入捕获支持 直接模式间接模式,用于灵活地测量信号宽度或周期。

模式 捕获通道 检测通道 用途举例
直接模式 CCR1 记录 TI1FP1 的边沿 用于周期或频率测量
间接模式 CCR1 记录 TI2FP1 的边沿 用于测量高/低电平宽度(PWM输入)

⚠️ TI1/TI2 是一对可互相借用输入的通道,TI3/TI4 亦同理。

例如 CCR1 可以捕获 TI2(间接模式)输入的边沿,而不是 TI1。

示例说明:
  • PWM输入测量

    • CCR1 配置为捕获上升沿(周期起点)

    • CCR2 配置为捕获下降沿(占空比终点)

    • 得到的两次捕获值之差即可算出高电平持续时间或周期


四、通道映射说明

text 复制代码
TI1  --> TI1FP1 → 捕获寄存器1(CCR1)
TI2  --> TI2FP2 → 捕获寄存器2(CCR2)
TI1  --> TI1FP2 → 捕获寄存器2(间接模式)
TI2  --> TI2FP1 → 捕获寄存器1(间接模式)

TI3、TI4同理,支持直接与间接映射

五、CubeMX 设置步骤(以 TIM2 CH1 CH2 为例)

1.选择定时器 TIM2

2.选择 Channel 1 → Input Capture Direct Mode(上升沿)

3.选择 Channel 2 → Input Capture Indirect Mode(下降沿)

4.设置输入极性(上升沿/下降沿)

5.设置采样频率与滤波器(一般默认即可)

6.勾选 TIM2 global interrupt

7.生成代码并编辑中断回调函数


六、HAL库相关函数与代码示例

1. 启动捕获:

c 复制代码
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); // 启动通道1输入捕获(中断方式)
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2); // 启动通道2输入捕获

2. 中断回调处理:

c 复制代码
uint32_t capture1 = 0, capture2 = 0, pulse_width = 0;

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
    {
        capture1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); // 上升沿时间
    }
    else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
    {
        capture2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); // 下降沿时间

        if(capture2 > capture1)
            pulse_width = capture2 - capture1;
        else
            pulse_width = (0xFFFF - capture1 + capture2); // 溢出处理
    }
}
1;
        else
            pulse_width = (0xFFFF - capture1 + capture2); // 溢出处理
    }
}
相关推荐
2401_872990536 小时前
stm32 HAI库 SPI(一)原理
stm32·单片机·嵌入式硬件
小智学长 | 嵌入式6 小时前
单片机-89C51部分:12 pwm 呼吸灯 直流电机
单片机·嵌入式硬件
佛大第一深情11 小时前
ESP32 在Platform Arduino平台驱动外部PSAM,进行内存管理
c语言·单片机·嵌入式硬件
hallo-ooo12 小时前
【STM32】定时器的外部时钟模式
stm32·单片机
小智学长 | 嵌入式13 小时前
单片机-STM32部分:1、STM32介绍
stm32·单片机·嵌入式硬件
zhbi9813 小时前
STM32移植U8G2
stm32·单片机·嵌入式硬件·u8g2
Hans_Rudle14 小时前
MSP430G2553驱动0.96英寸OLED(硬件iic)
单片机·嵌入式硬件·msp430
爱奥尼欧14 小时前
【STM32】ADC的认识和使用——以STM32F407为例
stm32·单片机·嵌入式硬件
海绵宝宝的月光宝盒19 小时前
[STM32] 4-2 USART与串口通信(2)
c语言·开发语言·笔记·stm32·单片机