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

【经验分享】STM32G031无线温湿度仪开源项目 -5,系统EVENT及串口接收

[复制链接]
STMCU小助手 发布时间:2021-11-12 23:01
1,系统EVENT的实现3 D5 T# C% `+ W" J/ J& G
本项目是一个简单的系统,在这个项目中,我们采用了一种Timer3中断计时,时间到了以后,置位EVENT标志,然后再在主程序执行的方案。
9 s7 m! |# S; t' l  H$ U
  J* |$ B7 Y: Q6 A
  1. while(1)
    , Q% d8 `, |) P' V8 i0 `  M
  2. {
    - Y2 }4 e6 k4 V8 D
  3.                 if( newEVENT_id & EVENT_1): p, [% w0 w, e, h
  4.                 {7 g+ t8 f4 \! M& _/ ?! }, y4 y
  5.                         newEVENT_id = newEVENT_id & (~EVENT_1);4 w6 M3 _. [3 ]- ^# Z: Z
  6. ' f' O1 K2 Y4 P9 f0 g
  7.                         newEventStart(EVENT_1,  2000);- k9 {: P, F- D% {8 w2 K) l& j
  8.                 }& H4 p. p! z( `/ _
  9. / p2 B$ d3 f9 a+ n# ~9 U
  10.               if( newEVENT_id & EVENT_2)" n8 W+ t2 e, O
  11.                 {
    * f5 E, K/ ?* I0 d% U  ?
  12.                         newEVENT_id = newEVENT_id & (~EVENT_2);  D/ O; q/ ]( N3 _

  13. " {- V# @3 A- y9 Z0 n
  14.                         newEventStart(EVENT_2,  3000);
    8 o% a* L" {3 _+ O, e4 D! [
  15.                 }
    " {3 K, c+ o( [/ U) L0 h
  16. }
复制代码
  1. //-------------------------------------------------
    # j6 K- Y% M( j5 \1 |  ^2 I
  2. void  newEventStart(uint32_t   inputID,  uint16_t  endTime)& q: I4 I7 ~8 k0 n( `
  3. {
    & H- _: Y0 c. D, [* R& _  f& L
  4.       switch(inputID); g3 ~  z- x2 N) ^
  5.       {# f" j5 I, M8 N- J' Y
  6.            case EVENT_1:
    * ]7 p9 j5 a; D8 N( n
  7.                    EVENT_1_start=1;
    . N( q  _5 H! Z2 [
  8.                    EVENT_1_count=0;! a* w  u5 o1 T( p7 ^
  9.                    EVENT_1_endTime = endTime;
    8 P5 x( F0 n1 g3 k6 |* d  m+ `
  10.            break;
    * z  E# C4 N0 t6 [8 a$ l) t! I

  11. - S& f" H+ i$ ?2 ?5 T; T
  12.            case EVENT_2:" b9 s4 N! e3 M
  13.                EVENT_2_start=1;
    9 R  t, |# W  w& b9 p
  14.                EVENT_2_count=0;: i# Y" @- |" o
  15.                EVENT_2_endTime = endTime;
    $ |4 Y9 f' i, ~2 M- |0 \
  16.            break;1 h6 o, D& g4 c0 c8 U" X
  17.        }" F$ v& u6 h& }: r( t
  18. }
复制代码

7 y. o! J) E/ i7 {2 K  k" IEVENT的计时,放在Timer3的中断里面:
) l- g; t% G# Y+ h- u6 V到了EndTime以后,则置位EVENT标志6 i" s/ G) F( R3 S5 j" G

* ~1 a. j1 D* u  G- G8 c% B
  1. /* USER CODE BEGIN 1 */8 _  |$ l1 B8 b% U# C# f% L* s
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)) q/ w$ V5 g4 q) Y. W
  3. {
    1 J  ?  H2 Y1 \; k- N% _
  4.     if (htim->Instance == htim3.Instance)   //---Timer3 中断入口 ---------
    # X9 d8 ], K: K5 w% |
  5.     {
    $ g: C4 I/ |3 k3 v
  6.             newEventCount();
      n+ v! A7 K/ u7 F! Y
  7.     }9 x5 d4 M# W  a& Z
  8. }
复制代码
  1. //------------------------------------------------3 l0 B0 N% s" G5 y& }7 [7 h
  2. void  newEventCount()
    $ o2 s1 h2 a' @' y( Q+ Z, Z
  3. {
    6 _" O: K9 A* o- T) M4 }# ?
  4.    if(EVENT_1_start)
    ( [* j. r! ~% W7 e0 p
  5.    {
    8 k& ]  L+ G9 o# s+ V0 J2 p/ Y+ [; T
  6.            EVENT_1_count++;8 u, M( Q: [( w( d4 A$ F/ \/ w
  7.            if(EVENT_1_count >= EVENT_1_endTime)
    3 e  E. z9 r9 W. y" H
  8.            {
      }7 O3 r* R$ B4 J
  9.                    EVENT_1_start = 0;
    $ _- a8 S; }) i, H- j
  10.                    EVENT_1_count =0;
    1 i/ ~1 q. A+ ]  `6 X, h
  11.                    newEVENT_id = newEVENT_id | EVENT_1;
    : G/ P) [' ~/ j
  12.            }
    # q4 k+ Q" k: I5 q- f% w
  13.    }
    ) b2 E* |3 u7 D3 M2 `; z3 ^3 G, {8 v
  14. $ B6 ^/ e/ K8 h2 A8 n( K7 ^. ^: }* q
  15.    if(EVENT_2_start)
    0 J# F  w2 j7 t  e1 u
  16.    {
    ( m+ ?$ d7 }4 e. C
  17.               EVENT_2_count++;! k) W0 c3 t8 W# c6 b6 H
  18.               if(EVENT_2_count >= EVENT_2_endTime)
    & A* I  {6 ]8 p
  19.               {
    9 F# X, ]! n' G6 N  O" K
  20.                       EVENT_2_start = 0;+ K' `8 \, p  b  h; I# W$ E- ?
  21.                       EVENT_2_count =0;+ l) g; y5 {5 }( C/ {2 F& e
  22.                       newEVENT_id = newEVENT_id | EVENT_2;4 R( G* x% U% c- t
  23.               }
    * D3 J- Y0 I5 |* ?
  24.    }
    7 X# ~2 T5 x6 E: }
  25. }
复制代码
这样的话,我们开启一个EVENT,来指示系统是否正常运行,就很简单了,下面的简单代码就实现了:2 J$ d, g6 K) Y) q1 H& Q& P3 h5 d
  1. $ i; e! z% b) R/ e/ d
  2.                 //--LED1 Indicate the system running-------
    . q2 i8 W% E9 u
  3.                 if( newEVENT_id & EVENT_1)
    6 y# p$ h! A2 d2 E3 J0 ]  Q
  4.                 {' d4 w3 v) {! V6 k' x, C" h' w
  5.                         newEVENT_id = newEVENT_id & (~EVENT_1);
    1 T; d/ c. |+ t6 h/ P
  6. ' s0 c* L/ F0 W; j2 H6 ^' b- U0 w
  7.                         LED1_status = LED_FLASH_oneTime;
    3 B% a2 j7 l- `7 i( j5 u$ W! F* `
  8.                         LED1_FLASH_count=0;7 ?8 q2 o9 m  J8 g  R7 o
  9. ( L. ]! G% e- C, F- X1 b4 X5 {
  10.                         newEventStart(EVENT_1,  2000);
    . }6 q' ~: a* @6 q1 N7 m% h
  11.                 }) M$ S. ~( y4 [9 p+ \& N( a  u9 c
复制代码
: p$ ?( r! Z" B( j+ S
2,串口的接收+ S. e; k* c, Q
串口接收按以下思路进行:1 I( Z- i6 [7 n
1,打开串口接收中断,每接收到一个字节即中断一次;
, J3 i6 j; Y; ^% t. ~# }2,在中断里,把收到的字节移入接收数组里,同时启动一个EVENT,如果不断的有新的字节收到,即不断进入中断,即不断重新启动EVENT;9 B5 x1 h- z' B
3,当没有新的数据进来的时候,EVENT会不断计数到终止;
2 }: o5 W2 V4 Q' {2 b8 d4,EVENT计数到终止的时候,会置位串口收到数据的标志;! `+ \( u9 n  l
5,在主程序里面处理收到的数据;
7 p/ b/ m8 x3 p2 y9 O+ L这样串口接收的好处,不需要知道来的数据是否有特殊标志、是否有特殊长度,它实际上是判断如果6MS没有新的数据,即表示当前数据接收完毕。
- l; H! g  d: I1 i- e+ R+ T4 N: P4 ?9 [8 m8 N% @
  1. HAL_UART_Receive_IT(&huart1, aRxBuffer1, 1);          // Enable the USART1 Interrupt
复制代码
  1. //------------------------
    * i, L3 N. u" j( d
  2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)- G8 F' ~  O5 R/ ?$ @0 v$ g' u( U0 X
  3. {" r1 ?" ?, ^0 |# u- E; o
  4.    //----UART1收到1个字节后 中断后来到这里----------- u: q* y& C5 h
  5.    if(huart->Instance == huart1.Instance )( d' l6 D7 {* }! D" l' u2 |
  6.    {$ t2 a! S2 C0 U+ K3 j
  7.            UART1_received =1;   //--设置UART1收到数据的标志
    # g$ p, a7 s' d8 L
  8.            UART1_receiveData[UART1_receive_len] = aRxBuffer1[0];  //--把数据放在UART1接收数据的数组里, v- G6 H, ?* ]/ n, s! k5 ~
  9.            UART1_receive_len++;
    : _/ r3 ^. d' y$ H
  10.            if ( UART1_receive_len >= UART1_receiveBufLen)
    # }6 L* J1 _! m) v
  11.            {
    5 C2 j0 A' F+ l' p, g
  12.                    UART1_receive_len=0;) e- c3 m8 S! _) e# {; Y
  13.            }! ?5 E2 D$ \1 I" D+ |8 z4 Z# X
  14.            UART1_receive_count=0;  //--清零收到数据的计数,该计数在TIMER3中断里面累加,如果累加到6,则认为这次串口接收数据结束/ q& y) K- ]( @2 e! z
  15.    }+ c5 h' K( d6 V: {1 ~7 l3 V4 \
  16. }
复制代码
  1. /* USER CODE BEGIN 1 */
    , {0 ~" h# r0 @# N7 H7 q4 \, U# C
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim): ~* u( U9 [1 b7 {, X( z
  3. {
    " @- U% a& E- S4 x
  4.     if (htim->Instance == htim3.Instance)   //---Timer3 中断入口 ---------
    4 a# g6 n- z& F( Q9 [5 z+ X7 b
  5.     {& h. y7 p! c) k4 P
  6.             LED1_FLASH();
    , ?! H1 b' g9 C  a9 s# o4 \
  7.             LED2_FLASH();! L; W, x" J% y( I3 B: A' Y9 C# I

  8. . ~+ ^& T  ]/ h* M3 b6 E
  9.             newEventCount();
    2 @- m  A# D# y0 `" R6 g
  10. ' g$ B8 \0 E; p0 e) V6 q% ]
  11.             HAL_UART_ReceivedCount();/ v8 `. X) O1 U, e/ b0 u
  12. ! t. H5 [8 h3 B. x# b2 y
  13.             //HAL_I2C_ReceivedCount();
    ) i. A( n7 ]5 O% U- Q8 u0 [
  14.     }
    ; ~6 ~' v$ U: h0 O9 }9 D) x. T
  15. }
复制代码
  1. //-------------------------------
    2 H8 `: `+ a7 {
  2. void HAL_UART_ReceivedCount(); \; F1 n  X0 k+ b$ H
  3. {
    . W" N( W" A. q/ b' Z& w: r
  4.     //---如果UART1收到了数据,则计数累加,到6表明UART1串口接收结束------: ~  x' x6 k7 s; L, ?( Y
  5.     if ( UART1_received )
    7 a. x/ F7 V. L" L; m3 {6 D" i5 C
  6.         {1 Q# |; I' R+ X6 e; X9 b0 `+ y
  7.                 UART1_receive_count++;
    , m) f* A/ {9 Z0 U( M+ _
  8.                 if (UART1_receive_count >= 6)   //---Default is 62 h! [* M9 K6 R3 Y# C
  9.                 {
      }) ?) K* Z  A/ [) k" [6 O
  10.                         EVENT_DO_UART = EVENT_DO_UART | EVENT_uart1_Received;, ^" E, b6 O! {8 k+ I2 _/ d
  11.                         UART1_received=0;' K# Y0 f$ b, h! W* _2 K8 ~/ @0 y6 ~
  12.                         UART1_receive_count=0;; N3 o" S+ s  _1 J- `
  13.                 }% e9 W( i0 p0 i$ k2 v
  14.         }
    , I1 ~9 }5 P8 k3 n! l- F5 q, f
  15. }
复制代码
7 z1 L# d+ v& j* a2 d" u7 \: ]
            
  1.                //----UART1 Received Data Completed-----------------------------------9 z' c- C0 z9 M5 M. v
  2.                 if(EVENT_DO_UART & EVENT_uart1_Received)
    2 u& M$ K$ V$ x5 y6 `+ j( H
  3.                 {; V, t; v$ A; k) i
  4.                    EVENT_DO_UART = EVENT_DO_UART & (~EVENT_uart1_Received);
    ' a2 V: Q2 g" B( c1 V2 r; c) z
  5.                    dtk_uart1receivedData(UART1_receiveData, UART1_receive_len);! ~% `5 o2 F) j$ c7 \9 K, g
  6. , |0 C) w# n; v/ `; `' K1 Z
  7.                    UART1_receive_len=0;7 |+ C9 k5 e; z
  8.                 }
    + ^+ W' {+ `- r, ]. e1 @
复制代码
9 z2 h8 Y0 w2 J6 L' X2 x2 `
& S9 g+ s  W  q9 ^/ k+ S
收藏 评论0 发布时间:2021-11-12 23:01

举报

0个回答

所属标签

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