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

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

[复制链接]
STMCU小助手 发布时间:2021-12-2 15:53
如题,送给自己做警醒。
, l4 f2 e8 u( @
. h5 h0 E; W% l# D( u* `2 N注意:
! l; Y+ @9 g6 L" _! Y5 w. j8 Q( e3 N, e" j- O" T" [
如果stm32f2xx系列上面的网址的代码要做适当修改。
" y2 e( v! v; `8 J: v  A以下说重点:stm32f2xx系列,在调试中对GPIO的初始化,切记选择GPIO_Mode_AF模式,即端口复用。3 @; F3 Q# ?1 A- i# i  \6 |1 O! ]0 q

' \7 k/ U' F. S' C: f- `4 p随后,要做端口映射处理,即调用:GPIO_PinAFConfig()函数。
' `1 q  B, B1 C4 N: ?, p' C( x, l这2个方式不选择,timer是不会有反应的
& _6 x  \0 h" Z! v8 ]' \6 y& S7 C
6 _+ o' ^  [7 q8 G3 ]/ U- q' w+ @本人是stm32f207,花了4天惨痛代价。
' o7 P0 I4 ?$ [0 B" K  V& p# T9 Z  n- ~7 z0 I% g( S
以下贴代码:
8 d2 n3 ?1 Y; H% [
  1. /* Private define ------------------------------------------------------------*/
    7 f% H+ q# W. A
  2. #define ENCODER_TIMER                TIM3  // Encoder unit connected to TIM3
    ' J) L4 L1 Q" G* P
  3. #define ENCODER_PPR           (u16)(1000)   // number of pulses per revolution9 x3 `7 g1 H- ^1 G
  4. #define SPEED_BUFFER_SIZE               8
    * S, d% k: d  K, Q0 v9 ]

  5. * }# _3 O5 A! H1 r
  6. #define COUNTER_RESET   (u16)102 q5 f/ b* A! ]% a
  7. #define ICx_FILTER      (u8) 6 // 6<-> 670nsec
    # _# E5 c0 }# X2 y& V

  8. . D+ @* i% q9 S! q
  9. #define TIMx_PRE_EMPTION_PRIORITY 0x0F3 F0 ^# y; F% B" m0 M' R
  10. #define TIMx_SUB_PRIORITY 0x0F  i0 i* s' J) h' j; P( @
  11. ; x" x) ~+ ^8 H1 q1 {, s  A& u, i

  12. # y5 P; ?& D& p, u, H

  13. . C; ]1 k5 @' `$ K% S" Y( D
  14. *******************************************************************************; E! d% ]: U0 m0 _+ k) K
  15. * Function Name  : ENC_Init, _2 \4 }+ p0 B( o' M+ h% z, J7 H
  16. * Description    : General Purpose Timer x set-up for encoder speed/position ( w6 J$ }- n. }
  17. *                  sensors& s( I* x" S: y( D
  18. * Input          : None
    2 _* M7 @; w/ f" {' a1 M5 w
  19. * Output         : None7 C2 \( C! ~" p5 R% F
  20. * Return         : None
    $ t8 X+ C: T$ O( M% Z  l4 L- l# n
  21. *******************************************************************************/
    / M1 k% i6 `! x1 _% Y
  22. void Encoder_Init(void)1 `9 A, W: p. N$ X/ a# j
  23. {, f. r/ b( t/ P5 }$ ?; X
  24.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    0 }2 c- B6 M9 T$ a
  25.   TIM_ICInitTypeDef TIM_ICInitStructure;# a5 ]1 G$ H6 K( y5 P8 C7 O6 b

  26. ' C8 n% U7 Z% B
  27. /* Encoder unit connected to TIM3, 4X mode */    4 n  Z9 U2 B5 u* ?, Q3 B( c. m( Y' \
  28.   GPIO_InitTypeDef GPIO_InitStructure;' `( H. h# n/ y* Y. u
  29.   NVIC_InitTypeDef NVIC_InitStructure;
      M. @+ Y+ r& B+ e/ d3 ~

  30. . \- c; O& e- h3 Y# t
  31.   /* TIM3 clock source enable */
    / x, T3 r7 C0 k! {1 n0 n
  32.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    5 A1 O4 Q& @! C* f
  33.   /* Enable GPIOC, clock */
    9 o0 S/ K; o/ n2 O' W* P
  34.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);7 ?, c" O  j$ @: x. g, q
  35.   //GPIO_Init, F. i$ H7 y% B! t, p% p
  36.   GPIO_StructInit(&GPIO_InitStructure);. n  }6 ^& [6 X- o. F
  37.   /* Configure PC.06,07 as encoder input */
    , t8 z8 I/ [, T0 c! j
  38.   GPIO_InitStructure.GPIO_Pin = INTA_PIN | INTB_PIN;( k# j' a8 J4 K- ^# S; x) W7 y
  39.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;              //这个地方注意
    - j+ _% q0 _! n- O
  40.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ) W2 k3 c( V4 Q
  41.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;$ S0 L2 O1 `  h7 J+ v! Q
  42.   GPIO_Init(GPIOC, &GPIO_InitStructure);9 Q0 Z" R+ I  m

  43. 9 T% ~7 B+ M  z8 Y% x
  44.    /* Connect TIM3 pins to AF2 */  
    ; v9 z5 O( ^9 d) d- I3 ]/ n
  45.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);   //这个地方注意
    # f0 ~* p' b3 N& {: O/ p' a
  46.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);   //这个地方注意" m" c0 `7 k$ `2 r# [9 K
  47. ' n  e( T2 M5 [# A* T- S& e

  48. " Q+ C/ z" s& I. W- z! q
  49.   /* Enable the TIM3 Update Interrupt */
    7 I) P7 t& G0 v" b- k6 u" C* q
  50.   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    ( C; A8 c* ]4 m: X8 M
  51.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY;
      m- H# e$ M( o
  52.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;6 @% \0 S4 b# N! l/ }+ ?% \. u
  53.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;" S6 y9 q4 V0 A
  54.   NVIC_Init(&NVIC_InitStructure);
    4 ]+ o8 u! |& H4 N; E
  55. # k  ]) T1 i) A) T( B7 a
  56.   /* Timer configuration in Encoder mode */& ]$ @6 e' Z5 ]9 s+ j  l7 l
  57.   TIM_DeInit(ENCODER_TIMER);. X5 p. ?; A6 s
  58.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    ' i" D& y, s2 j+ i8 i0 g

  59. " Y7 h0 Y# S& I& P3 K# K
  60.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling ; U! m8 h& W. Q* C  i& G! }
  61.   TIM_TimeBaseStructure.TIM_Period = 0x0F;//(4*ENCODER_PPR)-1;  : @! I* x+ [$ f, z
  62.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    0 f' m3 f5 v5 R' A4 b. V
  63.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
    6 C9 [. W( U5 s5 Y- t+ @1 o
  64.   TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);8 U/ f! T& p" P2 Q6 q

  65. 1 f0 Y" y* y! o2 D
  66.   TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI1, / x# R5 e$ O; G. d8 {+ T, C- D! N
  67.                              TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);9 |/ n( g* x5 a/ M
  68.   TIM_ICStructInit(&TIM_ICInitStructure);
    ; ?- {/ W7 A& u+ v* C% F" l
  69.   TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;                //--?--
    3 e; [6 T" i# ^
  70.   TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);
    3 L# u1 Y- A& P5 z# h6 A1 Z

  71. ' ?: n7 K+ U8 o6 R; T
  72. // Clear all pending interrupts0 L9 S. G# \7 a" {% h
  73.   TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
    ( b: |' r$ e! F* t
  74.   TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);4 U  Y  u0 I( K- f4 ^
  75.   //Reset counter
    , ~- v% k# a8 Y& w+ _1 T, q
  76.   //ENCODER_TIMER->CNT = COUNTER_RESET;
    $ U; w2 a) ], N' B' |1 f4 k# E
  77. 8 D$ [5 ^) W3 y. Z, H" p
  78.   ENC_Clear_Speed_Buffer();/ P+ d8 L% p$ K( D+ V: O; l

  79. : i/ k2 a( F6 ?9 f" N7 A1 q" g& z2 s. h
  80.   TIM_Cmd(ENCODER_TIMER, ENABLE);  $ s" ]2 ~2 ?; ^% _9 V( D- O  Y
  81. }$ L6 v- Y  S  |
  82. 6 f+ M/ X6 @5 u0 {* g, x
  83. /*******************************************************************************
    - k. _6 y  W; [* w+ P
  84. * Function Name  : TIM3_IRQHandler/ `. \/ Z. R* a
  85. * Description    : This function handles TIMx Update interrupt request.
    " t; @! ]4 k& ?  Y
  86.                    Encoder unit connected to TIM3
    1 @' h$ E! x; K5 {' J8 q
  87. * Input          : None
    - F9 b" a' U( ^* P, Y
  88. * Output         : None
    / E+ b& P4 a. w5 H" C
  89. * Return         : None
    ; b* U  `$ [. a% y
  90. *******************************************************************************/* p% g1 Q$ B' m& ~' A+ ^* W/ P
  91. void TIM3_IRQHandler(void)
    % ~8 O( I' }# r/ h0 A
  92. {  ) B4 U+ R. `" p2 t6 _% j. R9 ^
  93.     /* Clear the interrupt pending flag */
    " _9 k( t- T  p* a2 a; j
  94.     TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);3 }) Z" B. m# I5 w, E6 e$ E

  95.   [+ l4 R, E& [. E+ [5 C* Q
  96. }
    * G" J. g! J4 N6 Q9 t- R
  97. 0 c5 ~7 u6 B# ^/ H
复制代码

/ @3 o+ f/ j' j4 W0 U  H( x
收藏 评论0 发布时间:2021-12-2 15:53

举报

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