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

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

[复制链接]
STMCU小助手 发布时间:2021-12-2 15:53
如题,送给自己做警醒。
2 |  Z4 g3 y, s2 P5 y' _1 A- _2 M" n: {, ?. X
注意:
/ E7 n/ j* W" o9 o  _: A
; J, Y7 H  h- N2 o2 d2 I0 X如果stm32f2xx系列上面的网址的代码要做适当修改。
$ x2 R( c: Y3 h& a, |  F# ^, R以下说重点:stm32f2xx系列,在调试中对GPIO的初始化,切记选择GPIO_Mode_AF模式,即端口复用。& e& r9 T- b/ \8 O% R( Q
  U2 T+ d6 l* W
随后,要做端口映射处理,即调用:GPIO_PinAFConfig()函数。
2 Z: T" ^, T2 Z7 d8 h; K4 }% c8 H! p这2个方式不选择,timer是不会有反应的
! C( I4 O8 h' W. B* \9 X
4 B1 v0 t) o5 @本人是stm32f207,花了4天惨痛代价。, F0 m& |6 h/ B0 _1 ~

; Q4 n/ M# a0 Y2 J/ r% d5 _, P以下贴代码:
$ y/ G# L. d5 f5 ?6 p; `  @
  1. /* Private define ------------------------------------------------------------*/+ A% b) u* L+ h& q' q, P
  2. #define ENCODER_TIMER                TIM3  // Encoder unit connected to TIM34 |2 ]2 I: L8 g) Q) n
  3. #define ENCODER_PPR           (u16)(1000)   // number of pulses per revolution
    2 n( s& l7 `  _! l
  4. #define SPEED_BUFFER_SIZE               8
    . S8 `+ B% T/ D% Z
  5. ) `* Q! \3 P1 J7 r" \
  6. #define COUNTER_RESET   (u16)100 y- A3 T6 v9 ?( d
  7. #define ICx_FILTER      (u8) 6 // 6<-> 670nsec
    ' R6 g. n) V& C, N3 Z+ p! ~5 g

  8. - l" h% x) [/ R7 g6 L  b
  9. #define TIMx_PRE_EMPTION_PRIORITY 0x0F
    * c5 r, I3 L, [3 K% b
  10. #define TIMx_SUB_PRIORITY 0x0F
    ( ]# W( U- j' K2 b$ N. Z1 j/ L

  11. 1 X8 z6 s; B9 `1 |/ p
  12. 5 j  f2 g, M/ U' r% R  z8 {

  13. " N: J5 o# W; z5 r5 B
  14. *******************************************************************************
    $ r- c% f5 b+ s# F1 q
  15. * Function Name  : ENC_Init. y/ H8 p+ B8 b
  16. * Description    : General Purpose Timer x set-up for encoder speed/position " t. E6 f# g/ R5 b5 t9 S
  17. *                  sensors7 i+ T7 ]) q$ G0 B. `: y1 Z
  18. * Input          : None" @0 k. a% x5 X; h
  19. * Output         : None' _' \) C0 E7 r; ^% _. W* Z' k- F, Z) W
  20. * Return         : None3 D8 ^: ]# y% ~3 e1 _
  21. *******************************************************************************/
    ! [, }% ^9 `4 q' G" I2 l9 m, X
  22. void Encoder_Init(void)
    ( Y8 ]3 j; H* F- f6 v
  23. {. V; e. U( l; e* s
  24.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;# b( d5 W" h  p# U- ^& d
  25.   TIM_ICInitTypeDef TIM_ICInitStructure;/ s  E2 U9 K* l/ a$ A# @: ~" M

  26. ) n& m2 {8 A" F; D4 j% F  ]
  27. /* Encoder unit connected to TIM3, 4X mode */   
      d7 O, K) _4 z4 u! `9 \
  28.   GPIO_InitTypeDef GPIO_InitStructure;
    , W7 x& v& R% I. Q: X1 N) n
  29.   NVIC_InitTypeDef NVIC_InitStructure;
    5 b- o& F  r, ]. g
  30. " {2 [4 C' h& U" V6 H( a, S$ @9 d% K
  31.   /* TIM3 clock source enable */% }# n* H' Z& d5 K1 c. D
  32.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  ]/ x" w, _6 {6 u" h% x! [. f
  33.   /* Enable GPIOC, clock */
    " a% G2 T# ~+ @% |
  34.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);* R' Y& U, y$ V' E' F
  35.   //GPIO_Init
    : n4 x* n5 v6 x/ a2 u6 A
  36.   GPIO_StructInit(&GPIO_InitStructure);
    ' S4 m* s6 b9 p; {/ d$ N
  37.   /* Configure PC.06,07 as encoder input */
      j, \: G0 Z; a" }
  38.   GPIO_InitStructure.GPIO_Pin = INTA_PIN | INTB_PIN;
    $ ?& U' E. b' o
  39.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;              //这个地方注意8 X8 _: g1 u1 H. U9 {) _
  40.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;" l' }$ w7 Q; |! |
  41.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;7 t7 ?  N( N; y) R7 O( C+ F9 N/ z
  42.   GPIO_Init(GPIOC, &GPIO_InitStructure);
    ! x1 f2 w$ j2 x+ O

  43. / X- j: B3 w9 K" u: r/ g
  44.    /* Connect TIM3 pins to AF2 */  7 C: m1 y9 D) V8 _( z
  45.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);   //这个地方注意
    - o9 y" J5 o  ^. e) A% ]
  46.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);   //这个地方注意
    6 T) d- m  U  L/ p# S

  47. ! p9 T& Q0 e* y- O

  48. 4 @, P  d+ c0 j7 [# J, e, M; V8 {
  49.   /* Enable the TIM3 Update Interrupt */# p  n) ?; F0 O) h" c& A) P3 m+ R4 p
  50.   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    0 U8 G8 W9 `+ x$ u
  51.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY;
    ( p* [* K, l, O- i
  52.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;1 v2 P; [: C; O, K! Z2 z& _4 {
  53.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;5 S5 ^2 B5 z* o. F+ F& z$ L% I
  54.   NVIC_Init(&NVIC_InitStructure);6 F2 c8 R7 G( q9 f

  55. 7 a3 ^/ ^& ?# c$ @( c2 X
  56.   /* Timer configuration in Encoder mode */
    & N6 }* _0 `. W! n. K" h
  57.   TIM_DeInit(ENCODER_TIMER);. x: N* n7 `" r  J, o& y+ W- C% L
  58.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);' x1 X' C! D+ r% c+ t9 K  t

  59. * T, e; n7 L& a$ Q0 ~5 z
  60.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling - F. e. k' J$ q- Z. M+ Y+ I
  61.   TIM_TimeBaseStructure.TIM_Period = 0x0F;//(4*ENCODER_PPR)-1;  + H$ |& Q. ^& W- y' c# ~) ?
  62.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    6 J+ D" Y5 p" C/ e: O2 E1 V' J! d7 |7 y
  63.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
    * R! A0 {8 Q1 z7 X/ v3 `8 u# u+ B
  64.   TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);
    4 F. H- D7 e: V# y

  65. 6 K  _- ]$ T/ ]1 S/ J6 W
  66.   TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI1,
    ) Q& n' }1 C/ n3 v
  67.                              TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);! u/ V, f" q2 @+ v
  68.   TIM_ICStructInit(&TIM_ICInitStructure);
    & A4 U% h* j% {- L, M) a# y
  69.   TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;                //--?--5 p" y/ @' k% o5 i5 o
  70.   TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);
    & R6 ^* x+ K; _! d+ {2 S" s1 ?
  71. 1 @3 ~- r  ?7 b$ h
  72. // Clear all pending interrupts
    " Y& U) f6 u) U0 Z1 \0 o) A
  73.   TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);3 {3 O% R. I9 G! B$ P0 _
  74.   TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);7 J0 W; [: H# f. k2 d
  75.   //Reset counter
    2 H. l8 H- n4 N4 Y% R- q$ H
  76.   //ENCODER_TIMER->CNT = COUNTER_RESET;; z8 K6 e. x& F9 Y2 V0 }

  77. ( Q  H7 H& l% t
  78.   ENC_Clear_Speed_Buffer();
    5 u, ^) v, \( V& T7 A$ J9 f4 z) m
  79.   A( w8 N# `, D! x+ t5 R
  80.   TIM_Cmd(ENCODER_TIMER, ENABLE);  " M/ H+ {; _3 b6 m/ F' M0 g
  81. }9 T0 F3 X8 c8 G; n6 q
  82. / @/ B7 r: J' B
  83. /*******************************************************************************8 F, A! y( d; Z* u# a
  84. * Function Name  : TIM3_IRQHandler
    . X( |; m" U$ w8 N2 X+ r  v
  85. * Description    : This function handles TIMx Update interrupt request.
    . g+ S: j( A& H4 o& u5 A
  86.                    Encoder unit connected to TIM3
    * s3 R# G7 u6 S  \$ \7 l8 R+ f4 X
  87. * Input          : None& C$ a! I: L% ^' o
  88. * Output         : None
    ( r: h0 |' d1 }! u9 |/ W
  89. * Return         : None
    4 i4 _! v9 `8 S2 F
  90. *******************************************************************************/
    , ^7 J8 b8 o# `" q3 O2 F
  91. void TIM3_IRQHandler(void)
    9 Q# f7 \* p1 V& m
  92. {  
    8 W( Y! s2 B8 o" ?, q
  93.     /* Clear the interrupt pending flag */
    : c$ d: G  S; ?9 \9 r& s+ g
  94.     TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
    # g0 G9 d* s6 _/ [1 X* F

  95. 6 x' i! \5 ]5 f* A. x$ J8 p
  96. }   H" K2 H9 G" i
  97.   i0 b! M8 S0 C) b) |# Z
复制代码
' e7 W7 \% f% t& n+ a
赞 收藏 评论0 发布时间:2021-12-2 15:53

举报

0个回答

所属标签

相似技术帖

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