你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32定时器ETR信号的应用示例

[复制链接]
eefishing 发布时间:2020-6-9 13:01
有人使用STM32芯片开发产品,其中有个功能就是统计某外部信号脉冲个数。他采用外部中断方式,来一个信号触发一次中断,在中断程序里实现计数累加。但由于被统计的信号频率较高,而中断本身也是需要时间的,往往导致有些脉冲没被统计而发生丢数的问题。况且,CPU这样频繁地去响应中断还会衍生出其它系统性问题。

% _4 {% A# m* _, \
他咨询是否可以将该信号作为定时器的时钟源,每来一个脉冲信号计数器就自动加1。这样的话,用户适时去读取计数器的值即可。若有,如何实现?
7 k+ A$ Z) c5 y* N3 t: [3 ]8 W
对于这种情况,我们可以将被统计信号连接到定时器的ETR脚,并作为定时器的计数时钟。开启定时器更新中断对溢出次数进行统计,择时读取计数器的值和溢出次数即可。这样既避免了CPU频繁进中断而无法应对别的事情的困境,也避免了因CPU优先忙于别的事情而来不及响应外部中断导致计数出错的麻烦。
0 v" v9 U: f; u# r, b5 m, L
对于STM32来讲,从ETR脚引入时钟信号,可以有两种模式。
* u" N3 l1 k* {3 v5 a/ \
11.png
$ \7 y/ `4 x" O0 W! F
第一种模式,即外部时钟1模式,此时来自ETR脚的信号经过滤波、边沿检测和极性选择后,以触发信号的角色连接到从模式控制器,并作为定时器的时钟源,即上图中的1路。
第二种模式,即外部时钟2模式,来自ETR脚的时钟信号经过极性选择、分频、滤波后不经过从模式控制器,而是像内部时钟源一样直接为计数器提供计数时钟,即上图中的2路。
现在分别以上面提到的两种模式演示定时器对来自ETR脚的时钟信号进行计数的过程。这里以STM32F411 Nucleo开发板来进行实验。
用TIM1_CH1模拟产生某频率的PWM脉冲信号,将其通过跳线连接到ETR脚。为便于测量和演示,让TIM1工作在单脉冲PWM模式,结合RCR寄存器输出指定个数的脉冲。使用TIM3对来自ETR脚的时钟信号进行计数,同时开启TIM3更新中断对溢出次数进行统计。
让TIM1-CH1启动后输出248个脉冲后停下来,而TIM3每统计200个脉冲就产生溢出,即令TIM3_ARR值等于199。
现在使用STM32CUBEMX进行基本的配置。

4 e- d& j1 [; V, h" C* Z
先对用来模拟产生外来脉冲信号的TIM1进行配置。做些基本的时基配置即可。
( i0 g  K0 g& C8 [6 D
22.png
% [* D+ v" K$ n# q$ I% n5 k) q
然后对TIM3进行配置,时钟来自ETR脚,工作在外部时钟模式2。
/ j: |$ O% j& b- z
33.png
5 Y: e7 i2 E  o, ~. Y  N, J4 B+ \
将时钟、NVIC等配置完毕后即可生成初始化代码。
定义变量CNT_Update记录TIM3的溢出次数。基于STM32Cube 库稍加组织代码即可查看结果。

% @" b9 d7 _6 ?* {# m( y
44.png
' c( C; N2 L1 d9 {/ f
编译运行查看结果:
( }1 e4 i# ^6 i2 Y
55.png

* D# a- p8 h% c1 R
TIM3发生溢出1次,结合上面配置可知其对应的脉冲个数为200,此时计数器里的值为0x30,即48,总共248个脉冲,跟TIM1_CH1输出的248个脉冲数相同。

9 L; C& D" q, M$ K2 ~; D0 M$ m
上面的实验是基于TIM3工作在ETR外部时钟模式2,我们不妨再看看基于外部时钟模式1的情况。现在只需对TIM3的时钟配置稍作调整,其它参数不动。
6 N! Y  M  z( r& y' S' V" S* S
66.png
; \8 a$ y" G; M* s; R
生成初始化代码后,基于前面组织的用户代码不做任何调整即可编译运行验证。
0 c, w: Y, H+ ]$ m7 m
77.png
8 J9 [/ J/ i2 H6 r' S, U+ H
上面验证结果与外部时钟模式2完全相同,跟TIM1_CH1输出的脉冲数完全吻合。
# P4 A+ u$ r# K$ P5 ?
从上面示例来看,当时钟信号来自ETR脚时,不论使用外部时钟模式1还是外部时钟模式2,都可以实现完全相同的结果。那么基于同一个时钟源,为什么弄出2个时钟模式呢?

9 ~! u3 D) B( G  G% Y9 T' k. W& K
首先,定时器本身支持多钟时钟模式,其中包括外部时钟模式1与外部时钟模式2。只不过来自ETR脚的时钟信号既可以工作外部时钟模式1,也可以工作在外部时钟模式2。

$ o. H' ^4 D# H6 B0 k) v; `) z
外部时钟模式1的主要特点是时钟信号还同时兼具触发信号的角色,此时定时器也一定工作在从模式,这个从模式就是外设时钟模式1从模式。STM32参考手册关于这个模式,在讲解定时器主从连接的相关实例时进行过介绍,但没有将其跟复位从模式、触发从模式等从模式一起单列出来进行介绍。我们在用STM32CubeMX进行配置时也可以发现有个从模式选项就是外部时钟1从模式。

