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

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

[复制链接]
STMCU小助手 发布时间:2021-12-2 15:53
如题,送给自己做警醒。
7 A+ e" A5 C; N; ~, [' ?2 _7 n, {, u  D8 P! L8 Y4 z& f! Q% p
注意:
7 E3 _- K2 U7 X! W7 R  O7 ^- _' F* c
/ V/ t% ^+ x0 ?5 K- [如果stm32f2xx系列上面的网址的代码要做适当修改。
5 F9 W/ |/ @: u以下说重点:stm32f2xx系列,在调试中对GPIO的初始化,切记选择GPIO_Mode_AF模式,即端口复用。
8 Q* b! @; ^+ j3 T3 @, |3 d6 |8 a, z# I6 R, `
随后,要做端口映射处理,即调用:GPIO_PinAFConfig()函数。
6 C9 i- z. d6 k9 R" `# U' }3 o' n这2个方式不选择,timer是不会有反应的
- g2 w7 h  t1 J6 h4 q7 j$ \3 `
2 L; P* _9 \" `1 t) q! G+ v本人是stm32f207,花了4天惨痛代价。! D' a8 F% t0 h6 _$ v: C, L% w
% x3 y7 W# V1 L' A% o
以下贴代码:
) ^+ S8 d: M3 \% _! k; a" Q
  1. /* Private define ------------------------------------------------------------*/- u9 S5 ?: _: K, @9 |# c# Q
  2. #define ENCODER_TIMER                TIM3  // Encoder unit connected to TIM3
    6 S# ~. y  \% b3 m" S: @9 ?9 F
  3. #define ENCODER_PPR           (u16)(1000)   // number of pulses per revolution
    3 I* e; d9 j( a
  4. #define SPEED_BUFFER_SIZE               83 P0 N. Z( `5 L8 Q
  5. : c" P( V8 ~) Q7 C) G0 G! b
  6. #define COUNTER_RESET   (u16)10
    0 i- n8 m6 G2 [. z6 z
  7. #define ICx_FILTER      (u8) 6 // 6<-> 670nsec
    , y  n# M1 T: X" K* D, v

  8. 8 c1 |: h# i% W. S; r' ~$ E
  9. #define TIMx_PRE_EMPTION_PRIORITY 0x0F
    $ I+ @6 w" B  N
  10. #define TIMx_SUB_PRIORITY 0x0F4 t; {& L- D6 q- `* E; ~; U
  11. + y$ I- `8 F$ e( L- L/ Z6 F* H, @- J
  12. 3 y2 p( N- h: m2 b& a
  13. 8 B6 m* b0 x; z
  14. *******************************************************************************1 p: S" W9 u7 Q& k& s1 m0 h" b
  15. * Function Name  : ENC_Init
    ) H5 e3 z% T* a' x, L+ A3 U
  16. * Description    : General Purpose Timer x set-up for encoder speed/position ) s" i+ }8 f9 |7 c1 P" O: t
  17. *                  sensors
    ) E' \, t# s6 r3 [
  18. * Input          : None
    & \8 i7 f) |6 U0 N: u
  19. * Output         : None% Q1 }- o5 X8 {. U+ S, R) f: q0 O* a6 N
  20. * Return         : None
    0 [7 H4 A4 [* L/ g9 @
  21. *******************************************************************************/4 f' P. @; O8 N0 w* f- B
  22. void Encoder_Init(void)
    : x4 j  I( Z4 {% U! {, _2 d
  23. {
    + ?& N0 Y% J' p1 u7 I# S2 H; v7 u
  24.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    & h- c' n) [, ~# Y, U5 L' M9 g
  25.   TIM_ICInitTypeDef TIM_ICInitStructure;* x( L- v4 I4 f" U

  26. / h8 ~0 x# s% d3 G
  27. /* Encoder unit connected to TIM3, 4X mode */   
    ( \5 q) ]3 ~4 z3 l' g9 o) [
  28.   GPIO_InitTypeDef GPIO_InitStructure;2 ]3 `' M# t3 L# }
  29.   NVIC_InitTypeDef NVIC_InitStructure;
    ! X# P& G& Z' r8 l: m
  30. ! T( J* g# Z" T! i9 @3 H& ~
  31.   /* TIM3 clock source enable */
    % Y* `1 J4 Z5 K
  32.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    6 v1 p; j; Z7 y9 `7 A' K. y4 q
  33.   /* Enable GPIOC, clock */
    2 b8 f9 h/ Y% W3 Y6 v, G
  34.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
    1 R9 C# N/ J2 Z6 d3 e
  35.   //GPIO_Init
    0 s' D+ \; I3 P; S
  36.   GPIO_StructInit(&GPIO_InitStructure);9 j* }  d: t% A% P) M5 M, J8 H
  37.   /* Configure PC.06,07 as encoder input */9 b' q- B' `4 L. Q. k$ a
  38.   GPIO_InitStructure.GPIO_Pin = INTA_PIN | INTB_PIN;/ Z( `$ H# g) Q
  39.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;              //这个地方注意
    ! f: k% ]* [% h- U
  40.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;- M" g' K* J+ I& I
  41.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;( R' r4 i* R0 _( H! z& H, {- q3 @
  42.   GPIO_Init(GPIOC, &GPIO_InitStructure);) N* T4 T2 A, P, g/ P5 q  n$ B( Q0 [

  43. & E& w% W) w( E2 g# p8 Z, N5 F; s& `4 e
  44.    /* Connect TIM3 pins to AF2 */  
    1 R) Y1 O; U. b8 r- r
  45.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);   //这个地方注意
    " i1 U7 |4 L7 j! ~1 ], P
  46.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);   //这个地方注意5 D# k' u, g! R, V4 a* j

  47. + G. N, I) I4 z7 _" a+ L) b) t

  48. ' ~! E" {8 ]2 M0 f, j- ?
  49.   /* Enable the TIM3 Update Interrupt */9 K9 F- t& I' U
  50.   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    + H/ r) I6 e* W" t$ S& ]
  51.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY;
    9 z$ d, ?8 W9 ^  K  E2 A8 R+ a
  52.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;
    1 i) M3 W: O; O* P1 c
  53.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    ' W  ?5 }  l+ M
  54.   NVIC_Init(&NVIC_InitStructure);0 g8 u* j4 A9 B- i# C" Z( U! x
  55. 4 o+ D: [) l/ ^7 j
  56.   /* Timer configuration in Encoder mode */
    . y" v' S+ J8 i/ a8 O' }% |# c1 E4 |
  57.   TIM_DeInit(ENCODER_TIMER);
    : {% W5 q, h, F6 \6 y4 ]+ \
  58.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    $ O0 s- W7 m6 e/ _3 M2 f
  59. 1 ]$ o- j9 e5 S: y  C
  60.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling
    + F3 L; [/ J) P
  61.   TIM_TimeBaseStructure.TIM_Period = 0x0F;//(4*ENCODER_PPR)-1;  0 ]9 r& @) V2 c  l' A% k
  62.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;7 D, q5 ]3 X2 {* R6 M6 b- M5 x  x1 H7 Q
  63.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
    ( k9 f* ]& ^! N
  64.   TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);; l- U' G7 J% s4 _9 E9 p4 Y% `7 q

  65. $ v3 r% S# T* g" A: C, Q2 F
  66.   TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI1,
    8 P2 @9 t1 b" @
  67.                              TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
    ' w1 u! x" W3 J
  68.   TIM_ICStructInit(&TIM_ICInitStructure);
    + V. s: N  ]( Q
  69.   TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;                //--?--9 ]0 I; G0 d2 ^6 }  h
  70.   TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);
    , }. U8 s, n/ [1 q) e1 }$ l- v

  71. ( _# [" b. R' x2 T* W4 \
  72. // Clear all pending interrupts; j/ F5 t- L+ _* {
  73.   TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
    0 B' ?' N3 ?, y: M
  74.   TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);& I5 b& X0 @# \1 ~
  75.   //Reset counter2 f$ j9 W, s6 U& l8 L$ h
  76.   //ENCODER_TIMER->CNT = COUNTER_RESET;- h' |% H/ d! X7 [% c1 X9 w

  77. 3 S8 @$ Y: C: \, W
  78.   ENC_Clear_Speed_Buffer();
    5 V. |( o: J4 I. q& C
  79. 8 V4 y5 x- l  b4 W0 ^; a% g& E2 G: l
  80.   TIM_Cmd(ENCODER_TIMER, ENABLE);  
    7 v! q6 T. V, i' j) Q, D" c2 J
  81. }
    4 s# p+ X5 q, W  R

  82. # Q, c3 j0 C& b+ N6 J" L9 q& U5 d0 g
  83. /*******************************************************************************
    & a4 g+ C# H  b% n3 c& B& J4 b% K
  84. * Function Name  : TIM3_IRQHandler( |$ Q9 Q. M( v6 U/ A4 d: l
  85. * Description    : This function handles TIMx Update interrupt request.
    1 [- G, x9 ^( j! d% y9 [5 I
  86.                    Encoder unit connected to TIM3
    ! ~$ S; F- i( W0 W2 U
  87. * Input          : None' j( w# L7 q$ K  j# c% @
  88. * Output         : None
      z9 b3 r1 \$ }6 H7 [
  89. * Return         : None
    2 Y8 e+ \4 i- J0 S. m4 x6 v$ d1 }
  90. *******************************************************************************/
    . z, m4 d( ~" G5 Q/ F1 e; O
  91. void TIM3_IRQHandler(void); T! O" {+ ^/ d1 E% [4 z
  92. {  
    4 }9 Z$ T4 g  c# U3 a% Y" u/ `. l; ]1 J
  93.     /* Clear the interrupt pending flag */; ]2 V) @1 M# {# L) S
  94.     TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);4 K% E2 e7 o, {) b/ M/ W7 s

  95. 4 k1 N. B+ u) z$ `4 G) d$ _
  96. }
    . g# ]; r+ J! ]. f
  97. ' _6 w5 D- m5 f$ F
复制代码
% T5 Y" D( p: q8 |- B8 y- t, C% o
赞 收藏 评论0 发布时间:2021-12-2 15:53

举报

0个回答

所属标签

相似技术帖

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