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

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

[复制链接]
STMCU小助手 发布时间:2021-11-12 23:01
1,系统EVENT的实现4 u( w- t+ U: l$ V5 v
本项目是一个简单的系统,在这个项目中,我们采用了一种Timer3中断计时,时间到了以后,置位EVENT标志,然后再在主程序执行的方案。
0 u* P; ]2 n& a
# ?& @- C" e" r% ^- {' G0 L
  1. while(1)
    ( Q- A8 E* N. P
  2. {4 S$ ~2 }# s' u; H+ o
  3.                 if( newEVENT_id & EVENT_1)
    7 r6 u& ?7 T  R5 A7 W
  4.                 {
    & F3 w, Z8 c; v( [% c/ @. x6 `
  5.                         newEVENT_id = newEVENT_id & (~EVENT_1);
    . Z  U9 a: N7 T) O
  6. 1 l) u5 H( J, O7 U- A- N
  7.                         newEventStart(EVENT_1,  2000);
    . D2 T: l0 P2 C
  8.                 }
    ( U+ M: o. H3 m5 i" ]

  9. 2 o0 H" W& A$ F+ @
  10.               if( newEVENT_id & EVENT_2)+ a# ?+ {% l- l& u
  11.                 {) m2 F$ O* I! N1 s# Q" B$ t& s# B
  12.                         newEVENT_id = newEVENT_id & (~EVENT_2);
    , c& j) W, U8 o4 ^

  13. ! U6 n: o9 W+ O  z* b
  14.                         newEventStart(EVENT_2,  3000);$ C0 k! F& x; V5 D! D. [( E+ X
  15.                 }
    ) |% J: ?$ _1 z" E" Z' l
  16. }
复制代码
  1. //-------------------------------------------------
    0 \* p' W9 |8 M
  2. void  newEventStart(uint32_t   inputID,  uint16_t  endTime)
    + k. _$ d4 c8 Y2 ?) M1 A
  3. {9 l$ [% J# A; A( p* q
  4.       switch(inputID)
    ' u  J6 l# `8 w2 U! R- a
  5.       {' M9 k! r9 [1 ]. r# m% [
  6.            case EVENT_1:
    / W3 M8 c; v; V, V$ O9 t
  7.                    EVENT_1_start=1;) i6 ]+ \& Z9 j% o- p3 O1 o
  8.                    EVENT_1_count=0;" a  @% A" `% j* ?7 {
  9.                    EVENT_1_endTime = endTime;
    . q9 k) U8 K. G2 M  ^0 w
  10.            break;
    $ e7 {( y+ I9 J# x: C5 m

  11. " H+ S' }- |3 m. |
  12.            case EVENT_2:
    9 A. y7 D+ P/ p7 `
  13.                EVENT_2_start=1;4 l# Z* F: \3 C
  14.                EVENT_2_count=0;: t/ P3 x- u% j8 A6 a# F
  15.                EVENT_2_endTime = endTime;
    ! T  n! `* ^) x! i
  16.            break;5 J6 C$ X2 ]0 B& Q
  17.        }
    4 D. ]; U0 L5 p6 ]& n
  18. }
复制代码
& N- w9 v5 ?8 n3 ?- n
EVENT的计时,放在Timer3的中断里面:; F  k4 @2 G8 p6 J" P8 F
到了EndTime以后,则置位EVENT标志- i" }/ H" B4 ?, k% E5 I
1 A2 {- p$ \3 ]
  1. /* USER CODE BEGIN 1 */
    " u6 p$ E$ [' F- M4 d. m
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    ) X6 L3 l) S2 h( R8 E* P% N
  3. {
    + y8 t2 a2 ^( D6 ^. y) }4 i1 o
  4.     if (htim->Instance == htim3.Instance)   //---Timer3 中断入口 ---------
    * C6 |; Z1 L% `. r( M
  5.     {
    1 T1 }" N* M" q
  6.             newEventCount();/ h  Z; p4 {4 h' |2 |! j3 r
  7.     }# m0 T$ G$ z2 C- Z
  8. }
复制代码
  1. //------------------------------------------------
    0 h0 o' M0 o3 P0 O/ P8 b
  2. void  newEventCount()1 O* V! |3 \" I' W! ~2 k) G
  3. {4 [. t6 l  F' N3 `+ d
  4.    if(EVENT_1_start), u1 [! U" d, S- x! Q5 J
  5.    {
    6 S  t! y3 u$ K7 ^
  6.            EVENT_1_count++;
    * J/ k; J# a7 ~
  7.            if(EVENT_1_count >= EVENT_1_endTime)* I- v3 A9 X/ C
  8.            {' B, M/ a0 R$ R/ |) L4 X/ J) L
  9.                    EVENT_1_start = 0;
    ) j4 ~3 Y' ~( t) a/ J
  10.                    EVENT_1_count =0;8 H' e& s  F7 ]
  11.                    newEVENT_id = newEVENT_id | EVENT_1;7 u6 J- y4 s( B5 r2 k
  12.            }
      y) w) S6 k$ `) H
  13.    }; o& x0 |! ?3 y! H% v
  14. 5 L/ L, P$ l. _3 W. j$ q! @# f1 i
  15.    if(EVENT_2_start)
    ; U- D; d! X" r3 \7 X- @, [7 P7 S
  16.    {
    . c% _' a% y( w- f) y( q& |
  17.               EVENT_2_count++;. t6 K! B) @6 f$ e9 z# ?% W% v6 E/ e
  18.               if(EVENT_2_count >= EVENT_2_endTime)
    4 p: W0 ?1 @0 q) ^: W  T
  19.               {
    " W( C( g5 N/ u4 j% X; H( z7 ^. G
  20.                       EVENT_2_start = 0;' O. V2 V9 K1 a6 x/ J, K
  21.                       EVENT_2_count =0;) z% W' ?' W+ ~/ [; c! K1 `2 _5 W" T
  22.                       newEVENT_id = newEVENT_id | EVENT_2;
    6 Y( ]  a" o2 a2 @: [% a& j
  23.               }# V+ ^8 ]# _4 d, z( l$ M3 e
  24.    }
    $ y! }2 R/ Q5 M+ [) U
  25. }
复制代码
这样的话,我们开启一个EVENT,来指示系统是否正常运行,就很简单了,下面的简单代码就实现了:2 X& F0 W8 }/ p. y

  1. ' z6 n/ P8 i1 I1 I
  2.                 //--LED1 Indicate the system running-------
    7 F/ ]" X* K' n
  3.                 if( newEVENT_id & EVENT_1)# y7 P3 e7 U0 m+ e# I: d" g: S& q/ y
  4.                 {& x: @  n# L& \# C) Z8 o
  5.                         newEVENT_id = newEVENT_id & (~EVENT_1);4 |' r$ }& p, p2 X( P5 Q7 \* w
  6. / `* v1 x; d1 A2 ~1 |, i; @
  7.                         LED1_status = LED_FLASH_oneTime;7 C! F( H* ^6 h4 C0 R6 @8 K& [
  8.                         LED1_FLASH_count=0;- }) E- g/ h  H# t& X( m6 w5 d

  9. 0 G' ~+ G! i8 P1 k7 s; \
  10.                         newEventStart(EVENT_1,  2000);
    # C- D& ?7 a- e7 u' j) @! ~3 }
  11.                 }* n' A8 n# \2 R5 p$ A9 c/ X
复制代码
) u- `: X, M1 y; v' D
2,串口的接收( M9 q2 I1 |5 o0 P* e
串口接收按以下思路进行:0 j, @) D$ ~6 v5 f. g
1,打开串口接收中断,每接收到一个字节即中断一次;5 ~2 e  ~) b9 ~7 @
2,在中断里,把收到的字节移入接收数组里,同时启动一个EVENT,如果不断的有新的字节收到,即不断进入中断,即不断重新启动EVENT;
% v7 T" {1 U. k, K& ^3,当没有新的数据进来的时候,EVENT会不断计数到终止;4 M0 u, E. W6 G  K
4,EVENT计数到终止的时候,会置位串口收到数据的标志;
' t- B6 [# q2 u1 V! w+ A2 I/ h5,在主程序里面处理收到的数据;) F2 a6 O1 W6 n" k6 Y, p
这样串口接收的好处,不需要知道来的数据是否有特殊标志、是否有特殊长度,它实际上是判断如果6MS没有新的数据,即表示当前数据接收完毕。
" U5 X: M1 s3 y* A, m1 E+ z, h$ k$ c0 ]) U" W' K6 N
  1. HAL_UART_Receive_IT(&huart1, aRxBuffer1, 1);          // Enable the USART1 Interrupt
