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 配置为捕获下降沿(占空比终点)
-
得到的两次捕获值之差即可算出高电平持续时间或周期
-
四、通道映射说明
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. 启动捕获:
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); // 启动通道1输入捕获(中断方式)
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2); // 启动通道2输入捕获
2. 中断回调处理:
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;elsepulse_width = (0xFFFF - capture1 + capture2); // 溢出处理}
}
1;elsepulse_width = (0xFFFF - capture1 + capture2); // 溢出处理}
}