[Pulse Encoder]文档中心的示例程序有问题

2019-10-22 15:08 [复制链接] 17 302

本帖最后由 霹雳大乌龙 于 2019-10-22 15:09 编辑
' n# b  V6 D: h+ D2 s$ |8 ]/ w% n  I; J
for(rt_uint32 i; i <= 10; i++)
# s# D' e8 q. @' r    {
' n* j8 l% t4 _) `3 U1 G        rt_thread_mdelay(500);
: P' K6 d* a, Z  K4 k9 Y        /* 读取脉冲编码器计数值 */! |! A+ U) w+ U5 y& {# i+ y- E4 g
        rt_device_read(pulse_encoder_dev, 0, &count, 1);
: I; {: W1 Y9 s        /* 清空脉冲编码器计数值 */; k2 |/ j& F! o/ a- [
        rt_device_control(pulse_encoder_dev, PULSE_ENCODER_CMD_CLEAR_COUNT, RT_NULL);$ G! R) k( e' {
        rt_kprintf("get count %d\n",count);
! W- |1 p$ @2 c3 k+ s$ B    }
& S% G/ r! L5 h

应该是:

- M, V8 a; i4 r) U$ g( A
for(rt_uint32_t i = 0; i <= 10; i++)/ Q; |0 [" h5 {2 w7 T; G- l
    {  S! b( ~) J( f) ]
        rt_thread_mdelay(500);
- L+ C% D2 d( D# b& q! }2 r        /* 读取脉冲编码器计数值 */
' u. N2 ^8 L, y        rt_device_read(pulse_encoder_dev, 0, &count, 1);
$ T# s* I* \( h8 y$ s; N        /* 清空脉冲编码器计数值 */
/ Q% K, t' k8 e( x! b        rt_device_control(pulse_encoder_dev, PULSE_ENCODER_CMD_CLEAR_COUNT, RT_NULL);7 P% q1 X/ o8 z. w' I! w
        rt_kprintf("get count %d\n",count);
. @8 _& K8 j1 k, m/ w    }
. e; ~' Q' j! L/ R* ~% M" @

但是这样改之后,程序一运行就hard fault,发现问题出在这一句:

. W1 d: W7 O9 s5 n% w3 s. \+ `
rt_device_control(pulse_encoder_dev, PULSE_ENCODER_CMD_CLEAR_COUNT, RT_NULL);
' `$ V) I3 M" L: l3 v

将该句屏蔽后,程序才能运行,但是计数值就没法清空,有没有大佬帮忙看看。

, b  R9 {4 H4 q$ q; a4 K7 R5 \/ \3 y
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-10-22 16:19:50 | 显示全部楼层
感觉驱动没对上
使用道具 举报 回复
发表于 2019-10-22 16:25:37 | 显示全部楼层
是自己加的 bsp 嘛?# x+ t1 _, b( {1 O
使用道具 举报 回复
发表于 2019-10-22 18:00:12 | 显示全部楼层
来一颗糖 发表于 2019-10-22 16:250 }) H2 b8 c5 K& k
是自己加的 bsp 嘛?
/ ]5 s9 @# s( l9 n1 v0 m4 t
用的是stm32f401-st-nucleo,自己写的kconfig,框架驱动和对应的驱动都有,也能读到计数值,就是清空计数这个有问题。
使用道具 举报 回复
发表于 2019-10-22 18:01:01 | 显示全部楼层
Ernest 发表于 2019-10-22 16:19
/ y" ]! U% Y) J/ h+ H' b$ |感觉驱动没对上

) o; N6 I1 L5 Z/ G4 y驱动官方的,能读到计数值。
使用道具 举报 回复
发表于 2019-10-23 08:22:19 | 显示全部楼层
霹雳大乌龙 发表于 2019-10-22 18:01. q- R- i0 I$ n# y5 M4 G( u9 _
驱动官方的,能读到计数值。
0 T) d: W, y0 k0 J9 H) Z$ f8 y
驱动 和 驱动框架 那两个 .c 文件发来瞧瞧
使用道具 举报 回复
发表于 2019-10-23 11:04:50 | 显示全部楼层
来一颗糖 发表于 2019-10-23 08:22
, I5 t& s( z. b" V9 x, L% F+ _; }驱动 和 驱动框架 那两个 .c 文件发来瞧瞧
  1. /*
    / |# R! e6 j; I
  2. * Copyright (c) 2006-2018, RT-Thread Development Team! m" Z& g% c4 }' h  a
  3. *' r/ U# L) Y% f  m+ C8 q3 s
  4. * SPDX-License-Identifier: Apache-2.0: G7 y( u; g, k  d# f
  5. *' p0 ?6 h4 A$ K) S6 N6 C
  6. * Change Logs:
    9 b0 ?- @3 ^5 w' p
  7. * Date           Author       Notes+ A. L+ ]& @, J
  8. * 2019-08-23     balanceTWK   first version# v8 M8 R" ?; g* G
  9. */
    : w- I& w# K, P% U
  10.   }- ~0 g% l% g$ g
  11. #include "board.h"; Y( _2 T- }' m2 j: O5 d
  12. #include "drv_config.h"+ j7 l* D: R2 \% R% \1 T7 h
  13. #ifdef RT_USING_PULSE_ENCODER3 o2 e2 q# y1 {0 H" L* t% I
  14. 0 o: g) d* V9 I! L+ ]: Y" D
  15. //#define DRV_DEBUG
    # s( ~+ H4 w, p4 }
  16. #define LOG_TAG             "drv.pulse_encoder"; \+ x* E2 z4 P/ }
  17. #include <drv_log.h>) n% W* w1 z! h2 Q% h
  18. % z+ Q; _4 U/ x8 Z. C
  19. #if !defined(BSP_USING_PULSE_ENCODER1) && !defined(BSP_USING_PULSE_ENCODER2) && !defined(BSP_USING_PULSE_ENCODER3) \
    $ c5 b, J: I: o: X3 v: H$ N0 [
  20.     && !defined(BSP_USING_PULSE_ENCODER4) && !defined(BSP_USING_PULSE_ENCODER5) && !defined(BSP_USING_PULSE_ENCODER6)
    - S4 r  b! E) k: E3 Z" z
  21.     #error "Please define at least one BSP_USING_PULSE_ENCODERx"$ |$ X. }  o: [8 {! J
  22.     /* this driver can be disabled at menuconfig → RT-Thread Components → Device Drivers */
    + H  m: f4 d( a% m/ P$ z
  23. #endif
    5 \+ e  [7 [6 X" }9 G* @4 W

  24. ! V# g, k5 Y4 z7 w7 i, s
  25. enum, `9 E' F8 c. F
  26. {
    # q* e& f7 e! a$ x/ x
  27. #ifdef BSP_USING_PULSE_ENCODER1# p% ^) P( v0 N( C
  28.     PULSE_ENCODER1_INDEX,
    ; ?" T4 o8 c) u) t4 q- P
  29. #endif( u" ~* k% T8 f
  30. #ifdef BSP_USING_PULSE_ENCODER2) B# f; ]& o9 A8 z7 k
  31.     PULSE_ENCODER2_INDEX,
      w: v$ r5 e1 r( p, F
  32. #endif7 R: S& T  N" @- r/ v
  33. #ifdef BSP_USING_PULSE_ENCODER30 s; p9 s0 w2 A% H
  34.     PULSE_ENCODER3_INDEX,
      Q; }3 `3 d$ O5 @! |
  35. #endif
    ) R' d4 z' i  I9 F* x
  36. #ifdef BSP_USING_PULSE_ENCODER4
    . Q) M+ M5 v, T* c
  37.     PULSE_ENCODER4_INDEX,2 m2 j; c* f  d+ H
  38. #endif* d9 F, w" R( l7 x+ @7 q
  39. #ifdef BSP_USING_PULSE_ENCODER5
    , ]) d+ Y( w' ?! g+ r
  40.     PULSE_ENCODER5_INDEX,1 T6 C# `# c* o" C5 ]
  41. #endif6 B6 u2 J3 G- t6 J& ]7 x
  42. #ifdef BSP_USING_PULSE_ENCODER6
    ; N. ?1 J* y; L
  43.     PULSE_ENCODER6_INDEX,! d( r0 _2 C: c$ }7 n' ]
  44. #endif
    ' {# R; d- v' h' o# v
  45. };. l6 }4 d7 {; C* {  Q9 P0 K

  46. 2 M. S$ z# v5 A2 z9 J% H. M
  47. struct stm32_pulse_encoder_device
    / B% m' W4 L& X8 G- l" h4 @
  48. {  C7 k' e7 ~) g0 K, @
  49.     struct rt_pulse_encoder_device pulse_encoder;
    & }2 P4 G1 `2 w7 W) t, ~1 q
  50.     TIM_HandleTypeDef tim_handler;5 j$ s" R3 N2 r# [3 Q, f, m
  51.     char *name;! J8 C" G- y! V- M( u
  52. };! u5 {% I, N2 j$ ]  k5 N& h

  53. 6 E+ `( P/ ]7 e
  54. static struct stm32_pulse_encoder_device stm32_pulse_encoder_obj[] =
      z( I5 |/ A4 E+ Y( L
  55. {
    3 H' s) X* s5 S1 A; k: V  v
  56. #ifdef BSP_USING_PULSE_ENCODER1+ d! t" x1 E, F7 Y. O' h" l
  57.     PULSE_ENCODER1_CONFIG,. F6 o% T; C2 q" y  V1 ^7 `
  58. #endif1 {& L+ z3 u& m7 O" Q
  59. #ifdef BSP_USING_PULSE_ENCODER2$ d% V0 }# I& C. K
  60.     PULSE_ENCODER2_CONFIG,1 Q8 [# {3 s1 f& ^2 f- V' M
  61. #endif
    % ?& ~. Z: t- \8 ?/ k& M6 T
  62. #ifdef BSP_USING_PULSE_ENCODER3$ j  P/ A: D1 a& \
  63.     PULSE_ENCODER3_CONFIG,' D. K7 i! m! |2 I! \* ]; G& q0 P
  64. #endif; S' j; t) N# Z$ O  X- m+ m
  65. #ifdef BSP_USING_PULSE_ENCODER4+ A/ m0 @% a: l4 N9 ^) i( J9 I, m
  66.     PULSE_ENCODER4_CONFIG,3 `: ?8 t' g; V5 `' n) g& s
  67. #endif
    % m% C  E# b; g8 S2 u, q# g' n
  68. #ifdef BSP_USING_PULSE_ENCODER5
    0 y, e' Q. j( j. e1 x. }
  69.     PULSE_ENCODER5_CONFIG,8 g% S8 u& l$ p; e# w' x9 R1 M
  70. #endif
    ' S; t2 J7 [% Q
  71. #ifdef BSP_USING_PULSE_ENCODER6
    % L2 Z. P( T- j4 ~; C
  72.     PULSE_ENCODER6_CONFIG,
    # Z4 h4 P* i% w: c/ m/ _
  73. #endif
    + O+ S. l! V4 N/ H! T& F
  74. };( C( T: O! O) P9 [( R0 e/ ]  u

  75. 9 O$ K% F2 O3 }" `: [- S/ \( g
  76. rt_err_t pulse_encoder_init(struct rt_pulse_encoder_device *pulse_encoder)
      v+ n: W  `$ F" ^( Z& B
  77. {
    3 z  i$ N$ q$ ?4 g& U
  78.     TIM_Encoder_InitTypeDef sConfig;
    , R, n2 B' H" q. a2 U
  79.     TIM_MasterConfigTypeDef sMasterConfig;
    3 l% r2 E: j/ p  E$ t! c+ J
  80.     TIM_HandleTypeDef *tim_handler = (TIM_HandleTypeDef *)pulse_encoder->parent.user_data;: o8 Z5 g# v- E

  81. 4 F* ^: P  M7 }7 e
  82.     tim_handler->Init.Prescaler = 0;* g9 r4 N) E& ~7 d
  83.     tim_handler->Init.CounterMode = TIM_COUNTERMODE_UP;
    $ ?* a' Y. ?' P9 Y
  84.     tim_handler->Init.Period = 0xffff;) O9 _( D2 b1 b# m4 E
  85.     tim_handler->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    ' h3 L7 `/ _$ l7 C& F

  86. ' O. L. d* `  B$ Y
  87.     sConfig.EncoderMode = TIM_ENCODERMODE_TI12;6 l6 {/ Z& D& z6 o3 H
  88.     sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;- \) `4 c( N/ h; D2 l, n
  89.     sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;3 h  F5 |; Q& V+ s
  90.     sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
    6 R$ H. s# h/ ^4 x- w/ c& m- W
  91.     sConfig.IC1Filter = 3;' m- x5 M& i% ?8 j0 @1 F- v, n
  92.     sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
    : X  o# `1 A5 m9 y! ]& Y
  93.     sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
    , A; x0 @$ y* X: N2 V; M3 J
  94.     sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
    6 i, k- I7 y7 j, R
  95.     sConfig.IC2Filter = 3;0 ^6 K2 D% P: r3 v: V8 ~; ?5 \; C

  96. 0 n2 B$ p6 b8 K) Q# O# w
  97.     if (HAL_TIM_Encoder_Init(tim_handler, &sConfig) != HAL_OK). n# Y* a3 E1 f+ L' a' Z  [
  98.     {
    ( t+ g1 m5 y) G/ {" T
  99.         LOG_E("pulse_encoder init failed");
    9 `, d* O( H. M) @# z1 ?3 J
  100.         return -RT_ERROR;
    ; t1 b5 h. \, b; d0 _; H! c
  101.     }
    ! X/ n3 E6 k9 D3 B$ o/ @6 e1 L
  102. 0 q9 B- d: L  K0 x
  103.     sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;, G& i  P0 M) r. f; `7 i8 j
  104.     sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    - n% E6 h, u0 ?7 W9 i: v

  105. - ?! M: j6 b0 R$ k- b5 S0 O$ d
  106.     if (HAL_TIMEx_MasterConfigSynchronization(tim_handler, &sMasterConfig))1 q. y8 o9 a5 Y$ ^& w" b
  107.     {
    ; f$ A0 @# l- |: q2 J" I
  108.         LOG_E("TIMx master config failed");& C0 ^3 y8 ~9 x" f1 g+ n
  109.         return -RT_ERROR;
    ; a% ]8 p" l7 n* C! j$ J; h
  110.     }
    & p  p( U# b' W9 x  A

  111. 5 p. y" ^) C* b- W4 `
  112.     return RT_EOK;
    & W  ]0 R( x: D* m
  113. }; f  t" R8 A' `$ I

  114. " V& P! Z. ?, t' L4 u  {& W- ]
  115. rt_int32_t pulse_encoder_get_count(struct rt_pulse_encoder_device *pulse_encoder)# E  X6 e9 j. p
  116. {
    0 d5 d( Y0 ]' H' m
  117.     TIM_HandleTypeDef *tim_handler = (TIM_HandleTypeDef *)pulse_encoder->parent.user_data;
    ; w2 l# A! W& C4 Z
  118.     return (rt_int16_t)__HAL_TIM_GET_COUNTER(tim_handler);
    : ?! p! B5 C! {, J/ D
  119. }
    0 r- A0 X! v2 G" E: R
  120. 6 s/ v9 i7 M, u1 u3 w6 ~
  121. rt_err_t pulse_encoder_control(struct rt_pulse_encoder_device *pulse_encoder, rt_uint32_t cmd, void *args)
    5 d8 K' o2 o# y! V" F2 U
  122. {
    : l9 z* s# D+ T: Q% b
  123.     rt_err_t result;( B: e$ Z! e7 k; l- i# A
  124.     TIM_HandleTypeDef *tim_handler = (TIM_HandleTypeDef *)pulse_encoder->parent.user_data;
    / `1 n4 R' _, i% u6 E$ o
  125. ; @$ {+ a- _  w3 ^* {( L9 ]9 j
  126.     result = RT_EOK;3 X+ ^9 A& n% @7 X# E# F
  127. " e4 |$ k# a: M/ O  R  c4 a, q  b
  128.     switch (cmd)& m+ {& i  H1 L4 l. G" E) n8 }
  129.     {
    : Y+ @" n; ]+ B1 F+ N6 X- [4 n0 A- {
  130.     case PULSE_ENCODER_CMD_ENABLE:, f6 |' [  p. ~2 `" [; W9 g
  131.         HAL_TIM_Encoder_Start(tim_handler, TIM_CHANNEL_ALL);
    6 Q# x$ c+ V6 N) i4 `+ s. |' z7 W8 M. w
  132.         break;
    ; H, y5 G4 m4 d5 d
  133.     case PULSE_ENCODER_CMD_DISABLE:- B! P2 @) \- Z0 S. O8 x( S  X
  134.         HAL_TIM_Encoder_Stop(tim_handler, TIM_CHANNEL_ALL);, [4 w  V6 C8 ^6 A
  135.         break;
    " w6 j  T& z/ f4 C$ m, X# y
  136.     case PULSE_ENCODER_CMD_CLEAR_COUNT:* ?, s1 t: w! G" w! D
  137.         __HAL_TIM_SET_COUNTER(tim_handler, 0);9 l# B; G2 h1 ]: ?; O2 u# _6 }8 A
  138.         break;( g% I% Z0 `; @5 k. o9 i; O/ D7 I7 n, h: K
  139.     default:. t, x( {& N' {: D
  140.         result = -RT_ENOSYS;
    0 a7 \* W0 m! r+ C
  141.         break;
    . q. o& m0 r) P) X3 B8 \6 O! i
  142.     }' c7 {) b6 C3 S- u/ y; z1 w
  143. * t. X  t: j# Y$ O8 p0 E" [: W
  144.     return result;
    ) K) A* W" w0 C, [( z7 o5 b
  145. }4 ?3 c* J' `8 p2 _

  146. 2 x- Z* t5 Q1 Z  x
  147. static const struct rt_pulse_encoder_ops _ops =3 f/ T! L8 u2 [/ \# |7 ?
  148. {4 o% j$ t# T$ d
  149.     .init = pulse_encoder_init,
    0 i+ P' T8 e' _4 s' }9 f
  150.     .get_count = pulse_encoder_get_count,
    1 I- V4 _4 {- d. g7 s7 h+ \
  151.     .control = pulse_encoder_control,
    + b  o$ Z& F- t. k
  152. };
    + p) e$ s$ j7 ~- f2 ^* f

  153. ) i/ e$ K; m. I
  154. int hw_pulse_encoder_init(void)
    $ U4 ]+ K) ~+ n# S0 D, L
  155. {% A# |8 k% O- N4 n
  156.     int i;( F# w5 }4 O& G; K4 j9 g$ ]
  157.     int result;
    0 q& E5 b8 _" _+ ?2 `# n* E
  158. 9 d/ Q8 l& I/ o5 g4 R8 \8 p) o# C
  159.     result = RT_EOK;3 B" j8 U, Y& E4 [6 d. M, n. i
  160.     for (i = 0; i < sizeof(stm32_pulse_encoder_obj) / sizeof(stm32_pulse_encoder_obj[0]); i++)( e  S1 x9 I4 n, x
  161.     {
    * U. }( }$ N$ ?$ A% N
  162.         stm32_pulse_encoder_obj[i].pulse_encoder.type = AB_PHASE_PULSE_ENCODER;7 x, y* Q3 }3 s' i) s; `
  163.         stm32_pulse_encoder_obj[i].pulse_encoder.ops = &_ops;3 c. p/ O% S' L* H, _: k
  164. ! M3 N  ?5 P/ c) y( A3 u
  165.         if (rt_device_pulse_encoder_register(&stm32_pulse_encoder_obj[i].pulse_encoder, stm32_pulse_encoder_obj[i].name, &stm32_pulse_encoder_obj[i].tim_handler) != RT_EOK)
    : j. K+ w2 N6 m. }: M; d1 O: [
  166.         {
    6 Z! @$ [3 t6 X0 h, l
  167.             LOG_E("%s register failed", stm32_pulse_encoder_obj[i].name);! F# P1 C4 p9 v
  168.             result = -RT_ERROR;+ n# I$ s& g- ^- c& y! \* s$ B
  169.         }
    " _7 p. @  J' V, ^# A' c( p
  170.     }
    6 Y( C: X3 ^! C$ Y6 D" m! ?5 X) c" Q
  171. , z" G8 ^, W1 Z) J
  172.     return result;/ j4 g3 x# e6 V$ Y' w0 G7 N
  173. }
    ) n! W) H" d# j2 r( I  j
  174. INIT_BOARD_EXPORT(hw_pulse_encoder_init);- V; V  L4 X" s+ q5 [# g' z
  175. 3 r. x( z" B7 n0 u" F! ?( z8 a  w
  176. #endif
    5 y3 x! p! q+ y1 Z; ]$ W% G1 U
复制代码
3 e0 u: d* @7 b, T
drv_pulse_encoder.c
使用道具 举报 回复
发表于 2019-10-23 11:05:38 | 显示全部楼层
来一颗糖 发表于 2019-10-23 08:220 S4 ^2 \1 d" I  l5 k+ ~
驱动 和 驱动框架 那两个 .c 文件发来瞧瞧
  1. /*+ L+ W9 }6 f" K+ _0 X+ \. L& n
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
    ! z: j- T! z! D$ h6 K
  3. *
    ! i- Y% r" i7 G! [9 f5 Z# c2 s
  4. * SPDX-License-Identifier: Apache-2.06 S' {+ E( [) T4 f$ U8 B1 x' n* U
  5. *
    2 I6 N' O& }6 P9 b$ Y& y% V( e
  6. * Change Logs:" U% Y- ]7 y' d  V/ Y5 `
  7. * Date           Author       Notes
    + e2 {( ~/ i1 \8 j& Z. w
  8. * 2019-08-08     balanceTWK   the first version' M5 ]/ Q4 F6 v
  9. */" |$ X9 O1 \( c, u$ L

  10. 0 K5 Y. K. p  }" ~
  11. #include <rtthread.h>
      m8 J$ {+ s% x' ]
  12. #include <rtdevice.h>
    ) D) F1 @3 y' |$ Q
  13. 0 k; E3 M7 a# Y  _0 ?  `
  14. static rt_err_t rt_pulse_encoder_init(struct rt_device *dev)& K" @6 _4 X* @. B+ X  a$ q7 {
  15. {. _$ V$ c1 H; @
  16.     struct rt_pulse_encoder_device *pulse_encoder;* Q, n) g+ \6 V" U
  17. ' s/ c8 o7 h; Q, N
  18.     pulse_encoder = (struct rt_pulse_encoder_device *)dev;0 b5 ?4 I- G8 H5 b0 m7 X2 n% y: ^( t
  19.     if (pulse_encoder->ops->init)
    * H1 O, i: B7 U9 @) S3 E
  20.     {; v; G9 a$ C8 w7 D, |
  21.         return pulse_encoder->ops->init(pulse_encoder);
    2 k* O, h; O: G% }; [: h- p3 S) m
  22.     }- X! t% P5 W& q+ B  ]3 k; I
  23.     else
    6 U' p# s1 o  y4 ^4 K% y  z2 n- k
  24.     {
    2 T; G" a5 J% Z. T0 w; I, Y
  25.         return -RT_ENOSYS;
    ; b3 B, C( O% J* t% ?
  26.     }
    5 z4 H  P; l+ l5 j; w* g
  27. }
    . j9 h) N8 f. A7 |4 Z
  28. ( G) C# D% Y4 m
  29. static rt_err_t rt_pulse_encoder_open(struct rt_device *dev, rt_uint16_t oflag)( W; W" b: Q9 q. v* O3 o
  30. {
    9 v% f7 g# n' O, W
  31.     struct rt_pulse_encoder_device *pulse_encoder;9 v6 z/ N6 D* }1 j' m1 s$ F5 J4 S

  32. ; ~6 r5 Y- {! J
  33.     pulse_encoder = (struct rt_pulse_encoder_device *)dev;
    / [) B" x+ W* z
  34.     if (pulse_encoder->ops->control)6 Z! p) V* ^: e/ V$ h
  35.     {
    - O( C, i9 J0 F3 ^
  36.         return pulse_encoder->ops->control(pulse_encoder, PULSE_ENCODER_CMD_ENABLE, RT_NULL);' d1 O  ^1 R* f* y' j" v0 d
  37.     }
    $ B9 Y6 m& K9 {. t% V/ v
  38.     else$ _  R; \5 z5 c
  39.     {$ _- Y$ u; Q1 M* R( _" L
  40.         return -RT_ENOSYS;
    8 |' r4 l! J- f- M9 c5 M
  41.     }; G. J; x, W' U, X
  42. }
    ! A+ M# H: H, x# L  b" F

  43. ( U4 ~5 R. E8 W" K. K
  44. static rt_err_t rt_pulse_encoder_close(struct rt_device *dev)* Y4 y+ q+ p  F" M2 p
  45. {
    ; T+ ?5 a8 R! L0 O# s# z- C6 d' u; x
  46.     struct rt_pulse_encoder_device *pulse_encoder;
    2 N0 H8 F7 }; h. A6 ^8 \0 q

  47. 8 q4 P" i% Y0 |& n
  48.     pulse_encoder = (struct rt_pulse_encoder_device *)dev;
    : R. P$ Z1 M0 A
  49.     if (pulse_encoder->ops->control)
    8 H- A6 `! B; q7 v9 }% S" f
  50.     {
    ( B" K3 a( v( f' x& L& R9 B
  51.         return pulse_encoder->ops->control(pulse_encoder, PULSE_ENCODER_CMD_DISABLE, RT_NULL);& ~7 ]- {3 B, ~8 Z2 b% c
  52.     }
    5 E+ z( x0 R+ B' g6 F- F; Z6 P
  53.     else. k8 m; l4 P1 h4 F  _1 P" Z
  54.     {
    9 V. S, x. h: N% q4 J" J
  55.         return -RT_ENOSYS;
    ' Z/ n8 i6 _& r; c
  56.     }  j: k- r/ e* ^( g0 n  x) U/ m
  57. }
    * h) U8 x5 o3 O

  58. 9 e0 \) U/ I) f3 x3 Z4 y
  59. static rt_size_t rt_pulse_encoder_read(struct rt_device *dev, rt_off_t pos, void *buffer, rt_size_t size)- D) o. @% L2 B7 D) W6 }# s
  60. {& r1 ?( L" i$ n
  61.     struct rt_pulse_encoder_device *pulse_encoder;- ]! d& a& g* S2 ~: g) o) o" u

  62. , Y6 N6 B! d# b# @5 q5 c* K
  63.     pulse_encoder = (struct rt_pulse_encoder_device *)dev;5 I/ n9 {( r* E7 W; r/ m- E
  64.     if (pulse_encoder->ops->get_count)* X& ?+ k- d" r# _
  65.     {  j% V9 m% l! K" N  @7 b
  66.         *(rt_int32_t *)buffer = pulse_encoder->ops->get_count(pulse_encoder);% e5 ?) }  J- B
  67.     }0 a6 L( `1 l5 h$ c  ]  [
  68.     return 1;
    # }4 `) O* d: {
  69. }6 M9 H" d3 M  r) R5 ~+ _6 s
  70. ' E2 x" g! [# E6 O+ [8 {
  71. static rt_err_t rt_pulse_encoder_control(struct rt_device *dev, int cmd, void *args)! N' l2 r* b6 i! d9 Z6 H6 w6 A4 ?6 A
  72. {
    : p* b& h, g! z* i* {8 [
  73.     rt_err_t result;
    8 O& M, E: u; b$ a. ?. `  R
  74.     struct rt_pulse_encoder_device *pulse_encoder;
    , Q# w& i' s# W+ ^' R

  75. . v5 V" r2 V, O
  76.     result = RT_EOK;- l6 m- u9 A* N" l
  77.     pulse_encoder = (struct rt_pulse_encoder_device *)dev;& Z3 p) B0 T! a( k
  78.     switch (cmd)
    0 C- ~7 K6 Y% t& b* A1 a/ t) v1 C
  79.     {) q) c/ {  G& a; \7 S& ]
  80.     case PULSE_ENCODER_CMD_CLEAR_COUNT:* A& j3 U9 T: ]$ K
  81.         result = pulse_encoder->ops->clear_count(pulse_encoder);
    8 c5 [. ~: b- O" j1 U% b
  82.         break;
    5 B2 J" s8 D& T" |" n4 q$ v1 E( M: u
  83.     case PULSE_ENCODER_CMD_GET_TYPE:
    8 R) _* J" e! D5 u2 F4 G, \9 {* g7 r1 _
  84.         *(enum rt_pulse_encoder_type *)args = pulse_encoder->type;* u& u* ^2 n+ o6 i. A
  85.         break;
    & c# F* Q4 Z7 F: x( y
  86.     case PULSE_ENCODER_CMD_ENABLE:
    1 Q/ R$ y2 M+ H4 f7 n, ?. K
  87.     case PULSE_ENCODER_CMD_DISABLE:0 i. H1 s# u& t( W
  88.         result = pulse_encoder->ops->control(pulse_encoder, cmd, args);$ R6 d) S7 _$ l% w5 V4 ]
  89.         break;+ i' R! {( G0 Q' V- U- R7 N. S+ }. J
  90.     default:/ V% ~. p$ M7 ^# [' I# t2 R1 \
  91.         result = -RT_ENOSYS;0 V4 \1 ?9 m5 O) l
  92.         break;: {1 \- h/ P% m- |; o
  93.     }
    % J/ v& X9 O" K7 B

  94. 7 b' M: Z! W- W  z1 r
  95.     return result;( V. Q  f9 I) o' U& @+ b+ n
  96. }
    8 M: B9 ^- W6 p6 ]# g/ U. ~

  97. ; p4 z+ ^+ [$ I
  98. #ifdef RT_USING_DEVICE_OPS3 j8 l3 g  Z5 N! N" o% H
  99. const static struct rt_device_ops pulse_encoder_ops =% ~0 u  O- v( s& c. ^
  100. {
    ! g0 Y6 s4 o" L
  101.     rt_pulse_encoder_init,
    7 Y5 g  S5 ?1 M/ V: r; j
  102.     rt_pulse_encoder_open,/ L! F* {' i( m9 F. H, z  @
  103.     rt_pulse_encoder_close,
    ! W+ j/ E! V0 @
  104.     rt_pulse_encoder_read,( j' H, \+ [+ d5 n, n4 `
  105.     RT_NULL,
    5 \# h6 R9 G6 C2 I# x3 h" |8 k+ O
  106.     rt_pulse_encoder_control, w  O/ y7 [8 X$ \; u
  107. };
    9 e6 B0 R5 G  R2 ~: l
  108. #endif% ]1 Y( d; s6 }% c

  109. 7 ?" h$ S+ o2 n% r6 J1 g' d
  110. rt_err_t rt_device_pulse_encoder_register(struct rt_pulse_encoder_device *pulse_encoder, const char *name, void *user_data)
    9 {4 \/ B: {: X7 e
  111. {2 R: I# V! l& V  T0 v
  112.     struct rt_device *device;& k7 U2 X! f$ ]# `( ?

  113. . \! I" |0 X% k3 R0 J" s( r
  114.     RT_ASSERT(pulse_encoder != RT_NULL);  E" w. {! R2 P: E) A7 y2 Q" r; J! W
  115.     RT_ASSERT(pulse_encoder->ops != RT_NULL);
    ( U% `8 I7 i" F! q% v

  116. , e& |6 X. u( X: E4 n  y
  117.     device = &(pulse_encoder->parent);1 N' K3 g) ?; w* K4 Q- ~
  118. 4 a0 L+ J4 S' k/ @+ F" F
  119.     device->type        = RT_Device_Class_Miscellaneous;: C- D2 B/ P2 R3 p" O
  120.     device->rx_indicate = RT_NULL;) n% V  T! ^+ R) Y7 [
  121.     device->tx_complete = RT_NULL;
    9 l0 G% G5 W: G/ V6 N& z
  122. 4 ~# I3 v+ z3 r7 U9 D
  123. #ifdef RT_USING_DEVICE_OPS7 [8 ]  |6 N5 u( R" z
  124.     device->ops         = &pulse_encoder_ops;% x  p7 i3 i  ]  o* ?# Q' n3 _
  125. #else
    , g. k* R/ L) L1 ]7 c
  126.     device->init        = rt_pulse_encoder_init;1 Z/ t: ]3 O* p
  127.     device->open        = rt_pulse_encoder_open;
    $ A" L, M! \4 }* X
  128.     device->close       = rt_pulse_encoder_close;6 n% y! R: K# e
  129.     device->read        = rt_pulse_encoder_read;, N+ I) _- j. ^# a
  130.     device->write       = RT_NULL;2 m( O$ v7 u" |6 `3 {) @
  131.     device->control     = rt_pulse_encoder_control;2 Y( Q* q. B2 \3 O- Y4 ~8 M; b8 ~
  132. #endif8 C8 [6 E. j6 w/ L
  133.     device->user_data   = user_data;: G1 s& @+ |( x% b
  134. % k$ G8 i" j$ N, n3 B
  135.     return rt_device_register(device, name, RT_DEVICE_FLAG_RDONLY | RT_DEVICE_FLAG_STANDALONE);
    ! F. ?; X, r5 }# l- A( Z- ~: x
  136. }" R& B' T# w& k3 a* k% }& b: R
复制代码

$ w  Y  ^$ S5 ^4 r% t, }+ N. o1 vpulse_encoder.c
使用道具 举报 回复
发表于 2019-10-23 11:35:43 | 显示全部楼层
把这两个文件以及对应的 .h 文件 去 GitHub 更新成最新的吧。
使用道具 举报 回复
发表于 2019-10-23 13:59:36 | 显示全部楼层
来一颗糖 发表于 2019-10-23 11:35
# Y# q: @2 p( f" m- T. H( S把这两个文件以及对应的 .h 文件 去 GitHub 更新成最新的吧。

: s7 r. ?0 O; g; |: H更新后问题解决
使用道具 举报 回复
发表于 2019-10-24 15:36:24 | 显示全部楼层
霹雳大乌龙 发表于 2019-10-23 13:59, i; ^9 q* _$ t  n
更新后问题解决

4 r6 S; @: d  F7 d- T“来一颗糖”,他写的
使用道具 举报 回复
发表于 2019-11-19 14:14:32 | 显示全部楼层
来一颗糖 发表于 2019-10-23 11:35
, `- ?: m# s3 y把这两个文件以及对应的 .h 文件 去 GitHub 更新成最新的吧。
4 @$ X9 i, y( h) p  V. q
您好请问一下这个encoder的驱动在stm32f7上面可以用嘛?   好像只支持f1和f4
使用道具 举报 回复
发表于 2019-11-19 16:27:25 | 显示全部楼层
本帖最后由 来一颗糖 于 2019-11-19 16:32 编辑 ; L  p" ^9 o$ U6 p6 z* n$ b3 ]
mishi 发表于 2019-11-19 14:14; Q, X2 X  r6 ]7 {9 ?
您好请问一下这个encoder的驱动在stm32f7上面可以用嘛?   好像只支持f1和f4
) u# p; G+ n2 q$ P  U8 C: K' y
https://github.com/RT-Thread/rt- ... 0%E8%AF%B4%E6%98%8E. a7 d- ~, ~. y. c' s+ m7 s
# I# G- Z' H3 ?& w3 g- L

& q5 J3 E3 `: Y  O需要自己适配下。因为用的是 HAL 库写的驱动,所以驱动可能不需要修改(极少修改)直接就能用。按照上面链接给的流程,应该就可以用了。
使用道具 举报 回复
发表于 2019-11-19 16:45:41 | 显示全部楼层
来一颗糖 发表于 2019-11-19 16:270 ~2 }+ a! |/ k  {7 u
https://github.com/RT-Thread/rt- ... 0%E8%AF%B4%E6%98%8E
. t6 v2 a) X, n( s
您好   在rt-thread-master\rt-thread-master\bsp\stm32\libraries\HAL_Drivers\config\f4路径下有pulse_encoder_config.h9 Y8 @- V9 t+ C$ O
但是在rt-thread-master\rt-thread-master\bsp\stm32\libraries\HAL_Drivers\config\f7的路径下没有pulse_encoder_config.h这个头文件    我将f4中的头文件放到f7中   编译也没有问题  但是在用的时候用文档中心的示例程序只有一个引脚可以读取到脉冲值   请问这样算正常嘛?4 [) W: j- C7 }$ |9 `
使用道具 举报 回复
发表于 2019-11-19 16:50:06 | 显示全部楼层
编码器.png
2 R- O9 j$ U" b+ V! [# l$ k+ `0 [4 _' f& S4 u
1. 看下引脚是否正确
5 t4 s9 z/ Q" {" C  A0 F! S2. 看下引脚是不是还有其他传感器在使用
. ?+ Y; o4 j4 V6 ?" \; g: {% K
使用道具 举报 回复
发表于 2019-11-19 16:51:47 | 显示全部楼层
mishi 发表于 2019-11-19 16:45. ?1 \! X* q/ k* W9 q5 s# j
您好   在rt-thread-master\rt-thread-master\bsp\stm32\libraries\HAL_Drivers\config\f4路径下有pulse_ ...

) L9 W6 H! T# O* ^$ N# r1 e15 楼
使用道具 举报 回复
发表于 2019-11-19 19:56:37 | 显示全部楼层
来一颗糖 发表于 2019-11-19 16:51+ [& V: h' u! m; W' @
15 楼

9 C- F/ \& X5 `1 M$ O) ~: _超级感谢您    可以用了     听说这个驱动是您写的是吗?   这个编码器模式的默认配置是上下沿都计数嘛?
7 l9 r6 J) Y2 b8 S" f- D6 R) R
使用道具 举报 回复
发表于 2019-11-20 10:31:47 | 显示全部楼层
mishi 发表于 2019-11-19 19:56
2 k7 E# q* [7 h超级感谢您    可以用了     听说这个驱动是您写的是吗?   这个编码器模式的默认配置是上下沿都计数嘛? ...
% b% ]8 o% h+ ?/ F. g& p4 Y3 ?5 ?( M% ^
https://blog.csdn.net/yx1302317313/article/details/80381001
2 Y4 \# l) t& \4 ]
% w( J8 b* |+ ?' P/ s; q编码器计数的原理,可以看下这篇文章。
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表