复制代码
  1. //------------------------
    , c  h0 A1 h+ V8 {
  2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    / y% I4 ?' r9 a$ W
  3. {
    8 K+ k9 Y4 u4 T  J+ x/ b, X
  4.    //----UART1收到1个字节后 中断后来到这里----------2 V- A! G4 A9 z, Q6 l. ~
  5.    if(huart->Instance == huart1.Instance )1 |' B$ q) x/ }0 y1 [' h
  6.    {
    ' m  g: c6 s/ V4 b1 C) ]/ o$ E
  7.            UART1_received =1;   //--设置UART1收到数据的标志
    $ o0 k* \; I) l! `" G
  8.            UART1_receiveData[UART1_receive_len] = aRxBuffer1[0];  //--把数据放在UART1接收数据的数组里- n$ s* x) P# F' ]
  9.            UART1_receive_len++;
    ) ^2 s8 v& Z9 m: T
  10.            if ( UART1_receive_len >= UART1_receiveBufLen)$ @+ S/ h1 W7 c' u
  11.            {; \3 w$ ^/ w9 n' c( L3 R
  12.                    UART1_receive_len=0;0 V( ^/ R5 \& _& u' s0 A0 S6 m
  13.            }
    3 g  a5 u8 l9 J( c# ~1 F" K" R
  14.            UART1_receive_count=0;  //--清零收到数据的计数,该计数在TIMER3中断里面累加,如果累加到6,则认为这次串口接收数据结束1 Z( F+ A* S7 `% e
  15.    }8 W  w& b- z! o8 o8 B4 z# }4 ]" q
  16. }
