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

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

[复制链接]
STMCU小助手 发布时间:2021-12-2 15:53
如题,送给自己做警醒。
: z/ q, n4 Q* r
3 x2 `9 X/ ?6 H' q9 I+ \" t注意:
/ ^6 x; P4 Q( P' E! A& w& f, q9 T! L  A, V/ |  \5 d* O  T: P
如果stm32f2xx系列上面的网址的代码要做适当修改。
/ b; [5 L+ u1 f! ?7 t- \以下说重点:stm32f2xx系列,在调试中对GPIO的初始化,切记选择GPIO_Mode_AF模式,即端口复用。: B$ L3 J) d) w  y4 b
( S; d0 Z# P6 s/ `) |; h& e
随后,要做端口映射处理,即调用:GPIO_PinAFConfig()函数。& F0 h6 e0 ]% J1 k$ c# A
这2个方式不选择,timer是不会有反应的# c4 E9 G. {  {6 U- R# z! Z
1 v8 T- X2 s  g% o* c1 j
本人是stm32f207,花了4天惨痛代价。
5 S1 D2 @  N4 g  b5 ^! S8 {9 {# n* s  c- ]( x  V1 T
以下贴代码:$ f3 N0 H% l0 O2 L2 E1 s$ R  D
  1. /* Private define ------------------------------------------------------------*/
    & l* m. d+ X2 W4 [& h" R
  2. #define ENCODER_TIMER                TIM3  // Encoder unit connected to TIM37 X& N2 N# K- }# q2 g/ d
  3. #define ENCODER_PPR           (u16)(1000)   // number of pulses per revolution
    ' \8 r4 O8 K1 g" Z1 @9 T
  4. #define SPEED_BUFFER_SIZE               8
    8 k% d0 o* R% j  f& S

  5. - O8 }! J. {6 ?# m; W( O1 }% S3 k
  6. #define COUNTER_RESET   (u16)104 {8 I4 `- {& [$ p" n9 D- R
  7. #define ICx_FILTER      (u8) 6 // 6<-> 670nsec  d( w1 O& U. o/ s7 R3 O0 X' G

  8. . y' s. V+ M% T: S8 V
  9. #define TIMx_PRE_EMPTION_PRIORITY 0x0F
    6 x( h% u3 u9 g2 ]0 R# W
  10. #define TIMx_SUB_PRIORITY 0x0F
    & E4 m# {' f' h$ P/ f: Z
  11. 4 Q2 l6 S9 ~2 r* |! R
  12. & v% ~9 Q1 f0 ^

  13. 4 m& c: i% X5 \2 `% b
  14. *******************************************************************************
    / ]9 r+ @5 A4 Z1 ^3 g/ ]3 P
  15. * Function Name  : ENC_Init( T9 _( j4 [" D4 w
  16. * Description    : General Purpose Timer x set-up for encoder speed/position
    # o6 q$ E" O% r! D/ S& L
  17. *                  sensors
    8 e2 A+ j  H, n6 ?/ s+ e
  18. * Input          : None
    8 l0 K2 l4 V) q* y6 C! s
  19. * Output         : None
    ' B7 {: `$ u# Q8 m0 q! [
  20. * Return         : None
    ! _0 E4 k0 `; k! T1 b
  21. *******************************************************************************/
    + i6 s$ h& |0 k0 K! C9 k
  22. void Encoder_Init(void)
    % B6 z# B( f/ Z4 J: ], P- H
  23. {
    3 m& K* D! B" a# b6 _
  24.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;6 q* l& `) e( M7 t; @# K, @
  25.   TIM_ICInitTypeDef TIM_ICInitStructure;; S8 @8 w; m# c7 R+ j
  26. & }/ F5 b- z) ?! _( A
  27. /* Encoder unit connected to TIM3, 4X mode */   
    8 ]9 `- e" M5 K) H6 t
  28.   GPIO_InitTypeDef GPIO_InitStructure;
    2 d+ l. O' g& v; P1 z3 |, Z
  29.   NVIC_InitTypeDef NVIC_InitStructure;+ P1 j) n; H3 Y0 J8 k! H
  30. # X) D- b9 `. f/ C* ]
  31.   /* TIM3 clock source enable */
    0 j- Q- R& U4 Q0 N1 {
  32.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
      U% Q- p! a) }& v& K0 @! [4 U3 Q
  33.   /* Enable GPIOC, clock */
    - j3 Y/ L: J) k
  34.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);! W! {4 b; B* c3 q6 N
  35.   //GPIO_Init
    ) h1 [5 z, r# L" _
  36.   GPIO_StructInit(&GPIO_InitStructure);
    6 ^$ z! W! H2 u; t: j/ G& p
  37.   /* Configure PC.06,07 as encoder input */
    1 H( F  h* G7 w' z+ q+ Y2 s+ @- D4 ~
  38.   GPIO_InitStructure.GPIO_Pin = INTA_PIN | INTB_PIN;& A, E4 z' l/ F6 u5 A; U2 v' j( S& _
  39.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;              //这个地方注意
    1 T3 Q& c2 W3 @$ ?; u3 q* i2 P- h
  40.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ( K8 c/ J! _# ?- S% a5 j1 ~) O
  41.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    & a+ N9 q( M! u# V6 B
  42.   GPIO_Init(GPIOC, &GPIO_InitStructure);
    6 B0 i. ]: f% v) j

  43. . H+ r, d- a3 h
  44.    /* Connect TIM3 pins to AF2 */  
    + `# i0 k& {/ d: y
  45.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);   //这个地方注意
    ; b) v; W, s/ w: y, W+ g
  46.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);   //这个地方注意; r0 ]$ E3 a+ v% h
  47. 6 l9 `6 {1 i1 S8 H, x. o( x/ T6 j
  48. + t" X% d( x  K  D% f
  49.   /* Enable the TIM3 Update Interrupt */* h; p4 R1 e6 o8 l
  50.   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    8 s* U& }3 J3 ^2 a
  51.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY;
    $ J- c7 |: S& Y
  52.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;
    9 U5 b+ w  Y# p/ I8 t8 h& \* A
  53.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;- y$ s1 }! C/ o2 d
  54.   NVIC_Init(&NVIC_InitStructure);
    ; C8 f  r2 X0 m
  55. 2 m! |8 M- e' x1 L) s
  56.   /* Timer configuration in Encoder mode */  ^+ E. R0 M$ v% r3 {5 K: m
  57.   TIM_DeInit(ENCODER_TIMER);+ u- k% z/ l9 ^' q
  58.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    9 l) k  W' I  T/ R& B# T, _( P; @

  59. ; r2 s: R: f" G4 e9 H
  60.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling
    $ l; i9 {/ U3 k. a
  61.   TIM_TimeBaseStructure.TIM_Period = 0x0F;//(4*ENCODER_PPR)-1;  & c6 d  {( D; u
  62.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    2 }/ l$ D. G) Q8 O& ?
  63.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   # o/ k6 D+ F& r+ d0 ]- K( w" E/ Q
  64.   TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);% b9 y- Y: T% W' Y
  65. 8 c( `' c+ v. b. ]7 Y& ], i
  66.   TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI1,
    # O# e: k0 H+ N' Y
  67.                              TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);, `; p/ r& u9 K( z( b
  68.   TIM_ICStructInit(&TIM_ICInitStructure);: `, [' L% ]' \, I' m  q
  69.   TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;                //--?--
    : ~  D  R0 C( ]+ C* X: g3 Q$ p
  70.   TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);
    : u$ Z+ _# C$ Y$ x7 w; a+ g: b
  71. / ^+ M9 \/ ~# D, D+ L5 _7 r. k
  72. // Clear all pending interrupts
      z1 ~7 H# s( M
  73.   TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);$ K7 M( r3 t) Z: ~2 J" L
  74.   TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);8 P1 W5 z- `; |6 z1 \. |7 S& @9 s+ o
  75.   //Reset counter' K* @/ C0 g' b; Z' g8 t9 \* Z. e* w
  76.   //ENCODER_TIMER->CNT = COUNTER_RESET;
    & B3 {, V% b* r% p

  77. 2 ?. `( }+ o) M# h
  78.   ENC_Clear_Speed_Buffer();
    ( V9 V1 j* A. Q+ p$ M7 _

  79. , U7 Y1 u6 W4 S- L' k
  80.   TIM_Cmd(ENCODER_TIMER, ENABLE);  + t4 x# o$ n6 ~  i
  81. }
    3 N; e4 x4 y! p% r
  82. ; s( q( T9 p7 k- I
  83. /*******************************************************************************2 A1 D# D7 {/ G" O" [  L+ d
  84. * Function Name  : TIM3_IRQHandler; j6 l+ o) |9 I9 m$ x: ~, w
  85. * Description    : This function handles TIMx Update interrupt request.+ F5 y6 T; D0 p
  86.                    Encoder unit connected to TIM3* \9 m, U: y* F
  87. * Input          : None
    " E5 h* z; s3 Y9 W% K% D
  88. * Output         : None% o0 M1 K9 B# p2 |2 K$ R' H2 c' V
  89. * Return         : None
    - v% I# H9 U5 C' O- ?' l" `$ g0 r( i/ a
  90. *******************************************************************************/- W( N- J. C/ L
  91. void TIM3_IRQHandler(void)
    + B7 q5 M4 g# n; R6 E! o
  92. {  
    * }/ n* H* ]0 O  ~
  93.     /* Clear the interrupt pending flag */# o) h2 I) n6 Y! g- ^
  94.     TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
    ; X8 n. _6 z+ N% g% ]6 p3 m: ^
  95. ' R3 }. o% _6 ~2 [) f4 A% w& P
  96. }
    0 A1 N2 [+ l! v2 V4 r# g8 o

  97. : \- Q7 ^% B' Q$ I, H% }, y
复制代码

( h8 `8 T3 S/ x0 b5 K7 X" S
收藏 评论0 发布时间:2021-12-2 15:53

举报

0个回答

所属标签

相似技术帖

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