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

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

[复制链接]
STMCU小助手 发布时间:2021-12-2 15:53
如题,送给自己做警醒。0 o% ~( T- ^/ N* D7 d
5 \/ t) p9 X0 J8 I( L6 r
注意:
- }8 M! U" o" W9 q! n% o5 h& o6 ?' }4 X4 ~) I% O8 B! Y) N
如果stm32f2xx系列上面的网址的代码要做适当修改。7 S' _5 ~4 X" n- x9 ~% P  R! ~
以下说重点:stm32f2xx系列,在调试中对GPIO的初始化,切记选择GPIO_Mode_AF模式,即端口复用。) U8 c5 M3 `, p8 ?, D8 ~4 y1 U
# v( r5 N# Q# ?1 `( H. ]5 b9 C
随后,要做端口映射处理,即调用:GPIO_PinAFConfig()函数。
  r- E' @' ~5 t' f( K: m7 g, a3 u, v; u这2个方式不选择,timer是不会有反应的
) Z  ]$ `/ \! B3 m6 ^" ]
4 N1 K0 G; v+ t9 x本人是stm32f207,花了4天惨痛代价。1 E5 [( t/ y/ G4 |( {

. [8 L8 M4 R* N5 D以下贴代码:
" ^( d8 e, u% e, [. Z
  1. /* Private define ------------------------------------------------------------*/
    # z- {6 t( D2 B! i2 f
  2. #define ENCODER_TIMER                TIM3  // Encoder unit connected to TIM3& @3 L) v  _. n  A( Y  K
  3. #define ENCODER_PPR           (u16)(1000)   // number of pulses per revolution% _( z7 R4 z5 h$ h3 R
  4. #define SPEED_BUFFER_SIZE               8
    # ^0 t/ J7 `# C4 v2 ^" W
  5. 6 H' L1 u  ]" W, C
  6. #define COUNTER_RESET   (u16)10# q2 h+ r( G" R+ r. j- P7 a! B
  7. #define ICx_FILTER      (u8) 6 // 6<-> 670nsec8 v: z, Q* P# h" e6 T. L
  8. ! [& y0 n4 G# ^% t7 M& U, D
  9. #define TIMx_PRE_EMPTION_PRIORITY 0x0F
    9 P  w' T8 J' s
  10. #define TIMx_SUB_PRIORITY 0x0F
    5 o9 Q- S8 f" a7 v( B/ h0 B

  11. 7 l' q& O) W. i  P: ~

  12. . H  A; Q- P4 c4 D5 i

  13. + s" J' i6 r! Q
  14. *******************************************************************************
    ) O. p6 P9 I9 m0 s2 t( S0 Z! Z# ?! C
  15. * Function Name  : ENC_Init
      c( s) z: b& b; h# g
  16. * Description    : General Purpose Timer x set-up for encoder speed/position
    8 x" h# _$ o! R! G+ s( s: p
  17. *                  sensors
    4 }7 x+ [0 O* Y4 h7 ^
  18. * Input          : None0 g8 }4 m* \  `7 ?! `2 y. {; ?1 l8 W
  19. * Output         : None
    ( ?) ]) p% }0 m& i
  20. * Return         : None  D2 d* T2 A( C- {0 E" f/ @: E
  21. *******************************************************************************/$ Y; C% u6 ?0 b& p, V
  22. void Encoder_Init(void)& z0 t& U! L' o* V  P7 U; _, J
  23. {, r& f- R, ~* K: o' J$ R$ J! v' p
  24.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    " Z. t. F  Q$ U' x
  25.   TIM_ICInitTypeDef TIM_ICInitStructure;
    ! X# k$ H9 r  Z$ H# q
  26. ! k( c% c5 K& C7 V# w
  27. /* Encoder unit connected to TIM3, 4X mode */   
    ( v. }3 n% @4 c" s* p  y1 ~; z% ~
  28.   GPIO_InitTypeDef GPIO_InitStructure;" x" R5 e7 [5 K- {% D- Q, o
  29.   NVIC_InitTypeDef NVIC_InitStructure;+ w% |4 g4 h1 F& u. a
  30. , T7 b# ^  ]. \7 N0 ~* [
  31.   /* TIM3 clock source enable */
    2 Z5 J$ V& t9 k; w3 b! D5 e( z
  32.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);& Z, l# |. @# K
  33.   /* Enable GPIOC, clock */$ }. O! a+ f) y9 C2 K/ Y
  34.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
      N; i0 M4 b$ p* {
  35.   //GPIO_Init
    8 f& [* u1 a1 l& S# S
  36.   GPIO_StructInit(&GPIO_InitStructure);+ f7 _" T/ m3 |0 R4 G
  37.   /* Configure PC.06,07 as encoder input */4 n/ x9 @( k/ v) x7 l/ y) v
  38.   GPIO_InitStructure.GPIO_Pin = INTA_PIN | INTB_PIN;( d7 [' T% G/ g7 Q
  39.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;              //这个地方注意
    ' A# a2 n/ S; j! ?" E7 A( B
  40.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;' ]: N* X( s  i, @9 Z$ _1 Q0 {
  41.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;1 T5 A/ S3 v& z
  42.   GPIO_Init(GPIOC, &GPIO_InitStructure);
    5 j  ^  c4 Y8 M3 a: v

  43. . t' T9 i1 t' D$ B
  44.    /* Connect TIM3 pins to AF2 */  & \) |4 S1 l* c- r4 t3 @
  45.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);   //这个地方注意
    9 i" H+ m+ b0 b) i
  46.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);   //这个地方注意
    * D' e/ O0 J: v
  47. - e: H5 @) P) [7 n% N
  48. ; E7 V9 n% ]! D: x
  49.   /* Enable the TIM3 Update Interrupt */: h* V7 E, y* k1 i& j; `, {( o
  50.   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;( h' X: D: C) H2 Q+ _: l- d
  51.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY;
    ' f; f7 Q2 k  I$ U1 O6 ~" E
  52.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;8 j- O# E  K6 ~0 F! i. D
  53.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;% b3 m) x( N' l% c1 q
  54.   NVIC_Init(&NVIC_InitStructure);
    4 R+ l  V8 U+ m7 Z% u

  55. # e& o, U; h* Y, x
  56.   /* Timer configuration in Encoder mode */
    + H8 o6 z5 X8 k+ U
  57.   TIM_DeInit(ENCODER_TIMER);2 U' _7 M: {1 K4 m
  58.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);; @* K( t1 R2 y- @% M- t% u/ N

  59. 5 E7 p# [7 u) q5 r0 h
  60.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling & T4 W# F7 j' t! V6 i
  61.   TIM_TimeBaseStructure.TIM_Period = 0x0F;//(4*ENCODER_PPR)-1;  
    9 b$ B1 M* |+ L( o
  62.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;" C9 M9 I$ N' x  r7 g
  63.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   % ^: t  U9 [2 s
  64.   TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);( B' Y; N/ [. @: i; E, Q

  65. : p+ E1 T2 c: G' c' m# ^8 O0 Q% K
  66.   TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI1,
    5 n# e9 D3 R% p, M3 k
  67.                              TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);$ k2 V2 K) k$ n; G! ~+ w2 K% G
  68.   TIM_ICStructInit(&TIM_ICInitStructure);* X' Z4 i# b, f! o3 i) `, Z
  69.   TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;                //--?--
    5 X; l0 G& M1 y- O/ j
  70.   TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);# I* S! x# t' V; e+ p, F9 s

  71. - z$ O  J. e' ]/ t1 X% s
  72. // Clear all pending interrupts
    * P3 Q8 u* H6 b* [/ @% o. `# T
  73.   TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);! B5 p. I( V- B) z& V+ S, a
  74.   TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);
    8 w. e* f' G$ x; u
  75.   //Reset counter( D4 P$ e) C$ u4 o6 }
  76.   //ENCODER_TIMER->CNT = COUNTER_RESET;
    . \  D0 ~& H5 s3 l% X1 G: E4 P# R

  77. ( M  K0 v7 O. u+ t: E' v9 g6 k) x
  78.   ENC_Clear_Speed_Buffer();& g$ E$ J, N9 d6 P4 s

  79. 0 o7 Q+ f8 l' |& ]$ R/ L% M& g
  80.   TIM_Cmd(ENCODER_TIMER, ENABLE);  7 b$ q3 d) Y2 x7 J7 ?) ~
  81. }
    ) o: ]$ Y8 t8 m1 |# X* @
  82. - [6 p1 D1 O% O/ w: d6 M( q9 q0 D
  83. /*******************************************************************************
    3 {* a( l0 V3 V+ A1 h
  84. * Function Name  : TIM3_IRQHandler; c, B0 Y: w' }, E6 j8 F7 e* u
  85. * Description    : This function handles TIMx Update interrupt request.9 b* M1 [, X- c! O/ ~3 G% L, \
  86.                    Encoder unit connected to TIM3
    0 `: J( z' n$ H4 A* D7 \
  87. * Input          : None9 b/ _' g. @  h' a5 ~2 e
  88. * Output         : None- _- a# z' ], f" y. ?2 `2 C
  89. * Return         : None0 g2 n% O# e- f2 L
  90. *******************************************************************************/
    3 h% t- L* S* L5 N; {6 u: n
  91. void TIM3_IRQHandler(void)
    + b  c  v, M' t4 J7 j
  92. {  ; j, E8 ~# v% ?0 m. u0 I, M6 \- ^7 X, G
  93.     /* Clear the interrupt pending flag */
    # A, a' m' F& \. c2 G
  94.     TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
    ! G. w, K: Z  B: n, g" R

  95. 9 }# h6 H3 W# l& ]/ V1 W0 o
  96. }
    " c5 s3 t& y/ E

  97. * V  d* j( q& e, A3 _
复制代码

3 l9 `+ ?; T; |4 Q- s. c, R# b
收藏 评论0 发布时间:2021-12-2 15:53

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版