复制代码
  1. /* USER CODE BEGIN 1 */4 z- S0 |; }9 V, x( [, G
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)# T% j& b6 V8 E% B5 ?8 L  m
  3. {$ P/ @( ^% {7 h8 X6 @9 K
  4.     if (htim->Instance == htim3.Instance)   //---Timer3 中断入口 ---------
    , b( r. X* E$ J4 S- a% T4 c1 X* N6 D- Z
  5.     {8 e+ J( v  r  K$ i
  6.             LED1_FLASH();9 q  R3 x* e+ ]* e' v0 F
  7.             LED2_FLASH();( P( Z* S3 H% a$ h

  8.   l: x* D% K5 V. r6 Q* m& L
  9.             newEventCount();
    6 m6 K% U- l* w0 }
  10. 3 n% R) [, S1 A$ \+ x
  11.             HAL_UART_ReceivedCount();
    ! O% @9 l2 s' N+ S1 H+ c' \

  12. ( b4 z0 J' P) }5 B
  13.             //HAL_I2C_ReceivedCount();
    6 V, Z! e9 ]$ b$ R+ @2 N$ t
  14.     }4 i" d- b4 \8 R- b% d
  15. }
复制代码
  1. //-------------------------------
    ' V8 r2 G7 |7 r* ^. m
  2. void HAL_UART_ReceivedCount()
      y  \4 u7 }3 l  Z5 o( c
  3. {, J3 u$ R0 ~3 \
  4.     //---如果UART1收到了数据,则计数累加,到6表明UART1串口接收结束------  [0 P5 o7 q* O, {" [
  5.     if ( UART1_received )+ _! b/ D) b/ _) k; a% F# g
  6.         {, H( \3 Z: E- Q8 v
  7.                 UART1_receive_count++;
    ) Z0 B6 W3 S5 g, t5 q
  8.                 if (UART1_receive_count >= 6)   //---Default is 6
    % d; v) ^: ]$ j
  9.                 {! O4 X; v! D' g5 v/ C0 b
  10.                         EVENT_DO_UART = EVENT_DO_UART | EVENT_uart1_Received;
    2 v) M, u7 c5 m& @2 k1 C' I0 S: \
  11.                         UART1_received=0;
    % E9 O6 q- B0 K& F
  12.                         UART1_receive_count=0;
      R9 d+ o8 E1 @8 U" d" A
  13.                 }
    & O* ]; S/ ~$ j1 N( s1 Q) J
  14.         }
    $ W3 D1 f1 f* u6 B
  15. }
复制代码
( n* P' _) [2 b* c/ N  l& y% ^
            
  1.                //----UART1 Received Data Completed-----------------------------------
      L8 s! t) P* [) m, V4 s6 }4 q' B
  2.                 if(EVENT_DO_UART & EVENT_uart1_Received)' j/ ~- Z/ K! }) P2 x: D, U, w
  3.                 {$ q4 @0 N0 x- g0 L
  4.                    EVENT_DO_UART = EVENT_DO_UART & (~EVENT_uart1_Received);
    ( ~- R8 D7 V8 {8 N( L1 V
  5.                    dtk_uart1receivedData(UART1_receiveData, UART1_receive_len);) s$ _! @) F9 c" l
  6. ) Z' {& X3 u9 b& Y) Y1 {8 T
  7.                    UART1_receive_len=0;; X( C5 l0 C/ N3 B2 o8 _& ^1 H3 l& I
  8.                 }% v" {) m/ w& \! w% G3 g" B+ C: j
复制代码
' u5 x& T+ M7 b/ f+ g7 y7 ?

% w7 X0 N, B, }3 T( o/ z. r
赞 收藏 评论0 发布时间:2021-11-12 23:01

举报

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