STM32F2定时器1通道1输入捕获! J/ P" F6 j# b
一、中文手册上的配置步骤
7 S% Y' o1 `3 N6 I& @8 y+ k2 a/ q! Y$ ^; |% E) E
; {, A0 k, E0 v. x) A
1.1初始化通道对应的IO口
& ]$ E) M8 w, I# N: N, B' y# CGPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//选择通道对应的IO口
0 b! {( ~. u5 K6 H. {5 I' e9 ~; R) d; d
]. |' Z* P# q; J p3 h
, { c: d7 K$ X: ~( V' P1.2选择输入捕获的通道; b$ z8 |1 Z; Q# ^3 @
InitStructure.TIM_Channel = TIM_Channel_1;" ]- u i6 g2 O3 t, B
1.3选择有效输入端
' [& Y4 E5 R2 e( i) Q) Y选择有效输入端:TIMx_CCR1必须连接到TI1输入,所以写入TIMx_CCR1寄存器中的4 }) E, O$ e- m @: T# s
CC1S=01,只要CC1S不为’00’,通道被配置为输入,并且TIMx_CCR1寄存器变为只读7 v' N& a) m2 G' N+ {( \, k; w
注意 CC1S仅在通道关闭时(TIMx_CCER寄存器的CC1E=0)才是可写的,配置之前调用
: \7 V- n5 }, \+ E T r$ nvoid TIM_DeInit(TIM_TypeDef* TIMx)即可' S5 C2 Y6 B& a; g3 [. t; V
/ ?1 J6 O, [$ s7 p; S
2 w- X( _2 G1 T/ R) j, r: o5 F. E' S! y
1.3配置滤波器为所需带宽–TIM_ICInitStructure.TIM_ICFilter = 0x00;
# d ?' ]4 D* k' m9 y0 B根据输入信号的特点,配置输入滤波器为所需的带宽(即输入为TIx时,输入滤波器控制位是4 I. {+ u( p; _+ c G$ v0 P2 t
TIMx_CCMRx寄存器中的ICxF位)。假设输入信号在最多5个内部时钟周期的时间内抖动,
5 c4 y' M4 x# B1 c4 h% u我们须配置滤波器的带宽长于5个时钟周期;因此我们可以(以f DTS 频率)连续采样8次,以确
: T, b# s* W6 j' B+ G认在TI1上一次真实的边沿变换,即在TIMx_CCMR1寄存器中写入IC1F=0011。& V. v& F! {# i: H$ W7 P
1.4选择有效转换边沿–TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;. `5 L* p& I7 D* C$ C
选择TI1通道的有效转换边沿,在TIMx_CCER寄存器中写入CC1P=0(上升沿)。
& @& ?! l+ E ^* k9 q/ j1 k% G4 N" f9 [0 A5 i1 ^) r
# ], o$ z- M! v' h3 Z. t5 w p5 P
; {" } d0 N- C8 L, g
1.5配置输入预分频器–TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;& X0 h/ U/ Q* y' r; i+ p9 x
在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预# U3 V) A- `% P- x4 H: L
分频器被禁止(写TIMx_CCMR1寄存器的IC1PS=00)。 e0 b/ I5 c8 w. v0 G, f
1.6 TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;2 W& @, _" X2 j. S6 K
TIM_ICSelection_DirectTI -->TI1,TI2,TI3,TI4 对应IC1,IC2,IC3,IC4;) S6 S1 I# M0 L$ ^4 A
TIM_ICSelection_IndirectTI–>TI1,TI2,TI3,TI4 对应IC2,IC1,IC4,IC3;& m& B1 D5 |5 J% T) t. K2 l' X
: n5 @( z E# o" y
! f! F1 L% E. p7 K6 }) p8 h' H% {" ]. H" k2 S3 k/ d2 v
# t9 W) S3 @; B$ p5 i! v4 n
2.1完整代码( d( W6 ^5 O9 T; c; |0 a2 O; R
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);( D3 X( I* s( I' E, _1 q8 Z
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 5 M$ `+ K1 ?7 g& S! u) E% K
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//根据通道所对应的IO口修改' {% x, e. t! V: i. g8 O5 [, O
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
! ~/ o% w, O6 I7 R) `1 M - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- n# w( N) C9 Z - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;0 B) I+ W* X3 k* B% B1 k/ p1 i% |$ c# y
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;9 L* U$ w+ [! C2 @* a) v! q1 C
- GPIO_Init(GPIOA, &GPIO_InitStructure);
! e/ P# P: p/ A0 a3 H. m5 ]! O- \, ~ - GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_TIM1);( z6 \5 _: H7 \$ A
- 3 h! ?8 }& s/ @
- TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;3 B8 J3 U3 n, L9 {( f
- TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//TIM_Input_Capture_Polarity
: T* f) Z- Q% ]1 r. _- W0 o - TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//TIM_Input_Capture_Selection
( `2 ?1 j" Z# j; C2 j1 F- t8 _( \ - TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
+ K* z, S7 t2 Y+ n - TIM_ICInitStructure.TIM_ICFilter = 0x00;
' d3 @( B' O: c' w+ g" B - TIM_ICInit(TIM1, &TIM_ICInitStructure);
/ } Z& M" ^0 n1 Q3 W1 q9 s; z
4 d+ W4 k2 y9 E0 N9 O- NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
6 i% u( _/ y) k4 y - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;; u4 V7 U! g" @. T/ r# v0 @
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
7 Q0 s% I$ Y/ i2 d - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;( }! W& c0 g5 t4 N/ R4 L d0 \
- NVIC_Init(&NVIC_InitStructure);
复制代码 # {" U! D6 [( c& d$ h5 i5 g
3.1输入捕获启动DMA传输配置- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 , ENABLE);, R, L" V2 f( n2 ~' x7 G. t
- DMA_DeInit(DMA2_Stream6);
* D0 [4 v9 u1 \0 d, Q' S& D - DMA_InitStructure.DMA_Channel = DMA_Channel_6; % q) S% Z9 [$ N3 l" D( J
- DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t) GPIOD->IDR;
" E. I- m% M2 [) k7 P - DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)DEF_Buffer;* J* p' k& W4 f: z! d! C8 r) y
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;0 Q+ x: J4 L6 v5 G' Y+ m+ w
- DMA_InitStructure.DMA_BufferSize = 40000;
0 k P c( O4 o' L, p0 v9 F' u! t& G+ J - DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;2 e' L9 t$ X. g- M! l9 @* E
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;% X1 D/ A+ W! c7 a3 {" H
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
: ?0 O! U1 C# _ f8 n1 n - DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;: D2 I2 Y! F6 C6 T
- DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
, Q" {8 f# M; @ - DMA_InitStructure.DMA_Priority = DMA_Priority_High;
# L ]% f6 p& r9 V& w# j7 o - DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;$ b2 l, b/ O2 q6 T9 E* z. m
- DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
" [6 e0 L5 w3 J D# p+ H: e& R - DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
# V) b/ Y+ \; v' y - DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;. u7 i- C7 J# F2 H* v% y( I
- DMA_Init(DMA2_Stream6, &DMA_InitStructure);
复制代码
* _, `, ^( ^; |4 @' `6 A6 a3.2启动传输
7 E1 f; K0 x8 h8 y) w- TIM_DMAConfig(TIM1, TIM_DMABase_CCR1, TIM_DMABurstLength_1Transfer);/ g$ |8 J8 z. ]5 i2 y' S ]
- TIM_DMACmd(TIM1, TIM_DMA_CC1, ENABLE);* |$ _. j/ w c) c6 B8 ~
-
; ^4 L5 W+ K. \: U3 n q - /* Enable the CC2 Interrupt Request */
4 M% j$ d/ E9 @2 u - TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);
9 V! T% {3 o( \ - /* TIM enable counter */- F3 w7 R3 I! i. Z
- TIM_Cmd(TIM1, ENABLE);- h- Z/ m9 c3 a6 a; d" ?
- DMA_Cmd(DMA2_Stream6, ENABLE);
( k$ S1 Q( M8 \) Y, x2 Y
复制代码
5 C3 h& F1 n# Z p; T, W s1 |( s& b! w1 J
: O6 C, |) b# Y5 r. R8 S
|