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

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

[复制链接]
STMCU小助手 发布时间:2021-11-12 23:01
1,系统EVENT的实现" R$ E5 h6 c7 r$ i- n
本项目是一个简单的系统,在这个项目中,我们采用了一种Timer3中断计时,时间到了以后,置位EVENT标志,然后再在主程序执行的方案。1 t! Z  P8 H& r- _: p# w2 D
! D, B2 O; X2 g: l# |
  1. while(1)! l) S( Y+ B; H/ D8 K4 Q- o
  2. {
    & @3 j4 s# S: Z1 ~
  3.                 if( newEVENT_id & EVENT_1)
    ! u: M6 ~! F7 y# a* y
  4.                 {
    0 K$ H$ f* n8 z2 k
  5.                         newEVENT_id = newEVENT_id & (~EVENT_1);2 n( y3 q3 T) s4 ?/ G+ V

  6. # \" e( Q7 L2 k
  7.                         newEventStart(EVENT_1,  2000);3 M. B* G$ f4 V' h( W. }- M
  8.                 }
    1 J3 f  e2 A8 M( L

  9. 5 Q2 ~" P$ ~- }- g6 k6 }# v
  10.               if( newEVENT_id & EVENT_2)$ J4 e0 }1 q" z0 P7 C% k3 n9 R
  11.                 {
    % ^& A$ c2 F. T, f: s/ M* u( l: N
  12.                         newEVENT_id = newEVENT_id & (~EVENT_2);
    0 }" O1 l: W1 a9 t% Q
  13. 0 e! d3 B& [2 [! U( c8 s! [
  14.                         newEventStart(EVENT_2,  3000);3 U1 Q& P- S  i* M8 T
  15.                 }
    * o% P, `. O! K* }5 v
  16. }
复制代码
  1. //-------------------------------------------------+ \4 t6 R& C. O: B
  2. void  newEventStart(uint32_t   inputID,  uint16_t  endTime), k3 q; T+ s2 c8 g, ^" ^
  3. {
    , K/ H9 a5 S" X  \( G" x' d
  4.       switch(inputID)! x: q5 {7 }  q6 W7 n
  5.       {
    1 D- }4 c  h# I  u/ Y4 g% A  y
  6.            case EVENT_1:
    9 u( U- ~0 D% K  T
  7.                    EVENT_1_start=1;
    9 a6 J6 I6 H7 V7 s" u) e; ^' J$ Y7 }
  8.                    EVENT_1_count=0;1 R) D, l1 z# J! |$ O' E) i, _
  9.                    EVENT_1_endTime = endTime;, _: M8 x( ~9 g& U
  10.            break;
    / ^) Q2 `5 |  Z" W

  11. 3 p( e- V" M. }0 c- r! N
  12.            case EVENT_2:: ?# D' v  N2 _$ e
  13.                EVENT_2_start=1;
    + B3 R$ B6 d& s/ E/ w6 j
  14.                EVENT_2_count=0;
    / E1 m. ^1 M) B
  15.                EVENT_2_endTime = endTime;2 g: v, q4 w" `# N! j5 H& m
  16.            break;9 K& I' A7 C% h: b
  17.        }  d/ J6 Q" ]  r  y+ d
  18. }
复制代码
  Z0 F7 p4 E8 M- _0 F) w
EVENT的计时,放在Timer3的中断里面:
& e  c* q$ |7 n& j# y到了EndTime以后,则置位EVENT标志
" z# X: H* a6 h- ^$ S8 |) [9 y3 a' O& S$ ]
  1. /* USER CODE BEGIN 1 */3 z" \9 j! }8 x5 a9 O) H, z. s+ I4 ]
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)0 Z& a1 B; h0 G
  3. {) I; c4 N, j. o8 s, X' c5 R4 C
  4.     if (htim->Instance == htim3.Instance)   //---Timer3 中断入口 ---------1 {1 M$ @! `8 m
  5.     {/ T" l% c- |. _; J, x; C
  6.             newEventCount();
      e( s. h# c) E3 d
  7.     }% y# N8 t: _& ^
  8. }
复制代码
  1. //------------------------------------------------
    + X1 F! _! u% L+ O2 c' a
  2. void  newEventCount()
    # p+ ^8 Z7 c/ X* u
  3. {% C) U% v# ]# }0 l7 f1 X
  4.    if(EVENT_1_start); n- H. v8 @* h8 n
  5.    {
    ' J) ^* }8 L$ N: \5 K
  6.            EVENT_1_count++;
    + Z0 k$ N1 B4 m
  7.            if(EVENT_1_count >= EVENT_1_endTime)
    # \1 K$ l. a0 Z+ a4 j
  8.            {: c5 M9 r" F" `( E1 |  O* F( `
  9.                    EVENT_1_start = 0;
    + r* ~7 d, G$ g9 j* ~
  10.                    EVENT_1_count =0;6 G+ C. |2 ]  Z0 k* B- W8 `/ e
  11.                    newEVENT_id = newEVENT_id | EVENT_1;- ~: P- Q6 r( Q! \0 b" h2 m/ M
  12.            }
    + y# Q9 |1 [% ?7 \7 @2 K0 h9 y
  13.    }
    6 g) i6 w4 T% e
  14. 9 }7 a$ I5 W+ S% F* x) b3 ?$ K/ i3 J
  15.    if(EVENT_2_start)
    + I& R: ~3 G5 n; y8 Y
  16.    {' l! [/ i8 j# W0 H
  17.               EVENT_2_count++;
    1 B- ?3 o# t3 [8 `4 J" y1 K
  18.               if(EVENT_2_count >= EVENT_2_endTime)2 s8 R: O: C3 W" h
  19.               {
    $ G! }& l/ ~+ D3 Z. e! N3 a
  20.                       EVENT_2_start = 0;
    ( c3 r- G$ k. N5 g7 R9 D
  21.                       EVENT_2_count =0;3 ?5 W4 Y0 B8 q+ R( I
  22.                       newEVENT_id = newEVENT_id | EVENT_2;
    # m( G( `+ ]! R( B
  23.               }
    + R! O: c" r- M$ K! ?. g* K
  24.    }
    2 {- @( J8 W1 }) x
  25. }
复制代码
这样的话,我们开启一个EVENT,来指示系统是否正常运行,就很简单了,下面的简单代码就实现了:- M6 k4 N' I* e: m; d- o) t! u$ x9 l
  1. $ Y  Y  O$ t/ u1 G+ f# U" c
  2.                 //--LED1 Indicate the system running-------7 E/ V" d8 c0 ^( [4 M- I+ Y! b
  3.                 if( newEVENT_id & EVENT_1)
    . ^7 X2 z5 G! H- n; w% D
  4.                 {
    2 V% G4 J, B8 l/ L1 g7 W
  5.                         newEVENT_id = newEVENT_id & (~EVENT_1);
    6 C: [8 m2 s' \& p* ?3 r1 b
  6. + B9 y) i" E, |1 L, F/ o2 ~8 j! @
  7.                         LED1_status = LED_FLASH_oneTime;
    ( t) t4 b5 x9 z
  8.                         LED1_FLASH_count=0;
    % F5 p; ~' o4 b% g
  9. % b# g' h. q% E/ D. `
  10.                         newEventStart(EVENT_1,  2000);
    6 w1 X, _/ v4 k0 G* f
  11.                 }
    ) [  u5 ~- d. w4 \
复制代码
: E/ Z; @8 [8 z, t
2,串口的接收$ c# G& `: ^' U
串口接收按以下思路进行:* N- r7 r+ R; _* w5 w+ N5 O
1,打开串口接收中断,每接收到一个字节即中断一次;
6 o4 A% C  j+ D6 }2,在中断里,把收到的字节移入接收数组里,同时启动一个EVENT,如果不断的有新的字节收到,即不断进入中断,即不断重新启动EVENT;. n+ s% g- ?, I+ J
3,当没有新的数据进来的时候,EVENT会不断计数到终止;
* w0 A' e1 H5 y- q3 W4,EVENT计数到终止的时候,会置位串口收到数据的标志;% b" N1 m! y, ]4 X" i0 Q
5,在主程序里面处理收到的数据;
) Q) n  v5 R! W) j- [8 N这样串口接收的好处,不需要知道来的数据是否有特殊标志、是否有特殊长度,它实际上是判断如果6MS没有新的数据,即表示当前数据接收完毕。' H5 S0 C/ R' q5 o% z: M

+ q* D. D9 x  ]- U8 Y
  1. HAL_UART_Receive_IT(&huart1, aRxBuffer1, 1);          // Enable the USART1 Interrupt
