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

STM32 输入捕获功能

[复制链接]
STMCU-管管 发布时间:2020-9-10 12:27
01 STM32捕获功能
从STM32的定时器框图中看
1.png
& A- b3 }5 z9 x( z) s9 O& O4 k
7 O: O! C9 }5 E
从上图可以看出定时器1共有4个输入捕获通道。

. [' h. p* F- m# S. C
下文以定时器1的捕获通道2为例讲解。

" F) K0 x8 D8 j/ d
首先确定下对应的GPIO,从STM32F207数据手册的Alternatefunction mapping看出,定时器1通道2对应的GPIO有PA9和PE11,下文将使用PE11。
: o' _" u/ _+ }5 j
2.png
02 输入捕获过程
" ?& r  p, a4 I1 ^- w( V' t
输入阶段采样对应的对输入TIx,去产生滤波后的信号TIxF。然后极性选择边沿检测器产生一个信号(TIxFPx),这个信号可以被用于服务模式控制器的触发输入或在作为捕获命令。在捕获寄存器前被预分频。

5 Y* ]4 X. _, k& h7 A+ R  t
3.png

7 ?! k; c9 h. _8 }
输出阶段产生一个中间波形,被用于参考:OCxRef(高电平有效)。链地末尾末尾决定极0性。捕获/比较通道1 主电路。
# N4 P* z* h( v# m5 ]6 `' }  {
①处主要是设置输入捕获滤波器,输入阶段采样对应的对输入TIx,去产生滤波后的信号TIxF。一般应用场景不做滤波处理,设置TIMx_CCMR1的ICF[3:0]=0000,只要采集到上升沿,就触发捕获。
, j( ?$ V$ ~1 ^1 S
②处主要是设置输入捕获极性,设置TIMx_CCER的CC1P或CC1NP位,如果通道配置为输出,为0表示高电平有效,为1表示低电平有效;如果配置成输入模式,该位选择是IC1还是IC1的反相信号作为触发或捕获信号。为0,表示不反相,为1表示反相。
* v! |9 A/ |7 T
③处设置输入捕获映射通道,设置TIMx_CCMR1的CC1S[1:0]位,这2位定义通道的方向(输入/输出),及输入脚的选择:
3 s7 W# w/ e7 q/ i, M3 k
0o:CC1通道被配置为输出;
01:CC1通道被配置为输入,IC1映射在Tl1上;
10: CC1通道被配置为输入,IC1映射在TI2上;
11:CC1通道被配置为输入,IC1映射在TRC上。此模式仅工作在内部触发器输入被选中时(由TIMx_SMCR寄存器的TS位选择)。
5 j* D1 U1 i/ |, G7 s' U* o
④处设置输入捕获分频器,TIMx_CCMR1的ICPS[1:0]位和TIMx_CCER的CC1E位。
- J: X4 U9 o. C! t: @4 h1 H
TIMx_CCMR1的ICPS[1:0]这2位定义了CC1输入(IC1)的预分频系数。一旦CC1E='O(TIMx_CCER寄存器中),则预分频器复位。

! M% y# H2 b( h1 r6 Z  @
00:无预分频器,捕获输入口上检测到的每一个边沿都触发一次捕获;
01:每2个事件触发一次捕获;
10:每4个事件触发一次捕获;
11:每8个事件触发一次捕获。
8 D5 m0 S/ H* G, P" o! G1 ^4 @
TIMx_CCER的CC1E位

/ I9 }# t2 v4 v$ @' a& v
CC1通道配置为输出:
  ?8 p% B& b' Z
0:关闭一OC1禁止输出。
1:开启一OC1信号输出到对应的输出引脚。

' H$ z& Y1 A# t. M1 }% z) W8 N. k. p
CC1通道配置为输入:
# T) b$ c2 O! G2 ^/ B
该位决定了计数器的值是否能捕获入TIMx_CCR1寄存器。

+ l" M: z. k. q: G$ s
0:捕获禁止;
0:捕获使能。

