STM32学习专栏封面图

🚀 我的STM32学习专栏:[点击直达 | 持续更新中]

STM32输入捕获技术文章封面

前言

上一篇文章我们讲了输出比较,这一章节我们讲输入捕获的相关知识点,建议先看完上一篇输出比较再来学这个,因为输入捕获和输出比较用的是同一套硬件寄存器,跟着江科大的课程学到这里,我发现输入捕获这块内容函数多,但只要理清楚逻辑,其实也好上手。下面我把笔记整理成文章,希望能帮到正在学习的你!

一、什么是输入捕获?

输入捕获(IC),说白了,就是定时器的一个"抓拍"功能。

当定时器的某个通道输入引脚上,检测到你指定的电平跳变(比如上升沿或者下降沿)时,硬件会自动把当前计数器CNT的值"咔嚓"一下锁存到捕获/比较寄存器CCR里。这个过程完全由硬件自动完成,不需要CPU干预,所以精度非常高。

我的理解:你可以把CNT想象成一个一直在跑的秒表,输入捕获就是那个帮你按秒表的人。当外部信号来了,它帮你记下此刻秒表的读数,存到CCR里。你之后去读CCR,就知道"这个时刻"计数器跑到哪了。

那它能干啥呢?用处可多了:

  • 测量PWM的频率

  • 测量PWM的占空比

  • 测量脉冲间隔

  • 测量电平持续时间

每个高级定时器(TIM1、TIM8)和通用定时器(TIM2~TIM5)都有4个输入捕获通道。而且有个很牛的功能叫PWM输入模式,可以同时测频率和占空比,全程硬件自动完成,CPU只需要最后去CCR里读数就行。

⚠️ 注意:输入捕获和输出比较(PWM输出)不能同时使用同一个通道,这很好理解——一个引脚不能既当输入又当输出。


二、频率测量的两种方法

在讲输入捕获之前,先搞懂测频率的两种基本思路,这决定了你后面代码该怎么写。

频率测量两种方法对比图

测频法与测周法原理对比示意图

1. 测频法(适合测高频)

原理:固定一个闸门时间T,在这段时间内数上升沿的个数N。

fx​=N/T​

我的理解:就像你站在门口数1分钟(T)内过去了多少人(N),人数除以时间就是人流频率。频率越高,N越大,误差越小。所以测频法适合测高频信号

2. 测周法(适合测低频)

原理:测量两个相邻上升沿之间的时间间隔(一个周期),用标准频率fc去填充这个周期,数出填充的个数N。

fx​=fc/N​​

我的理解:测周法就像用一把精细的尺子(标准频率fc)去量一个物体的长度(周期)。周期越长(频率越低),量的越准。所以测周法适合测低频信号

3. 中界频率

两种方法都有误差,那到底什么时候用测频法,什么时候用测周法?有个分界点叫中界频率

fm​=Tfc​​​

  • 当 fx​>fm​ 时,用测频法误差更小

  • 当 fx​<fm​ 时,用测周法误差更小

⚠️我们也可以用STM32的方法来实现这两种方法:测频法这个我们用之前学过的外设就可以实现像对射式红外传感器计次,定时器外部时钟这些代码稍加改进就是测频法(每隔一秒取一下计次输出便是频率,,这个可以下去自己试验),我们重点讲的是测周法。


三、输入捕获的硬件结构

STM32输入捕获硬件结构框图

STM32输入捕获硬件结构框图

信号流向(从左到右)

  1. TI1:外部信号从GPIO引脚进来

  2. fDTS:采样时钟,来自内部时钟分频

  3. 滤波器:滤除毛刺噪声,ICF[3:0]控制滤波参数(比如连续采样几次才认为是有效边沿)

  4. 边沿检测器:检测上升沿(TI1F_Rising)或下降沿(TI1F_Falling),CC1P控制极性选择

  5. 选择器:选择直通(TI1FP1)还是交叉(TI2FP1,来自通道2)

  6. 分频器:IC1PS控制分频比(1/1、1/2、1/4、1/8),每N个边沿触发一次捕获

  7. 捕获/比较器:最终把CNT的值锁存到CCR1

我的理解:这个滤波器特别重要!如果你的信号有毛刺,不滤波的话会误触发。ICF参数就是告诉硬件:"连续采样8次都是高电平,我才认为是真的高电平",这样抗干扰能力就强了。


四、主从触发模式

(江科大博主起的比较形象的名字)

这是输入捕获的灵魂功能,也是江科大视频里重点讲的。搞懂这个,你就搞懂了输入捕获的精髓。

主从触发模式示意图

主从触发模式工作原理示意图

主模式(Master Mode)

定时器把自己的内部信号(比如更新事件Update、输出比较OC1REF等)映射到TRGO引脚,用来触发别的外设。

我的理解:主模式就是"我发出命令,别人听我的"。比如我定时器每计数满一次,就通过TRGO告诉ADC:"你该采样了!"

从模式(Slave Mode)

定时器接收别的外设发来的信号(通过TRGI),用来控制自身的运行。从模式有几种动作:

  • Reset:把CNT清零(这个最常用!)

  • Gated:门控,外部信号有效时才计数

  • Trigger:触发启动计数

  • External1:外部时钟模式1

触发源选择

决定从模式听谁的命令。可选的触发源有:

  • ITR0~ITR3:来自其他定时器

  • TI1F_ED:通道1的边沿检测

  • TI1FP1:通道1的滤波后信号(测频率常用这个!)

  • TI2FP2:通道2的滤波后信号

  • ETRF:外部触发输入

