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

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

[复制链接]
STMCU小助手 发布时间:2021-12-2 15:53
如题,送给自己做警醒。0 n9 o* e( L# j/ @& q* @
: S5 a+ ^. A; G+ W' C4 k& `, |5 V
注意:
; Q0 y4 G- P1 Q% R/ B9 ]+ x" X& Q3 W  h& O" Y# c, g
如果stm32f2xx系列上面的网址的代码要做适当修改。2 q8 D6 b" u7 [
以下说重点:stm32f2xx系列,在调试中对GPIO的初始化,切记选择GPIO_Mode_AF模式,即端口复用。
; N& c, O& v1 A' \1 A  }; v# Q) _/ D) ~2 l+ a9 M9 Y
随后,要做端口映射处理,即调用:GPIO_PinAFConfig()函数。0 |0 m# p& v- c. u
这2个方式不选择,timer是不会有反应的
( A, u- C+ M6 k
  q7 T  e) q) s" l+ F6 S. c7 n本人是stm32f207,花了4天惨痛代价。2 i2 M# U6 f, x; R

: _" H; ]" ?/ S" X8 G% E) r. f以下贴代码:
- r% y2 T% t$ v( |
  1. /* Private define ------------------------------------------------------------*/( a$ J: Q3 U  A+ o, i$ ]- n' Y/ @
  2. #define ENCODER_TIMER                TIM3  // Encoder unit connected to TIM3, }' m+ c' @7 R: M+ T  n
  3. #define ENCODER_PPR           (u16)(1000)   // number of pulses per revolution2 k: s) g7 ]  r7 m+ b
  4. #define SPEED_BUFFER_SIZE               8+ O3 q: k' N* ?6 \$ r& {* I

  5. & Q+ T" d5 U% m& e) O5 R
  6. #define COUNTER_RESET   (u16)10
    2 A8 v! v4 F& f& p( ^% U' |9 E
  7. #define ICx_FILTER      (u8) 6 // 6<-> 670nsec
    ' W, ]7 `5 W1 @6 s: a

  8. 4 \) r0 k; g: X3 s' l6 n( _' I
  9. #define TIMx_PRE_EMPTION_PRIORITY 0x0F
    , x: F; f0 P" @# k& B# ^7 \6 K9 o
  10. #define TIMx_SUB_PRIORITY 0x0F
    ! M6 j* w; _) v; i& [0 ~

  11. ) L. I& P1 J% @; [! N, J) B" ?/ R

  12. : A. k* V7 R$ W* F, A/ s
  13. 7 q0 ]$ r4 e8 Z
  14. *******************************************************************************
    % |1 ~3 j3 F4 l
  15. * Function Name  : ENC_Init
    0 `  K# u: q% \6 h
  16. * Description    : General Purpose Timer x set-up for encoder speed/position
    ' A8 ?2 ?/ v3 w( N" c  @7 c; }
  17. *                  sensors* T2 k0 r8 ]* v& y3 J: O
  18. * Input          : None8 g) u" j$ D3 j! E
  19. * Output         : None0 B8 |: M1 q/ w5 t8 Q7 p5 G
  20. * Return         : None$ b2 Z: X) I; r% M* W% P- n
  21. *******************************************************************************/
    - l6 P! w* v6 l9 i
  22. void Encoder_Init(void)
    7 p+ y* g* L; J; i2 P$ J
  23. {+ U: {0 r. {! }/ F* R
  24.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;4 U+ `$ v! W) }' P5 k2 @
  25.   TIM_ICInitTypeDef TIM_ICInitStructure;; g4 Y8 h, ?* k" i

  26. 0 }" E& n  S; m1 f
  27. /* Encoder unit connected to TIM3, 4X mode */    8 q2 Q. c6 D0 f- U0 [
  28.   GPIO_InitTypeDef GPIO_InitStructure;6 D+ J! v, ~; D! X
  29.   NVIC_InitTypeDef NVIC_InitStructure;
    8 a5 }' p4 l% r( U! H' w) U  M

  30. / P: c4 x  O. @
  31.   /* TIM3 clock source enable */* N2 |" L8 B  @8 {# r
  32.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    * m1 f/ F/ z* s3 w# K
  33.   /* Enable GPIOC, clock */( u# d: T1 `7 H' D
  34.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
    6 o( r) j2 L6 g& d  J* S, @
  35.   //GPIO_Init% q# w6 K; }* ~
  36.   GPIO_StructInit(&GPIO_InitStructure);8 N+ \: {+ V' K8 C' \+ X3 r0 f! z
  37.   /* Configure PC.06,07 as encoder input */" _! @/ K/ E* B6 H
  38.   GPIO_InitStructure.GPIO_Pin = INTA_PIN | INTB_PIN;
    ) @, @- T0 T* T. G+ y# ?3 k- Y
  39.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;              //这个地方注意' B' c8 n4 D3 r0 ]: X6 e" K5 ~+ o
  40.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    5 y& z5 v; N) J
  41.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    7 o. S; O' c9 U/ m6 a4 M: [
  42.   GPIO_Init(GPIOC, &GPIO_InitStructure);6 p  A& F5 J. C& O4 ^

  43. - _, F; |) C4 t( v* r& X* f; }
  44.    /* Connect TIM3 pins to AF2 */  9 f" `9 p6 M6 s
  45.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);   //这个地方注意& f& i! Y0 u: ~
  46.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);   //这个地方注意/ J- c6 B% l3 \" S5 B3 h) i4 N. z- n
  47. ; X" p+ k) ?$ P8 b  Y) L

  48. 3 J# Z" C+ S% F/ N: ~
  49.   /* Enable the TIM3 Update Interrupt */
    $ t9 u% d, m/ ^* C' K
  50.   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;4 v2 [7 E* F3 `
  51.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY;. B1 [9 r, g3 N& m/ M
  52.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;
    . d) G3 [' I2 z& i
  53.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    ) S$ Y* s/ ^! A/ V' C% s& C
  54.   NVIC_Init(&NVIC_InitStructure);# K. ^3 t  q$ r6 d( r
  55. % J% t0 @/ Y5 I  ~& g& z
  56.   /* Timer configuration in Encoder mode */& b# p% d8 D7 p4 X1 `. b8 r; R: O
  57.   TIM_DeInit(ENCODER_TIMER);& o" b: i! B+ A5 P! M7 C; {& o
  58.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    , V/ p  t4 s' ^* Q4 m3 `" t7 t
  59. , K/ E: {% |1 k0 q
  60.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling
    " y; w) B' P* p3 N( V: @: T! x
  61.   TIM_TimeBaseStructure.TIM_Period = 0x0F;//(4*ENCODER_PPR)-1;  
    / m' T9 e; l" h) _3 F  g# `  f
  62.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    # U% p& ^1 ]* W+ e5 R. s* t' o7 o
  63.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   : k0 R! s0 I  K- f) J6 p! @" p
  64.   TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);( I- Z) R( t1 i) v2 ~  W" P
  65. 5 Y4 Q9 f! o* i4 f
  66.   TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI1,
    ( ~, {2 Y' ]/ H- }9 K% a: W4 c
  67.                              TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);3 n3 i. t) s2 E. T
  68.   TIM_ICStructInit(&TIM_ICInitStructure);
    ! J4 d5 @) U) W: x' W. L
  69.   TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;                //--?--
    8 q& s! Q9 G9 J* [+ `
  70.   TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);
    7 F" Q0 Y' p3 q; \

  71. 0 ]4 j/ S; G& L) B  f" Y; t
  72. // Clear all pending interrupts0 a) s1 c% M( n$ H1 E. v  L9 c+ R
  73.   TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
    ( g$ i! ~" Y# j  ?. r8 Q9 q
  74.   TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);- E& E3 ]+ P6 f! i0 {2 ^
  75.   //Reset counter, ?9 h7 _( P& N. D2 R8 A9 G
  76.   //ENCODER_TIMER->CNT = COUNTER_RESET;' Z" {% U# p* r; \5 {6 M# k- x& L3 K: U
  77. , R# U+ T3 I# d7 p9 m- M  @
  78.   ENC_Clear_Speed_Buffer();
    6 a+ O3 k1 @0 U/ s

  79. ( W2 C7 T" ~% n8 P0 V% b
  80.   TIM_Cmd(ENCODER_TIMER, ENABLE);  ; X+ f' e# [3 j
  81. }
    ( E+ z/ ^( G8 k' M0 }5 j! |
  82. # j' q" j. k% t7 S/ }
  83. /*******************************************************************************
    " Z( t0 r& Y; f8 m
  84. * Function Name  : TIM3_IRQHandler5 q; w% L8 u. @3 X  |3 g0 w* [1 S
  85. * Description    : This function handles TIMx Update interrupt request.
      t* ]" ]; u* E8 H3 Z( a+ p* O- ^
  86.                    Encoder unit connected to TIM3
    5 S3 @: f6 [/ M4 G4 I  g
  87. * Input          : None
    8 f$ D8 j* r5 X% \4 S) O1 I7 i
  88. * Output         : None
    3 `3 K& I: V+ X& A5 b1 m* v9 ?
  89. * Return         : None
    ; D. l3 f+ q7 _6 w
  90. *******************************************************************************/
    : z" [# s" a/ U' T. U. f% i. V6 Y$ h
  91. void TIM3_IRQHandler(void); |8 w7 {' |4 T
  92. {  1 Z9 U) A4 p1 e. E7 G( I4 E
  93.     /* Clear the interrupt pending flag */
    1 z3 o  \' }7 J' n% H
  94.     TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);! {' v0 S6 T) X+ c4 L

  95. 5 b9 X% v) z. L7 A8 W0 c, E
  96. } 5 Y7 U  `0 c& @2 \

  97. , \* Z6 T# M- ~1 [" k; a8 X
复制代码

! y: q1 a( q0 b) b' ~
收藏 评论0 发布时间:2021-12-2 15:53

举报

0个回答

所属标签

相似技术帖

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