3 i2 Z+ p9 d; {- C* t. [
前面也提到了,外部时钟模式1下的时钟除了做时钟外,还做触发信号。基于这个触发信号可以产生触发事件,从而触发中断或产生DMA请求。而外部时钟模式2就是特指来自ETR脚的时钟,只是个纯粹的时钟,不具备触发功能。但是,选择外部时钟模式2的定时器,既可以工作在主模式,也可以工作在诸如复位/触发/门控等从模式。

+ N# O4 Y& f0 b7 n7 v6 X2 G/ m
另外,作为外部时钟模式1的时钟,它可以有多个来源,除了ETR脚外,还可以是TI1、TI2输入脚或者其它定时器的触发输出,而工作在外部时钟模式2的时钟只能来自ETR脚。显然,基于开篇的客户需求,它的被测信号还可以接到别的特定管脚上来处理。
8 d( M7 D0 y2 n6 w! U& [8 I$ b/ C9 U
最后做点提醒。基于上面应用,弄清实现原理后,自行组织用户代码应该说非常简单了。不过,即使这样,可能还是会有不少人在有个地方出问题,就是没有下图中那句对TIM3的更新事件标志进行清零的代码。很多场景,这行代码可有可无。当遇到目前这种应用时,就不能可有可无了。

: [9 H5 [/ K$ r4 B7 N9 A8 L1 B
88.png
. g1 v' }, J4 t2 \! c) k+ M( u
基于上面的程序逻辑,如果没有这句代码会发生统计所得的溢出次数与实际溢出次数多1的状况。以上面应用为例,我什么都不改动,只将那行代码注释掉,运行结果会变成下面的样子。计数器里的值虽然还是48,但溢出次数变成2了!

, X) d7 f  @4 l. q( }! I
99.png

% k6 G: I* I+ w6 N' Z  J2 w
像这种需要统计精确数据的情形,发生这种问题往往就难以接受。为什么要加这句代码呢?如果不加这句代码怎么会导致统计到的溢出次数平白无故多1次呢?

1 i8 `+ |# t/ Z4 j$ s* R* A( |9 I% u+ I
关于这点可以自行思考下,在此不延申解释了。

6 t" P2 H9 c4 C9 J( D7 g
) n& }; g7 P3 Y1 y( U4 ?3 |9 d0 M' v
收藏 1 评论2 发布时间:2020-6-9 13:01

举报

2个回答
goyhuan 回答时间:2020-6-9 14:57:46
谢谢大神指导,非常详细
DEPHY 回答时间:2024-11-21 11:48:27

我就说为毛ETR不能触发 TIF 中断呢😕

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版