我的理解:主从触发模式就是定时器之间的"传声筒"。在输入捕获里,我们最常用的是:通道1捕获到上升沿后,触发从模式Reset,把CNT清零。这样每次捕获的CCR值,其实就是两次上升沿之间的CNT差值,也就是周期!


五、输入捕获基本结构(单通道测频率)

这是只用一个通道的配置,只能测频率,不能测占空比。

工作流程

  1. GPIO输入方波信号

  2. 经过滤波器和边沿检测,选择上升沿触发

  3. TI1FP1信号兵分两路:

    • 一路进捕获通道,把当前CNT值锁存到CCR1

    • 另一路进触发源选择,触发从模式Reset,把CNT清零

  4. 所以CCR1的值 = 一个周期内CNT计数的个数

  5. 频率 = 计数器时钟频率 / CCR1

我的理解:你可以把“从模式 Reset”想象成一个自动归零的秒表。每次上升沿到来,秒表自动把当前读数存进 CCR,然后立马归零重新开始计时。这样 CCR 里永远存的是“上一个完整周期”的长度。如果不用这个模式,你就得用两个变量分别记下两次捕获值,然后手动相减,代码麻烦不说,还容易丢数据。


六、PWM输入模式(双通道同时测频率和占空比)

这是输入捕获的高级玩法,用两个通道同时捕获同一个引脚,一次性搞定频率和占空比。

配置思路

  • 通道1:上升沿触发,直通输入(TI1FP1),捕获周期 → 存入CCR1

  • 通道2:下降沿触发,交叉输入(TI2FP1),捕获脉宽 → 存入CCR2

  • 从模式选择Reset,触发源选TI1FP1(通道1的上升沿)

工作流程

  1. 信号上升沿到来:CCR1 = CNT(记录周期),CNT清零

  2. 信号下降沿到来:CCR2 = CNT(记录高电平时间)

  3. 下一个上升沿到来:CCR1 = 新的周期值,CNT清零……

计算公式

  • 频率:f=fCNT/CCR1​​ (计数器时钟频率除以一个周期的计数值)

  • 占空比:Duty=CCR2/CCR1​×100% (高电平时间除以总周期)

我的理解:通道1负责"圈地"(定周期),通道2负责"量地"(量高电平)。两个通道配合得天衣无缝,而且全是硬件干的活,CPU只需要在需要的时候去读CCR1和CCR2就行。

🤔 思考题(检验自己有没有真懂)
如果把 PWM 输入模式的通道1改成下降沿触发,通道2改成上升沿触发,会怎样?欢迎在评论区说出你的答案。


七、个人理解与心得

关于测频法和测周法的选择:刚开始学的时候,我一直搞不清什么时候用哪种方法。后来自己做实验发现,如果你测的是一个几百Hz的电机转速信号,用测周法(输入捕获)精度明显更高。但如果你测的是一个几十kHz的PWM信号,测频法(定时器中断计数)反而更合适。所以中界频率那个公式不是摆设,它是你真的会用到的东西。

关于主从触发模式:我第一次看江科大视频的时候,主从模式听得云里雾里的。后来自己动手画了个流程图才想明白——从模式Reset就是"捕获的同时清零",这样CCR里的值永远是"最新一个周期"的长度。没有这个自动清零,你就得手动算两次捕获值的差,既麻烦又容易溢出。

关于PWM输入模式:这个模式真的太优雅了!两个通道配合得天衣无缝,通道1定周期,通道2量脉宽。我最开始还担心通道2的下降沿捕获会不会影响通道1的上升沿,后来看了手册才知道它们是独立的,只是共享同一个触发源。这种硬件层面的"协作",软件很难做到这么精准。


八、总结表格

项目 输入捕获基本结构(单通道) PWM输入模式(双通道)
测量功能 只能测频率 同时测频率+占空比
使用通道 1个通道(如CH1) 2个通道(CH1+CH2)
通道1配置 上升沿触发,直连输入 上升沿触发,直连输入
通道2配置 不使用 下降沿触发,交叉输入
从模式 Reset,触发源TI1FP1 Reset,触发源TI1FP1
CCR1含义 一个周期的计数值 一个周期的计数值
CCR2含义 高电平期间的计数值
频率公式 f=fc​/CCR1 f=fc​/CCR1
占空比公式 无法测量 Duty=CCR2/CCR1
适用场景 只需要知道频率 需要同时知道频率和占空比
CPU干预 完全硬件自动 完全硬件自动

写这篇文章的时候,我把江科大的视频又回顾了一遍,对照着《STM32F10xxx参考手册》把输入捕获的框图重新梳理了一遍。说实话,输入捕获这个知识点,光看视频很容易觉得"好像懂了",但真正到自己写代码、调程序的时候,才会发现主从模式怎么配、触发源选哪个、交叉输入是什么意思……这些细节不亲手过一遍,真的很难形成肌肉记忆。

📌 开发环境:Keil5 + STM32F103C8T6最小系统板 + ST-Link
📌 参考资料:江科大STM32入门教程、《STM32F10xxx参考手册》
📌 前置文章STM32入门:输出比较(OC)函数配置详解 —— 从PWM波形到代码实战

如果本文对你有帮助,欢迎点赞 👍 收藏 ⭐ !有任何问题欢迎在评论区交流,一起学习进步!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