STM32F2定时器1通道1输入捕获& b/ [' X1 Y# K8 V3 b6 w8 e
一、中文手册上的配置步骤
+ O+ I* [# y/ `2 W+ H9 f- m6 e# P; u: @( z3 `& o1 ^1 i4 }
) [. g2 s: ^' I+ X
1.1初始化通道对应的IO口
. ` |' u& u1 g7 {GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//选择通道对应的IO口) r2 z% c6 F7 c. D1 j1 C
8 J7 t, M# G9 i s3 S9 _, x( n) b$ B$ T$ V1 {2 W$ g/ K
! R* \0 r2 i$ n% y1.2选择输入捕获的通道" @: D! [8 h2 i6 E
InitStructure.TIM_Channel = TIM_Channel_1;2 H. G" G& O& W! o7 o: r1 h
1.3选择有效输入端
9 n- S0 o8 O( L6 d% ]选择有效输入端:TIMx_CCR1必须连接到TI1输入,所以写入TIMx_CCR1寄存器中的, {9 w8 P# l+ _0 B
CC1S=01,只要CC1S不为’00’,通道被配置为输入,并且TIMx_CCR1寄存器变为只读
( k0 @1 S9 g5 y2 \+ Y! R注意 CC1S仅在通道关闭时(TIMx_CCER寄存器的CC1E=0)才是可写的,配置之前调用3 F% ]/ q% O3 T m5 \
void TIM_DeInit(TIM_TypeDef* TIMx)即可
! X! C3 K9 @! ~; g. t9 m) ] n4 T+ l% M' a5 F7 |0 m1 v
; F- M' _9 P# j8 o
! k# Q- d9 Q4 Z8 ]* ^* C1 V1.3配置滤波器为所需带宽–TIM_ICInitStructure.TIM_ICFilter = 0x00;
; @. Z% Y1 O' m5 s9 p根据输入信号的特点,配置输入滤波器为所需的带宽(即输入为TIx时,输入滤波器控制位是% o2 a# U5 U5 E8 z9 T7 @2 K
TIMx_CCMRx寄存器中的ICxF位)。假设输入信号在最多5个内部时钟周期的时间内抖动,
e' p' k! @) A* ^0 Q4 S- X7 B# Q我们须配置滤波器的带宽长于5个时钟周期;因此我们可以(以f DTS 频率)连续采样8次,以确
- Y ?. q: O, a: o6 }认在TI1上一次真实的边沿变换,即在TIMx_CCMR1寄存器中写入IC1F=0011。6 m: B7 k1 @' s1 q" s, T( L/ e
1.4选择有效转换边沿–TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
/ e% _8 p p# b9 n. o1 E/ a* s选择TI1通道的有效转换边沿,在TIMx_CCER寄存器中写入CC1P=0(上升沿)。; A. x4 D! b+ ?4 P K
, _: I8 c, q7 j7 T. ~1 Q( K
R" e3 }: }/ l
; f1 d* _! f B6 Y* P: d1.5配置输入预分频器–TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
8 q* D/ B5 D8 \. a" u在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预
( z; L& g. {' v! g4 L& [6 n分频器被禁止(写TIMx_CCMR1寄存器的IC1PS=00)。# m% m1 _6 r: Q& D% v) i" d
1.6 TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
8 j. Z# {6 G" v( l+ CTIM_ICSelection_DirectTI -->TI1,TI2,TI3,TI4 对应IC1,IC2,IC3,IC4;
. w9 V( i; J# X1 g" k7 j7 M. VTIM_ICSelection_IndirectTI–>TI1,TI2,TI3,TI4 对应IC2,IC1,IC4,IC3;
+ S6 _2 A7 d, r. g Q; u+ R8 I: {4 e& K1 U
e+ l) \6 u& K1 S1 H
e8 ^. ~" F0 ]
% l E+ e9 }9 p* K1 \5 ?2.1完整代码
2 ~2 ~0 p& N6 m1 [- RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
+ P s$ h8 ]0 w3 R% k - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); , y* s7 {0 L; z% S
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//根据通道所对应的IO口修改
& U0 g+ u4 M' U3 o; C8 P - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;; z) |7 B4 |6 F- a5 Z
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;6 r3 U5 n( r' p2 v( [
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;; A# g; |: E' w: {& O0 v! X) V
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;! w2 Q$ Y* }) Q0 F3 J1 n$ B: y
- GPIO_Init(GPIOA, &GPIO_InitStructure);
# ~& i8 ?1 ~9 H - GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_TIM1);2 T# H$ l+ V- @) E2 E: h5 c5 e
- E) _6 t6 }% B+ u% ?8 O8 B- TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
/ M( E. y; n# B0 u6 f+ ]' o - TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//TIM_Input_Capture_Polarity
+ V0 q" W! U! I0 Y; \% ? - TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//TIM_Input_Capture_Selection
3 y( R0 A& N* j! j/ y - TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;5 K1 \* j' Z5 f' f9 Y
- TIM_ICInitStructure.TIM_ICFilter = 0x00;
" D/ I4 Z8 k9 n( b; Y) c+ a - TIM_ICInit(TIM1, &TIM_ICInitStructure);
* v$ \. Z3 K6 z" t1 g' H0 y - ( L3 g+ K7 K: ]" ~$ o
- NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;& q& ]) m& S4 J9 p, C7 H! s
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;% g& [+ u" O/ S! m/ w+ C" c
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;3 k3 T9 M- x2 d) N' f& E6 H( @* Q
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;9 T) z6 \/ L: H- E$ s1 x
- NVIC_Init(&NVIC_InitStructure);
复制代码
3 A; P4 U: x& A' _ B. n' r$ E' w3.1输入捕获启动DMA传输配置- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 , ENABLE);: W( i+ R1 R4 w9 n U/ }( {2 A
- DMA_DeInit(DMA2_Stream6);
3 G5 E1 f- P* h7 Z# y - DMA_InitStructure.DMA_Channel = DMA_Channel_6; ) R, K8 K. W1 v) [3 o4 J/ ~. z
- DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t) GPIOD->IDR;
& v' L, |+ r2 ?; H4 @5 [' ~1 Q - DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)DEF_Buffer;
) w, i, D/ e7 m) t - DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
: k: S$ S2 F( j2 u" n - DMA_InitStructure.DMA_BufferSize = 40000;4 J# P! Q2 X( T
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
( W) L9 X: h0 H4 v5 ~$ F4 \ - DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;/ q) L J7 s, h1 v9 y
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
8 H' e! k' N w/ C: E0 o p - DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;3 o% ^* x) G% U& |1 Y
- DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;+ f+ s V* d7 Y3 I6 S
- DMA_InitStructure.DMA_Priority = DMA_Priority_High;) m% U2 }: e9 E3 K B4 n
- DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;* M9 g8 v9 }) L8 l1 B
- DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;1 y1 b3 W$ i. \( O- {& {) u
- DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;; [& M, I9 c6 S5 ~$ |
- DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;. m5 v# S: A7 c6 j& |( K; F6 k# V
- DMA_Init(DMA2_Stream6, &DMA_InitStructure);
复制代码 I+ ]8 Y* S$ |3 _
3.2启动传输
( c5 k3 l, F0 v9 Y; {7 U' z- TIM_DMAConfig(TIM1, TIM_DMABase_CCR1, TIM_DMABurstLength_1Transfer);
& Z4 T6 S" @0 ? - TIM_DMACmd(TIM1, TIM_DMA_CC1, ENABLE);2 G% f+ ?6 V' i8 y. @) A
-
" {0 K' Y0 Z7 W& k8 f/ \8 i - /* Enable the CC2 Interrupt Request */
8 I: ^: N# l1 l - TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);
: N3 W& L4 c' N; D5 L - /* TIM enable counter */, ^$ f. f& J4 k R+ x% d
- TIM_Cmd(TIM1, ENABLE);3 V/ f8 H9 Q+ m! O
- DMA_Cmd(DMA2_Stream6, ENABLE);
4 q: A& x! e4 G- R9 ^
复制代码 ) Q1 Q1 `$ N" j+ Q. i* {" J( x& l
: h. x2 ]4 b2 K) `5 F3 r
# S: F0 @$ Z* k+ j g- y |