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

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

[复制链接]
STMCU小助手 发布时间:2021-12-2 15:53
如题,送给自己做警醒。/ s, s& \: m$ N  p( A2 o0 C+ W

5 u& o0 u+ p/ {9 m2 D! I- n注意:
6 L4 a1 C/ {4 }: c# G! L0 R" |3 e1 O
如果stm32f2xx系列上面的网址的代码要做适当修改。
: V9 F. M6 r% Y% g! B6 Q  V) ~以下说重点:stm32f2xx系列,在调试中对GPIO的初始化,切记选择GPIO_Mode_AF模式,即端口复用。# g0 V% d* W8 M: g& l% a
! N6 n1 c4 `  a  W! |' N
随后,要做端口映射处理,即调用:GPIO_PinAFConfig()函数。
5 r: a" W' _' @% V( H这2个方式不选择,timer是不会有反应的: a2 e! P4 H3 ^' v/ E+ c

. I" D0 ^& @) g6 `1 s- w本人是stm32f207,花了4天惨痛代价。+ i3 \! K) K: p# \: u1 }

( g8 a+ q2 [- o以下贴代码:
9 Z% j+ }6 b: d" n% C
  1. /* Private define ------------------------------------------------------------*/" B# e3 m! n& H0 Y
  2. #define ENCODER_TIMER                TIM3  // Encoder unit connected to TIM3
    4 L- N/ r# E4 V# ~' }
  3. #define ENCODER_PPR           (u16)(1000)   // number of pulses per revolution
    % [# `) H! D3 `! N$ ^2 {3 k* c3 R
  4. #define SPEED_BUFFER_SIZE               81 Z7 {+ s  r' h

  5. 9 t+ ?; [2 F* \1 N
  6. #define COUNTER_RESET   (u16)10
    ) u, |  ^3 y* B+ \) x
  7. #define ICx_FILTER      (u8) 6 // 6<-> 670nsec
    " E  a% N& u5 V4 x
  8. / ~9 f% [: m0 i( [* O
  9. #define TIMx_PRE_EMPTION_PRIORITY 0x0F; J$ w/ D6 |. c) q% H
  10. #define TIMx_SUB_PRIORITY 0x0F
    : y; I0 k; d0 h/ ?, J+ S' z

  11.   [' D: h6 U' L

  12. 0 V' U* I( I( {) h# C! e/ S

  13. : x0 Y$ m- p! j/ ^4 z4 l% ]
  14. *******************************************************************************. V! {! Q( F/ w  \- x6 R
  15. * Function Name  : ENC_Init
    # L# }/ a3 I! V# u+ ^! b. p9 D. @
  16. * Description    : General Purpose Timer x set-up for encoder speed/position
    ; l8 ^7 K6 K1 p' y- j# b% {
  17. *                  sensors
    + f* q* V. g7 j% K  Q  F
  18. * Input          : None
    . |! Y& X. ^% k2 d8 Q# [% S
  19. * Output         : None
    % a6 c2 ~- X* ]. i; N
  20. * Return         : None$ o7 _( J. a+ N% }- T( @
  21. *******************************************************************************/& _# k$ s4 s+ M+ @# k+ w9 d( L
  22. void Encoder_Init(void)
    ! l+ d+ G/ z2 Z% I! f
  23. {* o9 ?1 X3 [3 b0 L0 r- M2 `
  24.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    0 f6 S9 \5 ?+ V9 o; E
  25.   TIM_ICInitTypeDef TIM_ICInitStructure;
      o2 ~1 r0 m. U1 p  E
  26. - U4 a( C3 r9 I4 g8 `
  27. /* Encoder unit connected to TIM3, 4X mode */    ; v9 g& I; b: D$ D4 v+ S) h
  28.   GPIO_InitTypeDef GPIO_InitStructure;: c  T/ [/ p& D2 ~! A0 |
  29.   NVIC_InitTypeDef NVIC_InitStructure;! U6 }1 Z& s% r, W
  30. 8 c. g0 g. S  K5 q) _0 `
  31.   /* TIM3 clock source enable *// F! f  Z& N0 i
  32.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);& z( E; Q$ }8 O. V3 H
  33.   /* Enable GPIOC, clock *// {6 I0 }' s0 a# f
  34.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);# o' j1 q0 |' {
  35.   //GPIO_Init
    . A1 M" Y% o+ o' C
  36.   GPIO_StructInit(&GPIO_InitStructure);
    ) ^  k- d! J2 U
  37.   /* Configure PC.06,07 as encoder input */! A3 @( {5 ]( e* n8 L; v3 N
  38.   GPIO_InitStructure.GPIO_Pin = INTA_PIN | INTB_PIN;0 ~. w! T1 a7 h) S' }
  39.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;              //这个地方注意7 t8 l: T  v7 d2 w$ a
  40.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/ F* t( R" q9 ~6 q9 J
  41.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    # ^$ W! b+ A" S% i
  42.   GPIO_Init(GPIOC, &GPIO_InitStructure);/ b2 ?  I+ P" @# ]; G7 s4 N7 E
  43. * n" B% X0 @' l& u
  44.    /* Connect TIM3 pins to AF2 */  
    1 L9 x2 |  H  A9 j9 J
  45.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);   //这个地方注意
    - O' R% m' c9 L5 n
  46.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);   //这个地方注意0 Q  n! @" |! ]) h. I$ b" Q
  47. * p/ B: v- r; A! c. [; A5 y

  48. 5 w! ?1 W; A# V  k# n; y6 h" O
  49.   /* Enable the TIM3 Update Interrupt */8 J8 b9 I" i7 ^- X  C) |
  50.   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;9 o2 w4 }3 c9 s& U$ ?" r
  51.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY;- d: P+ b* G, M/ f* ~
  52.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;$ t/ y% i! g$ ?# _' A' g: p
  53.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;3 D5 @" k9 G3 C% @
  54.   NVIC_Init(&NVIC_InitStructure);
    * d7 s) ]- x3 j4 `1 |

  55. " o1 j1 J' l# F* a7 q- F5 c1 C
  56.   /* Timer configuration in Encoder mode */
    4 O1 C! c2 `; ^
  57.   TIM_DeInit(ENCODER_TIMER);, `3 N, o2 c& M4 ~
  58.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);# S- a8 F( S3 r, l/ [9 P5 i4 A

  59. 1 F" t6 y2 p% C& M8 ?# F
  60.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling # ^# [% ^3 E  |& R0 Q3 p: j
  61.   TIM_TimeBaseStructure.TIM_Period = 0x0F;//(4*ENCODER_PPR)-1;  * X4 R4 _; k$ r8 d  [
  62.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    - `  Q1 W$ V2 J1 u# X3 {
  63.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
    ) l4 i) o1 u, j( H; {
  64.   TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);& F( P  @+ F( d4 L' X& `
  65. # B" L  w9 _% O9 O+ f. G5 G) Z
  66.   TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI1,
    4 R+ w) n+ ]! A2 O2 ?3 n
  67.                              TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
    . I; _4 _% s1 ^# ]% P5 P  `  a
  68.   TIM_ICStructInit(&TIM_ICInitStructure);" B& {, |( l3 b; P
  69.   TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;                //--?--' x9 Z/ j3 a8 _" S6 s( E
  70.   TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);3 U- d, Y! Z/ i* q
  71. $ U! |# N& E7 ]
  72. // Clear all pending interrupts
    " f5 j* L% C  i; ?. v, b! o7 Q- E& \
  73.   TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);  p- p7 u3 G# m
  74.   TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);. Y/ d* x; S3 V* @7 S$ x- b, d
  75.   //Reset counter$ T2 _: S! n9 T' Q2 H7 \) V
  76.   //ENCODER_TIMER->CNT = COUNTER_RESET;
    9 w3 v+ f2 E; \; c- `! f& g/ _
  77. % V2 k3 b; Z8 Z" R* |
  78.   ENC_Clear_Speed_Buffer();
    ; p8 t6 E3 S( y

  79. * |1 K# A6 Z' u& m' f1 K
  80.   TIM_Cmd(ENCODER_TIMER, ENABLE);  + o9 x& e- {. E, Y& G
  81. }
    - W# \8 V0 J( y
  82.   f  h5 r: u3 j1 Z. I
  83. /*******************************************************************************0 t, D$ X4 D# ~. X
  84. * Function Name  : TIM3_IRQHandler) X- q9 J' T4 d# _2 t( q
  85. * Description    : This function handles TIMx Update interrupt request.
    # Q* k. G8 b: o- s* P3 i5 _$ Z: Z
  86.                    Encoder unit connected to TIM3
    0 C3 ?  B" T8 N8 e1 S
  87. * Input          : None8 w- p  {1 i7 @; [& D
  88. * Output         : None
    & u+ u+ M4 A. K7 X
  89. * Return         : None8 s/ C- a5 h" i) s. \3 m
  90. *******************************************************************************/
    + y+ i# A* H' W! D/ b% H6 Q
  91. void TIM3_IRQHandler(void)$ F$ k4 t/ J# h4 F: f% M6 M
  92. {  
    ( M  N! R5 \1 u* r$ Y  l
  93.     /* Clear the interrupt pending flag */. M! e; i) [+ M5 S  }. Y; y' A: \/ K
  94.     TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
    # v% W/ ]3 s) T' n' ?- d( r7 W
  95. : d6 M( _$ ~/ A
  96. } 6 T! e* G' }, k$ ~& t
  97. ! ^4 y1 d$ x, \4 x# x
复制代码

9 n6 d8 C4 I0 \& t
收藏 评论0 发布时间:2021-12-2 15:53

举报

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