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

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

[复制链接]
STMCU小助手 发布时间:2021-12-2 15:53
如题,送给自己做警醒。
* p" s2 @: Y! Q/ @4 r" V& X6 W5 n
$ _6 ]& n& I* |5 S# U" L8 e注意:( E: W# [) g6 X# D# F$ E: i
8 K, s% J8 q' e$ v
如果stm32f2xx系列上面的网址的代码要做适当修改。
( Y& f/ v" j  b& j$ p& i以下说重点:stm32f2xx系列,在调试中对GPIO的初始化,切记选择GPIO_Mode_AF模式,即端口复用。
; u: t* b$ |2 G, I. R) ^" g! B7 c. o$ e) J4 s4 g
随后,要做端口映射处理,即调用:GPIO_PinAFConfig()函数。
! A% J% s8 L. F/ o7 l- u+ }4 Q5 B  L9 `, U这2个方式不选择,timer是不会有反应的
$ z* P! t8 Y& D& s& U
! O. q1 x# ~3 J" m' l/ d( M8 t本人是stm32f207,花了4天惨痛代价。* |0 {3 g' _5 \6 ~& j$ a7 A* y

- d7 l; l, I. {- V5 Q以下贴代码:
4 ~+ I% \4 F) _# Y
  1. /* Private define ------------------------------------------------------------*/
      S& H+ E. E/ I
  2. #define ENCODER_TIMER                TIM3  // Encoder unit connected to TIM35 F2 {: w; L, Y
  3. #define ENCODER_PPR           (u16)(1000)   // number of pulses per revolution
      m# d" T! C. {& r# K
  4. #define SPEED_BUFFER_SIZE               83 x- J1 B" o# J- g4 u) V3 Q* r

  5. $ v2 a2 l* J; |1 Z# }$ f% U
  6. #define COUNTER_RESET   (u16)10
    3 a6 c! |' D1 V. O3 e$ N! c' p" s/ R
  7. #define ICx_FILTER      (u8) 6 // 6<-> 670nsec
    ; z% A/ o+ Z, }% N

  8. 3 `7 k8 m4 B" L' \9 d
  9. #define TIMx_PRE_EMPTION_PRIORITY 0x0F0 u/ e! f- x* s: r
  10. #define TIMx_SUB_PRIORITY 0x0F+ V- A  c1 s$ q  e

  11. 9 q( U2 v+ v; t0 s3 F
  12. ! \7 e; n. b" t

  13. : b' I$ Q. ~9 e% a
  14. *******************************************************************************
    ; v; _+ n- k' L  u) b! C
  15. * Function Name  : ENC_Init- R9 v5 j. Y& v! @. T  ]9 K$ V
  16. * Description    : General Purpose Timer x set-up for encoder speed/position 7 {6 Q6 b8 O5 b0 M3 A7 W
  17. *                  sensors
    3 X$ G7 |; [; U& x$ }
  18. * Input          : None
    " X" q; B9 u' b  |2 X8 g
  19. * Output         : None  u/ O% o. J5 H$ [. F
  20. * Return         : None
      e7 ?. E9 {: y# z" ]! H+ a4 @
  21. *******************************************************************************/  ?4 D# ^$ U9 \1 ^: L- J
  22. void Encoder_Init(void)
    ! M! K5 ^! [6 x* C  Z
  23. {0 ]+ h. ^( \5 R" W- r) w
  24.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;( L7 L) t2 o, u( z% k4 m
  25.   TIM_ICInitTypeDef TIM_ICInitStructure;8 _( Q$ i, u: J& N7 C
  26. / z/ ^  z5 W1 D. m% n- b
  27. /* Encoder unit connected to TIM3, 4X mode */    $ a- S0 [& z3 h- i* z! f
  28.   GPIO_InitTypeDef GPIO_InitStructure;- Z0 x! O" O7 z
  29.   NVIC_InitTypeDef NVIC_InitStructure;
    % y6 t  s: E, M
  30. " t* \* E. p; W' a) P5 [
  31.   /* TIM3 clock source enable */
    ! e4 x3 ?2 m# d  [% J( |
  32.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);* T  h3 _2 s- P4 J4 F" B$ T+ G* u
  33.   /* Enable GPIOC, clock */
    9 B* Q; I& E4 O6 M# H
  34.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);4 m3 j4 f: J0 @$ L) Y8 ~: O6 o
  35.   //GPIO_Init9 z4 t- A2 U+ o, q( R1 r" M- U
  36.   GPIO_StructInit(&GPIO_InitStructure);3 U4 m0 L) R8 o! ~" L
  37.   /* Configure PC.06,07 as encoder input */" b7 Q5 B1 H- {
  38.   GPIO_InitStructure.GPIO_Pin = INTA_PIN | INTB_PIN;
    7 s% S3 S! e. a- E. f5 Z$ o4 m
  39.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;              //这个地方注意
    ) g" b& z7 J  F1 H8 W7 u
  40.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    9 H, {# X1 W* I' z
  41.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    ) z1 `) d- T: S9 w" z! W
  42.   GPIO_Init(GPIOC, &GPIO_InitStructure);1 v  f8 D. Q( X! q  o
  43. % J  A# z3 G8 t, M1 C3 r" i
  44.    /* Connect TIM3 pins to AF2 */  ! X; P$ Y+ U3 N
  45.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);   //这个地方注意
    + q- y. O8 X6 U
  46.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);   //这个地方注意
    ) K/ s0 Y) q1 e2 j4 k( C% d
  47. $ G- E, {6 P$ Y1 K6 y

  48. ( Y3 e, x/ Q. S7 f1 e
  49.   /* Enable the TIM3 Update Interrupt *// m3 Y, l8 p2 @6 f5 u0 l
  50.   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;8 |% O5 F2 A- l! M
  51.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY;
    & ?% o% ~+ v6 z; u
  52.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;/ v1 ?9 u+ B4 w+ S4 [) H  t' u
  53.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;0 ^6 o8 f% x* H+ |- b
  54.   NVIC_Init(&NVIC_InitStructure);- F4 w; Z8 d$ `
  55. * ^+ c7 z' H* T* E8 o
  56.   /* Timer configuration in Encoder mode */( w3 P4 f( }) n+ z4 g) u
  57.   TIM_DeInit(ENCODER_TIMER);4 ], P: q2 M$ B0 e
  58.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);/ h6 f- Y2 S# U2 H
  59. 9 ^  i* {6 D, h& S
  60.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling * d, n6 s$ `* z6 j0 F4 j+ r
  61.   TIM_TimeBaseStructure.TIM_Period = 0x0F;//(4*ENCODER_PPR)-1;  . u- X' W+ x9 @( R/ k% s/ J
  62.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;: X. ]% |1 g# v' {
  63.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   ) S9 v0 |- K0 w3 h6 p, S) E
  64.   TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);
    : \. t3 L7 v& l
  65. 4 ^  _+ d' r2 ?8 [3 e7 K
  66.   TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI1, : }5 [8 t. H1 f# r4 H
  67.                              TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
    7 C0 P" U5 O% u6 R7 m: j& f( h6 w7 [5 i
  68.   TIM_ICStructInit(&TIM_ICInitStructure);4 |! X9 b6 v1 k1 [; c0 A8 Y3 K
  69.   TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;                //--?--+ j# W$ ^7 X0 n2 d
  70.   TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);
    1 k6 l" k8 n" c+ {0 C/ {

  71. 0 x+ q1 A, y& `1 P2 a) j
  72. // Clear all pending interrupts2 Y# \0 d3 x, v/ O. U, V, ?
  73.   TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
    4 n3 a/ g% E9 w# K5 }: R9 N- a3 e
  74.   TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);
    ! B* ]1 i# E0 `8 ~0 T+ }
  75.   //Reset counter
    + D" P" @" c# G7 y9 V% g. R5 H
  76.   //ENCODER_TIMER->CNT = COUNTER_RESET;. V# _! y" a  A" z& {2 H: w! Q
  77. 9 c9 i3 {& V% J5 ?7 ~; {* r5 H
  78.   ENC_Clear_Speed_Buffer();
    + H: O/ b5 }3 l: M% `
  79. % I) E1 C/ D* Y3 A: \2 E
  80.   TIM_Cmd(ENCODER_TIMER, ENABLE);  ) ^5 H! T) I3 D, I# S/ T
  81. }. s6 U7 Y( o. E6 n( I6 I" L
  82. / x" t2 b6 Z/ }+ [* W
  83. /*******************************************************************************- Q/ B. G+ z) D$ Y$ f3 s7 O
  84. * Function Name  : TIM3_IRQHandler
    & C- Z1 g4 G. X9 T1 y0 p
  85. * Description    : This function handles TIMx Update interrupt request.' E* ~$ h0 [, w' R) U; O' T
  86.                    Encoder unit connected to TIM3
    * j3 e" K# _0 S  l5 j! i
  87. * Input          : None
      Y7 q, L$ k4 ]' \) {! B2 \
  88. * Output         : None
    ( C1 c+ Z( [8 t  I' t- V( F
  89. * Return         : None! H, e7 j& }& u  N; R
  90. *******************************************************************************/+ d6 r, o% u! K+ t) @* }0 s/ e
  91. void TIM3_IRQHandler(void)
    8 j- [" q4 I1 l) s% l3 V' L
  92. {  
    1 }: o! h! v! I
  93.     /* Clear the interrupt pending flag */
    . D8 F/ a3 x5 q* w' y1 @6 b
  94.     TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);$ ~: r6 V4 v2 a: X8 m! F- v

  95. ' W- x& A$ a" _7 p
  96. }
    7 v9 i7 {' w. U7 E

  97. 3 O1 s! `: q. l3 W# L  K: y
复制代码
3 z2 U6 t- b  u- j, i: R: V0 W. `
赞 收藏 评论0 发布时间:2021-12-2 15:53

举报

0个回答

所属标签

相似技术帖

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