+ \) i& G5 o/ c: F: {
最后我们还需要设置中断,使系统快速响应输入捕获信号,主要是这只TIMx_DIER寄存器,如下:
) L, Y) ]9 n  c5 G: m$ c
4.png
% z) i) h$ @& v3 {+ k$ j
使能允许更新中断和通道2中断
( C1 K$ H( j+ B+ S' g4 @
5.png
03 代码配置
设置GPIO复用
. a9 [1 ?8 [6 @; X
  1. : G: s5 [# a. |" x2 J, W5 m
  2. /* TIM1 channel 2 pin (PE.11) configuration*// ^. y0 C4 _: O' q, M5 b
  3. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;3 u1 I' _! G  ]+ u
  4. GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF;
    ( L3 e" k/ i- @2 w
  5. GPIO_InitStructure.GPIO_Speed =GPIO_Speed_100MHz;7 F! ^  A& |2 F5 O
  6. GPIO_InitStructure.GPIO_OType =GPIO_OType_PP;6 o- S" |! ^0 G. p+ j
  7. GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_NOPULL;6 P: J# p. R1 F0 J0 r8 T/ a
  8. GPIO_Init(GPIOE, &GPIO_InitStructure);& V* M. n1 s! B' E0 x; S7 |

  9. 1 N7 r) ~- R9 K& M0 O
  10. /*Connect TIM pins to AF2 */
    5 |- n8 L* O$ B# T
  11. GPIO_PinAFConfig(GPIOE,GPIO_PinSource11, GPIO_AF_TIM1);
复制代码

4 x4 V0 u* o' B$ L0 V
/ u4 v* x$ {, {# r9 |  z4 ]
设定定时基础功能
" s2 I% H. E: y2 G" {/ G, X
  1. /* Time base configuration */
    * i% [+ S  P% B1 o+ h" n: O* f% I
  2. TIM_TimeBaseStructure.TIM_Period =0XFFFF;; V  j+ r9 W" U, d; P. b
  3. TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t)((SystemCoreClock) / 1000000) -1;
    8 \' `2 w2 ^5 F5 R* Y5 J
  4. TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1;: f- }' w% M% l9 M; b
  5. TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;
    ; a4 ~7 v9 \3 M4 @  W
  6. ; Y0 ^5 u( O- z3 Y0 [  Y0 J( U
  7. TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
复制代码
3 m9 @* G0 p8 G9 B2 D0 [
4 u8 p5 Z6 L( ~
配置通道2

0 u5 h& T/ u- F: i$ T! g/ w  @
  1. ; M5 j% A- Y! o; Q8 F% ]
  2. TIM_ICInitStructure.TIM_Channel =TIM_Channel_2;# [8 [$ R3 d$ c0 }) R' ?7 P; f/ `
  3. TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Falling;
    7 P9 o' y5 f/ _! Y: ?
  4. TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI;
    # R  ?: ?# s% ^. ~: b4 b6 u6 U
  5. TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1;: H2 a4 y9 B9 K* k% ?
  6. TIM_ICInitStructure.TIM_ICFilter =0x0;
    7 i0 M3 C8 P; G9 Z8 Z, N
  7. & P! ?. N' S! s; m9 h
  8. TIM_ICInit(TIM1, &TIM_ICInitStructure);
复制代码

7 C4 K$ y  w. }2 K1 u# x- o* N4 ]

% q1 V) s6 M& G6 O6 x6 _( D
使能中断

& y' A' A& M( E- v; Y) w( S
  1. /* Enable the TIM1 global Interrupt*/
    0 |5 C. c; [  B
  2. NVIC_InitStructure.NVIC_IRQChannel =TIM1_CC_IRQn;
    & F. d/ ~2 o3 ^5 D
  3. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;
    4 t3 U; U5 M! g- @( U
  4. NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;3 _. i" _' D) _( @0 O8 q7 U
  5. NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;" V4 {" \% Q4 ]* P& S
  6. NVIC_Init(&NVIC_InitStructure);3 S2 g% y- _4 r4 b2 ~7 A
  7. 9 ~7 J% e. Z6 K7 Y6 Y
  8. NVIC_InitStructure.NVIC_IRQChannel =TIM1_UP_TIM10_IRQn;
    - z7 N$ E6 v' }& F/ G4 @
  9. NVIC_InitStructure.NVIC_IRQChannelSubPriority= 2;
    2 U- I) Z# c6 P
  10. NVIC_Init(&NVIC_InitStructure);
    8 z& B7 L6 u! U5 K/ H4 W4 s
  11. 3 c6 b3 B6 L) b  F$ C
  12. /* Enablethe CC2 Interrupt Request */
    1 m0 P5 g7 T" T2 a$ n; p! I
  13. TIM_ITConfig(TIM1,TIM_IT_CC2|TIM_IT_Update, ENABLE);
复制代码

! _% l2 c. a& Q) }. k* H' f. H

& U; t7 \& i( F7 x; V
使能定时器1

# ]# i! t% p' f* P7 j, j, L
  1. ; N3 y$ ^5 J) R/ r* j/ f5 F
  2. /* TIM enable counter */
    ) Z6 ^: w( p+ p  p5 w2 d# a! p6 C
  3. TIM_Cmd(TIM1, ENABLE);
复制代码
8 w1 z# u( I7 C+ q; ?5 D
. w0 p/ K3 ^# g8 P4 C6 s
下载代码验证测试
; h, H3 E7 z$ z+ p- K+ z0 o% t
: h( z* n6 e6 m" [' B, L
6.gif

4 C9 l$ H6 N. q3 S; w" s5 j: A: }/ D1 b4 ]; W. T
& e- f& U3 T* ?( t, }/ T
, Z* U3 {& {9 I: K$ d) \4 H" g- I

2 J3 v8 `/ r2 k* q- Q, B4 M4 m2 t: E$ q" S
赞 收藏 1 评论0 发布时间:2020-9-10 12:27

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版