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

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

[复制链接]
STMCU小助手 发布时间:2021-12-2 15:53
如题,送给自己做警醒。
, Y" C. }, r4 _( Z: }  {+ j8 j2 y0 B( c
注意:
) T* P0 l9 y+ b& i7 c! {( r: y( Y4 e4 p' y
如果stm32f2xx系列上面的网址的代码要做适当修改。
# s% t7 u$ f5 [9 k以下说重点:stm32f2xx系列,在调试中对GPIO的初始化,切记选择GPIO_Mode_AF模式,即端口复用。
, Z: Z$ N: B, Q1 V6 ^
+ T) Y; b6 Q" E随后,要做端口映射处理,即调用:GPIO_PinAFConfig()函数。
$ S( D* u; r8 x这2个方式不选择,timer是不会有反应的
, Q) u% i* V! I$ `, U7 N4 R) f4 r1 a" _
本人是stm32f207,花了4天惨痛代价。
+ x( p5 V1 T; r0 @: x! y6 i/ O; n' U5 E: m$ k$ P2 U: [
以下贴代码:- o5 _0 |3 A' \' l9 J. {
  1. /* Private define ------------------------------------------------------------*/7 a1 K+ N+ ^" {% R, G3 A/ I
  2. #define ENCODER_TIMER                TIM3  // Encoder unit connected to TIM3
    % A- X! O  K0 u5 I) @
  3. #define ENCODER_PPR           (u16)(1000)   // number of pulses per revolution
    * a, Z- L& D- g' z0 ^2 R7 c
  4. #define SPEED_BUFFER_SIZE               8
    2 m5 H7 t2 v. C" P  R

  5. ; o+ h  S6 o8 \3 j! s1 |
  6. #define COUNTER_RESET   (u16)109 A% v5 K' v/ O
  7. #define ICx_FILTER      (u8) 6 // 6<-> 670nsec
    ) g4 @3 j1 Z/ T

  8. 0 I& c* p4 d8 X( f" Z! M
  9. #define TIMx_PRE_EMPTION_PRIORITY 0x0F. R) o2 N- l2 O7 H1 Y
  10. #define TIMx_SUB_PRIORITY 0x0F
    3 p6 h( k& v; t9 ~. J7 [
  11. & p" k1 T6 ]0 O9 o, c; U

  12. * h& U/ k: n0 x' G* ?
  13. % `3 |2 y" P3 k
  14. *******************************************************************************
    9 Q% J7 ?3 D- X, w% t9 S8 j2 R! w
  15. * Function Name  : ENC_Init2 j# R# l" ]( \$ b9 D) F5 u
  16. * Description    : General Purpose Timer x set-up for encoder speed/position
    0 u& \; o0 [6 h) y" \: `
  17. *                  sensors. l5 B, R; _+ W/ k' H
  18. * Input          : None
    ( g# T* t4 \8 j  _8 c. Z* n( E
  19. * Output         : None
    8 k9 E1 W7 R+ V
  20. * Return         : None/ q, ^9 e0 ^# o8 t' {5 Y
  21. *******************************************************************************/$ p& z( x) D$ B" L
  22. void Encoder_Init(void)6 M4 [- c$ C( ]
  23. {, S; i3 @" `. l" }8 T
  24.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    # i1 X7 c9 n9 C. j% q; h) w
  25.   TIM_ICInitTypeDef TIM_ICInitStructure;  w8 K2 V5 E5 b! h  E* }' H  X

  26. # Q" R+ M$ ~6 w8 N1 B
  27. /* Encoder unit connected to TIM3, 4X mode */    % ~( j0 a  L* s- ^
  28.   GPIO_InitTypeDef GPIO_InitStructure;% s) S+ w5 l4 X9 k6 |. t
  29.   NVIC_InitTypeDef NVIC_InitStructure;
    ; ^0 ~5 [* v- C3 i4 \. M+ O

  30. 9 w! k0 T3 @, p
  31.   /* TIM3 clock source enable */
    1 _( ^1 y" l6 s0 y& y7 Q: D( i
  32.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);6 I% R, z, J. B: h1 E
  33.   /* Enable GPIOC, clock */
    8 E* X* s: g' @$ r3 X& `6 t0 Z0 V4 R
  34.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
    2 y; [$ G. W) i/ j( z* K
  35.   //GPIO_Init
    / X7 I3 V: {  p0 K! s7 ]4 I1 ^# a
  36.   GPIO_StructInit(&GPIO_InitStructure);9 W3 c# z, X$ `5 i8 @+ S# J' }  a
  37.   /* Configure PC.06,07 as encoder input */' E  U# ?9 `" N  F
  38.   GPIO_InitStructure.GPIO_Pin = INTA_PIN | INTB_PIN;% i8 i- t0 K2 p6 @) E- r+ I
  39.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;              //这个地方注意
    # z6 T! ^8 t" }# X; `; Z
  40.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;) I' A" r  Z7 i0 b% v) q( N* V6 @6 F) v
  41.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    & e* _: K* c/ [8 Q
  42.   GPIO_Init(GPIOC, &GPIO_InitStructure);
    ) d; X) {. c! }6 ~4 z
  43. - @8 R* O$ ~/ |# X
  44.    /* Connect TIM3 pins to AF2 */  3 Y# k- _$ n3 `: U# n+ X5 O
  45.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);   //这个地方注意6 [# K0 d- B$ c: F3 u+ I% p' ^; q- O
  46.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);   //这个地方注意: ]; d" k. m: \2 k* s* n
  47. 8 Q5 K2 m5 U1 C4 s/ Z
  48. - _2 x$ G7 h8 Y/ O: K( O
  49.   /* Enable the TIM3 Update Interrupt */
    . P8 U8 f$ V  A. {% W
  50.   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;0 c% v7 B1 n# a; S! h5 F3 B3 \. \
  51.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY;
      I( i6 {7 R* n; a  [# u: N: Z  |
  52.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;* c& o2 F  J8 A) d' z+ i& L
  53.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;7 I& I) i6 S7 I9 l) O- Z
  54.   NVIC_Init(&NVIC_InitStructure);' r0 p, V: F0 q( @

  55. ( @' U2 N% S, W( Z- ^$ T. o
  56.   /* Timer configuration in Encoder mode */7 R% z* n" Y1 u) V, ]1 T
  57.   TIM_DeInit(ENCODER_TIMER);9 ^( _1 E' i2 Y* O
  58.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);% G, y: a9 B0 T2 J
  59. , _% t* ?' p- j' ]: @, x' j/ U) |
  60.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling
    8 h7 X* O- P; N
  61.   TIM_TimeBaseStructure.TIM_Period = 0x0F;//(4*ENCODER_PPR)-1;  9 E$ {" A+ H( Q& z; J( n5 T
  62.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;: U4 Y0 ?2 R& R# l
  63.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   , ]# K5 n6 c) K& I
  64.   TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);5 y  C6 D" C2 H

  65. / v9 V; V- \  b5 Q& \
  66.   TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI1,
    8 X/ r; q/ @0 Q  C' `% G
  67.                              TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);4 d! [; r2 a8 h8 }! _& v
  68.   TIM_ICStructInit(&TIM_ICInitStructure);: p0 @3 [# K! `* M9 l2 f0 a
  69.   TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;                //--?--* H7 w( g2 \" d! p8 G  M# e
  70.   TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);0 d4 v$ _5 w( B
  71. ! A" Z2 d" g  Y$ O# M/ s8 u* w
  72. // Clear all pending interrupts
    / d0 a. C' r) V3 D( n
  73.   TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
    5 X: T- z. J" a; I8 R  ]: b
  74.   TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);
    ' ]$ Q& a3 B2 G- E! p# [
  75.   //Reset counter
    8 v8 y. [& A, C5 ?2 M8 M) h0 G2 b/ k
  76.   //ENCODER_TIMER->CNT = COUNTER_RESET;4 V; V1 M. O6 t1 D; b2 h+ g
  77. % ?5 e: i/ [8 K, T
  78.   ENC_Clear_Speed_Buffer();
    ; ]  H! X) A8 ~  a+ @$ w

  79.   j% W4 Z! @* R# i' m& L
  80.   TIM_Cmd(ENCODER_TIMER, ENABLE);  
    - k- y3 z7 ?! Q, {1 |/ g+ e* V  u
  81. }; ^; _" C# `, @4 |' |- `4 Q' i
  82. . T& e7 p: Q' v$ C5 D
  83. /*******************************************************************************: B! M' Y8 E2 L
  84. * Function Name  : TIM3_IRQHandler
    4 `+ }. q$ U* p6 g  O0 U. F# u
  85. * Description    : This function handles TIMx Update interrupt request.5 d) L" q! ?8 ]* w  b' b! @
  86.                    Encoder unit connected to TIM3
    $ {8 A1 z5 I8 d  C; g7 M
  87. * Input          : None: [' X+ \1 _' |$ K
  88. * Output         : None
    1 `: f$ i: Y7 {7 J
  89. * Return         : None$ D) I, t" v4 U# u
  90. *******************************************************************************/
    / [+ N* t) e- y
  91. void TIM3_IRQHandler(void). _" d3 @8 c0 A+ [
  92. {  
    5 Q; S. {, M( s4 b- E) z3 Q
  93.     /* Clear the interrupt pending flag */
    / f6 i0 q' M: u- z
  94.     TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
    , f- J7 b2 g8 J

  95. ) g- I& @" }" Q* G
  96. } . t" y0 L( q& U# }
  97. 8 k2 t5 V" `( }7 w
复制代码

* H) b* X5 ?* {+ Q
赞 收藏 评论0 发布时间:2021-12-2 15:53

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版