【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); // 溢出处理
    }
}
相关推荐
东京老树根21 小时前
Arduino - 入门02 - Arduino编程基础 Arduino程序结构,实物与模拟器对照,Arduino常用函数
单片机·机器人
salipopl1 天前
基于STM32平台的多旋翼无人机系统设计与实现
stm32·嵌入式硬件·无人机
iCxhust1 天前
8086/8088单板机VSCode集成自动下载功能(完善串口接收显示版)
ide·vscode·单片机·编辑器·微机原理·8088单板机·8086单板机
振南的单片机世界1 天前
从数码管到点阵屏:动态扫描加595,3个IO驱动256个LED
stm32·单片机·嵌入式硬件
listhi5201 天前
STC8 16通道模拟采集 + 4路串口 + 8路PWM 程序
stm32·单片机·嵌入式硬件
星夜夏空991 天前
STM32单片机学习(4)——嵌入式概述
stm32·单片机·学习
Deitymoon1 天前
STM32——OLED显示字符串
单片机·嵌入式硬件
LCG元1 天前
STM32实战:基于STM32F407的FFT频谱分析(音频信号处理)
stm32·音视频·信号处理
Graceful_scenery1 天前
龙芯2k0300 - 走马观碑组按键驱动移植
单片机·嵌入式硬件
d111111111d1 天前
MQTT+STM32+ESP8266网络程序分层+韦老师
笔记·stm32·单片机·嵌入式硬件·学习·php