|
01 STM32捕获功能 从STM32的定时器框图中看 & 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
02 输入捕获过程 " ?& r p, a4 I1 ^- w( V' t
输入阶段采样对应的对输入TIx,去产生滤波后的信号TIxF。然后极性选择边沿检测器产生一个信号(TIxFPx),这个信号可以被用于服务模式控制器的触发输入或在作为捕获命令。在捕获寄存器前被预分频。
5 Y* ]4 X. _, k& h7 A+ R t
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
% z) i) h$ @& v3 {+ k$ j
使能允许更新中断和通道2中断 ( C1 K$ H( j+ B+ S' g4 @
03 代码配置设置GPIO复用 . a9 [1 ?8 [6 @; X
- : G: s5 [# a. |" x2 J, W5 m
- /* TIM1 channel 2 pin (PE.11) configuration*// ^. y0 C4 _: O' q, M5 b
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;3 u1 I' _! G ]+ u
- GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF;
( L3 e" k/ i- @2 w - GPIO_InitStructure.GPIO_Speed =GPIO_Speed_100MHz;7 F! ^ A& |2 F5 O
- GPIO_InitStructure.GPIO_OType =GPIO_OType_PP;6 o- S" |! ^0 G. p+ j
- GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_NOPULL;6 P: J# p. R1 F0 J0 r8 T/ a
- GPIO_Init(GPIOE, &GPIO_InitStructure);& V* M. n1 s! B' E0 x; S7 |
1 N7 r) ~- R9 K& M0 O- /*Connect TIM pins to AF2 */
5 |- n8 L* O$ B# T - 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
- /* Time base configuration */
* i% [+ S P% B1 o+ h" n: O* f% I - TIM_TimeBaseStructure.TIM_Period =0XFFFF;; V j+ r9 W" U, d; P. b
- TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t)((SystemCoreClock) / 1000000) -1;
8 \' `2 w2 ^5 F5 R* Y5 J - TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1;: f- }' w% M% l9 M; b
- TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;
; a4 ~7 v9 \3 M4 @ W - ; Y0 ^5 u( O- z3 Y0 [ Y0 J( U
- 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 @
- ; M5 j% A- Y! o; Q8 F% ]
- TIM_ICInitStructure.TIM_Channel =TIM_Channel_2;# [8 [$ R3 d$ c0 }) R' ?7 P; f/ `
- TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Falling;
7 P9 o' y5 f/ _! Y: ? - TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI;
# R ?: ?# s% ^. ~: b4 b6 u6 U - TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1;: H2 a4 y9 B9 K* k% ?
- TIM_ICInitStructure.TIM_ICFilter =0x0;
7 i0 M3 C8 P; G9 Z8 Z, N - & P! ?. N' S! s; m9 h
- 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
- /* Enable the TIM1 global Interrupt*/
0 |5 C. c; [ B - NVIC_InitStructure.NVIC_IRQChannel =TIM1_CC_IRQn;
& F. d/ ~2 o3 ^5 D - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;
4 t3 U; U5 M! g- @( U - NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;3 _. i" _' D) _( @0 O8 q7 U
- NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;" V4 {" \% Q4 ]* P& S
- NVIC_Init(&NVIC_InitStructure);3 S2 g% y- _4 r4 b2 ~7 A
- 9 ~7 J% e. Z6 K7 Y6 Y
- NVIC_InitStructure.NVIC_IRQChannel =TIM1_UP_TIM10_IRQn;
- z7 N$ E6 v' }& F/ G4 @ - NVIC_InitStructure.NVIC_IRQChannelSubPriority= 2;
2 U- I) Z# c6 P - NVIC_Init(&NVIC_InitStructure);
8 z& B7 L6 u! U5 K/ H4 W4 s - 3 c6 b3 B6 L) b F$ C
- /* Enablethe CC2 Interrupt Request */
1 m0 P5 g7 T" T2 a$ n; p! I - 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
- ; N3 y$ ^5 J) R/ r* j/ f5 F
- /* TIM enable counter */
) Z6 ^: w( p+ p p5 w2 d# a! p6 C - 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
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
|