复制代码
  1. //------------------------
    ; n1 Q  R7 [4 w/ ~, j
  2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)8 x, g6 Y' X4 g. ^% j5 G7 L. K
  3. {  S5 [5 l  K( |6 S
  4.    //----UART1收到1个字节后 中断后来到这里----------/ m$ V* P: x0 V0 P( @+ x
  5.    if(huart->Instance == huart1.Instance )8 V; r! f. ^; w% N* f! c' U
  6.    {
    # y7 u1 w* M* Y
  7.            UART1_received =1;   //--设置UART1收到数据的标志
    1 G6 {: P- q, \/ ?
  8.            UART1_receiveData[UART1_receive_len] = aRxBuffer1[0];  //--把数据放在UART1接收数据的数组里- g/ M# N7 v3 z* g3 U5 R5 s
  9.            UART1_receive_len++;4 u1 E" g8 R. ^% o
  10.            if ( UART1_receive_len >= UART1_receiveBufLen)
    0 c; B9 O" J# I
  11.            {( X/ R- K/ _5 b1 A
  12.                    UART1_receive_len=0;
    7 e% l" l9 X2 h
  13.            }
    : w; h* n$ {6 T- M" Q( H9 d
  14.            UART1_receive_count=0;  //--清零收到数据的计数,该计数在TIMER3中断里面累加,如果累加到6,则认为这次串口接收数据结束$ t2 h8 t2 x2 N7 k5 ]
  15.    }
    + B) Q, Y# `) j6 [% D2 X( i
  16. }
复制代码
  1. /* USER CODE BEGIN 1 */( @# Y6 a6 z; j
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    ; H" w, P( y$ Y
  3. {3 Y& m( z% O# [) R3 q
  4.     if (htim->Instance == htim3.Instance)   //---Timer3 中断入口 ---------/ B4 i, j$ \  J( O7 a$ H
  5.     {  F) i5 g& n' l3 x+ [
  6.             LED1_FLASH();
    . k$ I5 f9 [, y1 o0 m
  7.             LED2_FLASH();
    % @, r$ {" J+ \6 B! E7 l
  8. 6 k5 p; o5 ^2 ?
  9.             newEventCount();
    ! n1 y* \0 @7 E& k: x

  10. 4 K5 x7 ~6 I7 e' h
  11.             HAL_UART_ReceivedCount();
    9 c0 k! {/ D- {' x6 {

  12. ! g4 D1 t0 ?) O. s7 g
  13.             //HAL_I2C_ReceivedCount();8 z3 @9 g' Z; y& z; W3 V( z7 I
  14.     }. _7 A& w4 a; A+ D2 {
  15. }
复制代码
  1. //-------------------------------
    9 G. E! I' s! }4 K/ E
  2. void HAL_UART_ReceivedCount()
    4 j+ P4 |' p, B9 b- J5 C
  3. {
    + ~7 V5 O, F- i0 _. J
  4.     //---如果UART1收到了数据,则计数累加,到6表明UART1串口接收结束------
    6 m% a2 i; G) @3 x7 N0 p  w
  5.     if ( UART1_received )2 ?. n& d6 z3 f' k# x$ ^" {
  6.         {
    * q& I: b1 X' j$ v
  7.                 UART1_receive_count++;7 L2 D' }3 P* z: H' a. O: n1 Z/ m
  8.                 if (UART1_receive_count >= 6)   //---Default is 62 c) J+ A8 Y1 v" S* N  H) l
  9.                 {
    7 ]7 U6 X3 Z$ I. N; ^# }6 X/ o
  10.                         EVENT_DO_UART = EVENT_DO_UART | EVENT_uart1_Received;1 Z  x4 A1 z6 x- L, ^( J6 A
  11.                         UART1_received=0;0 j$ Q! ^) S0 _& t: h( \( v# a; S5 {
  12.                         UART1_receive_count=0;
    : W8 i' D9 z7 u  x
  13.                 }- G: |* Z: a) A
  14.         }8 y1 @$ X; [  C$ P
  15. }
复制代码

  Q$ ]" Q* @$ a/ V* Y. ?            
  1.                //----UART1 Received Data Completed-----------------------------------
    1 E/ W/ H- T. X' Z/ d
  2.                 if(EVENT_DO_UART & EVENT_uart1_Received)
    9 J% A8 {- X9 O
  3.                 {$ l; Z& T% M. p
  4.                    EVENT_DO_UART = EVENT_DO_UART & (~EVENT_uart1_Received);7 F" u. {+ f5 O* T$ g6 F
  5.                    dtk_uart1receivedData(UART1_receiveData, UART1_receive_len);
    8 ~: o7 [3 @% ?- c8 G
  6. 9 @9 [( h: J  l# N
  7.                    UART1_receive_len=0;
    ( E' W4 D& U4 r6 L$ M$ p& o$ v" |
  8.                 }
    / |+ Q! J7 T- i1 A. t  }  O1 V! ^& G
复制代码

: o+ u0 b& r3 a; Y4 u3 V! C% y5 C
. k- n$ X- o) v- c" J9 A
收藏 评论0 发布时间:2021-11-12 23:01

举报

0个回答

所属标签

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