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

【经验分享】stm32f2xx与stm32f10x 在正交编码器应用关于定时器初始化中的区别

[复制链接]
STMCU小助手 发布时间:2021-12-2 15:53
如题,送给自己做警醒。
% k/ c1 Q) h" q, J! [6 K8 G! D
" }; Y! `9 K0 x- w( L注意:
! r3 O+ {( o/ Z- U" k/ F% w7 D* v9 {6 D! a& E9 a. ^# W- y
如果stm32f2xx系列上面的网址的代码要做适当修改。" D' C, s3 p/ E
以下说重点:stm32f2xx系列,在调试中对GPIO的初始化,切记选择GPIO_Mode_AF模式,即端口复用。
, Z3 X- c8 [, k5 c- p5 C
8 v' v- s- ~/ U$ t" E& {, r随后,要做端口映射处理,即调用:GPIO_PinAFConfig()函数。
# w: M/ u2 i/ b) ~这2个方式不选择,timer是不会有反应的' C. w, t5 M- Q( |2 \0 @
2 V* B9 k& H. _8 c; g0 b2 g  L: m0 y
本人是stm32f207,花了4天惨痛代价。1 r# L: X/ K8 @8 K8 Q1 v
" I6 q! J, L4 z/ @# T5 w
以下贴代码:
3 V: x( @6 `- A8 Y
  1. /* Private define ------------------------------------------------------------*// o% [9 j: p8 ~% b# x
  2. #define ENCODER_TIMER                TIM3  // Encoder unit connected to TIM3& L' A4 D: O8 o* i3 r  ]( I
  3. #define ENCODER_PPR           (u16)(1000)   // number of pulses per revolution
    " _! w7 L- K0 z: _
  4. #define SPEED_BUFFER_SIZE               8
    0 g1 f8 z0 ~( E0 _2 e+ w1 n  `$ J

  5. : L5 c2 I7 a8 X2 F3 R9 I6 L
  6. #define COUNTER_RESET   (u16)107 ~5 m5 u8 _1 S* d: s! I
  7. #define ICx_FILTER      (u8) 6 // 6<-> 670nsec
    - A1 U! f7 J3 R2 v2 M* K8 @

  8. / j  ?7 H" A% b- }7 J
  9. #define TIMx_PRE_EMPTION_PRIORITY 0x0F- `# y3 x. D9 v
  10. #define TIMx_SUB_PRIORITY 0x0F
    5 S& `7 G( n! C4 q* C5 H

  11. . G8 U; d* q' _+ h' W
  12. 3 {1 O7 A+ i9 S* {1 J, j
  13. " }- B% d; J7 O4 Z6 ]* I
  14. *******************************************************************************; ]; ^8 q0 |& e
  15. * Function Name  : ENC_Init
    , K: `& S' N! J* Y3 C/ Q
  16. * Description    : General Purpose Timer x set-up for encoder speed/position 6 f7 v, C9 h+ f
  17. *                  sensors
    & \4 F* i' n6 D0 m; p% V! a6 M0 [5 k
  18. * Input          : None1 I0 X3 V5 Q# l; `. c8 }
  19. * Output         : None: P+ r. D' f! i6 P- n# a, N
  20. * Return         : None
      _" g9 d7 S% D/ E& v4 H8 v2 H
  21. *******************************************************************************/
      l5 S9 P, X! |+ O' O9 S+ ^
  22. void Encoder_Init(void)% d, O2 L8 d4 Y2 K, z
  23. {
    % x& \$ z6 Q2 ?# b
  24.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    % @! l  w0 g& ^/ E( n! O
  25.   TIM_ICInitTypeDef TIM_ICInitStructure;2 D6 e8 g% i1 e6 c  D
  26. # o( n* N) @  e* Q0 p
  27. /* Encoder unit connected to TIM3, 4X mode */    . J  \/ x8 l, W
  28.   GPIO_InitTypeDef GPIO_InitStructure;
    & m8 }8 ?8 A  i) w
  29.   NVIC_InitTypeDef NVIC_InitStructure;3 K  a3 _8 c3 K8 i

  30. 8 v7 \/ h+ [1 L$ m" k- F# z: e* S
  31.   /* TIM3 clock source enable */
    ) a5 q7 p- b2 I0 _7 u; v4 z' c5 y
  32.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);0 p4 l/ v) V0 E( j+ d1 J  o
  33.   /* Enable GPIOC, clock */
    4 b7 m4 x* y, A% S
  34.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);( k& g' p7 t: I# c- x
  35.   //GPIO_Init
    1 I9 E4 N. Q9 C! w8 B9 ?8 I
  36.   GPIO_StructInit(&GPIO_InitStructure);
    * A1 K. S; `& t4 I
  37.   /* Configure PC.06,07 as encoder input */. V+ ]: m9 b" Y* E: d( S& W( w: ~- l
  38.   GPIO_InitStructure.GPIO_Pin = INTA_PIN | INTB_PIN;
    , v9 r) u6 Z& n: P: v7 ~6 L
  39.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;              //这个地方注意# B6 d8 E, O  [* {- n$ O6 K
  40.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;+ ~+ V* E, J; L
  41.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    ) {9 t! A' Y1 G8 x
  42.   GPIO_Init(GPIOC, &GPIO_InitStructure);  B; r* s8 J. C
  43. * B) t2 o5 ]( g' |
  44.    /* Connect TIM3 pins to AF2 */  " _, b- \  E0 {* b
  45.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);   //这个地方注意! U8 V' |# `% {. g9 Q" c; A
  46.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);   //这个地方注意
    ( T" W% R. X& g8 E- b

  47. / i$ Q: S9 e+ X2 f; A$ E$ F
  48. 7 [* C" V0 r/ A, N7 T$ d+ T" v
  49.   /* Enable the TIM3 Update Interrupt */
    8 z4 O, H( L8 D4 _, e# Z3 k6 X$ Q
  50.   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;- A9 y: h! l( D4 B5 P7 k- G
  51.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY;
    8 x# }( ?  z0 y" p& N
  52.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;
    $ o# @8 i7 o& ^9 {
  53.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;, ?1 o! J9 u5 i$ S% `, y9 a
  54.   NVIC_Init(&NVIC_InitStructure);5 Q" A3 P7 p$ Y% B2 h3 o5 `
  55. - d' X7 [, i5 S' m
  56.   /* Timer configuration in Encoder mode */
    6 \" L! G& V7 ?% Q
  57.   TIM_DeInit(ENCODER_TIMER);
    ! p2 i) O* }- \2 x4 j1 Y5 _
  58.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    1 Z' k5 b- g+ W# q) M6 `

  59. 8 a( V; `' V7 Y5 P5 |( @5 I
  60.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling 1 w/ |) I. _$ u! F4 x2 J& g: V4 y
  61.   TIM_TimeBaseStructure.TIM_Period = 0x0F;//(4*ENCODER_PPR)-1;  - A* `/ r# Q1 b
  62.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;. L9 A- D; X# i0 _" [! w
  63.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   - v0 E& C) l  {! S+ w* [
  64.   TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);
    & z7 V5 }3 I) {5 `0 g: l

  65. $ s' F) N$ T: o2 S+ D2 a
  66.   TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI1, 1 A0 A4 k& \+ \( g/ n3 R: z% i, G
  67.                              TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);& E9 s4 s- C2 p
  68.   TIM_ICStructInit(&TIM_ICInitStructure);
    + ^* M: X" h/ y) {! Q
  69.   TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;                //--?--2 K4 R. ^0 j* q, @& M, h7 \( ?- `
  70.   TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);
    1 [: g5 W# L8 H# @

  71. 9 o* `4 p% @: U9 t+ V6 J6 S. S
  72. // Clear all pending interrupts5 U1 N0 W, S  X6 F- r5 s6 E
  73.   TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);1 e6 a' G" N- R/ Y* J$ q+ }, Z; o
  74.   TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);
      f% F/ S0 N$ E: A$ \2 O2 y
  75.   //Reset counter% \+ h+ P  L3 e' V1 E+ B
  76.   //ENCODER_TIMER->CNT = COUNTER_RESET;1 o% U3 l( }0 o1 Y1 w
  77.   ]) ~- K- k5 t' T3 ^8 N
  78.   ENC_Clear_Speed_Buffer();* c' v* G) H6 Q& P3 B' R

  79. ) m: `- g5 u" H2 ?# I$ h
  80.   TIM_Cmd(ENCODER_TIMER, ENABLE);  
    % Y$ p# l  b' W' h& u
  81. }
    + I9 ~/ d$ k; Y% x6 W$ ?
  82. 1 e# o# F/ }. Y) G+ \$ Y" ?2 U4 `* R
  83. /*******************************************************************************
    . S; j! o, Y! K0 R) G
  84. * Function Name  : TIM3_IRQHandler2 q7 c' X) Q* O  G: n* h+ ]7 ?
  85. * Description    : This function handles TIMx Update interrupt request.' T, L# D7 H$ ?8 N$ n5 g- Q
  86.                    Encoder unit connected to TIM3; }5 |2 Z2 J4 L0 N: F% z0 W4 g
  87. * Input          : None2 _8 M5 q! y* A- k9 o
  88. * Output         : None2 `; ^7 c$ o# m, f
  89. * Return         : None/ L: `& v5 n- B% N  @+ q6 ~& b
  90. *******************************************************************************/' Z1 k! p" V! ]  K' f) U
  91. void TIM3_IRQHandler(void)4 U+ l/ ~  {1 q# S% @. ^
  92. {  
    9 O- x0 {, P, w0 M, u
  93.     /* Clear the interrupt pending flag */% G% _  ^, x& Z8 X  f- _8 z1 ]& ]+ q1 r
  94.     TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
    0 L$ M" i, w4 K# S
  95. 3 B, d0 r) H! Z% }. t) h5 d
  96. } $ H$ b/ r5 F6 e# Z7 ^* B
  97. 1 S8 }2 E! F6 o: P  h+ |# {9 ]8 l
复制代码

; k( P$ B, Y2 k: q2 q5 _7 U" c
收藏 评论0 发布时间:2021-12-2 15:53

举报

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