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

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

[复制链接]
STMCU小助手 发布时间:2021-11-12 23:01
1,系统EVENT的实现
/ x/ S  C  g5 O% l本项目是一个简单的系统,在这个项目中,我们采用了一种Timer3中断计时,时间到了以后,置位EVENT标志,然后再在主程序执行的方案。
' b. b- ^6 P  ?* f! q. N2 ?: N# b. M, p. [. c) \1 R& e- ]
  1. while(1)2 B- s- U8 Y7 g7 @' a* D
  2. {
    2 O' v- z2 g! k' l6 T
  3.                 if( newEVENT_id & EVENT_1)
    % O* W, H4 v0 ^$ C- \6 h& E. X  A
  4.                 {: [5 B0 a' G6 v
  5.                         newEVENT_id = newEVENT_id & (~EVENT_1);! w$ ?# V1 H# a# F; S( x* p

  6.   b8 }) r  {: }4 v7 r
  7.                         newEventStart(EVENT_1,  2000);) u1 K: R% m: [: H; ]  d: B
  8.                 }7 q( B5 c2 ]7 J

  9. / c* F1 s9 F  `
  10.               if( newEVENT_id & EVENT_2)2 s2 w  C( a: N) Z  L
  11.                 {! b  i: ]. m  F2 H; `
  12.                         newEVENT_id = newEVENT_id & (~EVENT_2);
    ! N8 {" A$ ^6 S
  13. 9 ~, D9 t. o3 x1 J% @4 H
  14.                         newEventStart(EVENT_2,  3000);
    - h/ y. ~3 w+ T- _% W% E$ p
  15.                 }3 [9 t3 _* q9 W/ W# R
  16. }
复制代码
  1. //-------------------------------------------------2 w' h' W8 W: c- O7 X& e& Z
  2. void  newEventStart(uint32_t   inputID,  uint16_t  endTime)
    9 k$ k0 Z' ], ]0 F; Z
  3. {
    ( I4 e: H, P$ G' ]- s
  4.       switch(inputID)) Q# a$ u% ^( \
  5.       {
    ) _1 @' \* F5 Y7 x
  6.            case EVENT_1:0 U& P1 L4 y3 s6 |) a
  7.                    EVENT_1_start=1;( r, F) l7 d) h9 |5 J/ c2 i5 O  p
  8.                    EVENT_1_count=0;, |9 g& W3 z6 b) `& p
  9.                    EVENT_1_endTime = endTime;
    4 U* X- b8 i, R. |$ r8 V  W
  10.            break;
    $ z* f" L( K6 k( O; a1 n0 H$ `$ e
  11. , ]; w5 S3 G+ G! B3 k; A" P' e
  12.            case EVENT_2:
    1 t1 g1 T8 _4 J, Q" U5 x
  13.                EVENT_2_start=1;
    ! o  M$ d/ Y$ @* y! v
  14.                EVENT_2_count=0;, q5 b2 B1 }/ S- R% D6 k
  15.                EVENT_2_endTime = endTime;- M1 F" H6 g8 P4 ?8 s' [
  16.            break;) y' P( m4 J. D
  17.        }/ J, m1 V* u8 w5 L; }: T7 x2 _% ~; B! e
  18. }
复制代码
7 F3 Q: u: W6 _+ w
EVENT的计时,放在Timer3的中断里面:6 t9 b' D* a& r8 e6 A1 {" o6 B7 @
到了EndTime以后,则置位EVENT标志) }& E# ^% i0 j) H
6 D* W- C7 r- q% N
  1. /* USER CODE BEGIN 1 */
    / h9 \: V; M( j
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)# J5 l7 U' X' x4 p
  3. {2 B) w# u% L6 Z
  4.     if (htim->Instance == htim3.Instance)   //---Timer3 中断入口 ---------7 A2 p8 |  b. o: ~
  5.     {
    , j8 {2 h( j' v" L  J9 z; U7 W/ X
  6.             newEventCount();
    , q# \6 z& l  q8 |: w/ j- y6 @4 q1 H
  7.     }
    , [8 o# e4 o* X. T9 P+ j* K
  8. }
复制代码
  1. //------------------------------------------------& R9 f5 I, C9 N% Q4 u2 e" S
  2. void  newEventCount()
    3 J" c7 U" Y, d/ o+ j) k# S5 N- u
  3. {: |  i7 C3 K+ R; h5 s* O
  4.    if(EVENT_1_start)
    . K" N6 @: D- W3 R
  5.    {2 \% w. w' W# t" ?7 J3 V1 h
  6.            EVENT_1_count++;
    ) t' r' t8 @# X/ l, v! J* \9 O
  7.            if(EVENT_1_count >= EVENT_1_endTime)+ T# ~3 E7 {  Z  E
  8.            {9 z- v/ e% b1 L, O& g* _8 T, ~
  9.                    EVENT_1_start = 0;$ D7 L; B# }. l" w8 E" o" {: _
  10.                    EVENT_1_count =0;  y: `+ n7 j  z: {+ |
  11.                    newEVENT_id = newEVENT_id | EVENT_1;! U4 x, V5 C! {. O# i* z' f* g! b
  12.            }5 z' W* D+ x. \/ Q8 y
  13.    }3 [. K6 e- n+ o0 Q/ P

  14. / \5 ?. f+ h( q0 y( W) ^. J
  15.    if(EVENT_2_start)  M# w4 t! y8 @6 ^1 `
  16.    {
    & V( w4 S3 B4 S4 n1 s1 j) _: v
  17.               EVENT_2_count++;/ O# I# t0 E! w, G; C
  18.               if(EVENT_2_count >= EVENT_2_endTime)
    * I+ M; \7 W0 U$ b) `3 ?
  19.               {
    5 z7 O0 |2 q+ y3 Y7 O
  20.                       EVENT_2_start = 0;
    * D" b, m* `+ X0 O6 g- K/ K7 D
  21.                       EVENT_2_count =0;' j  O% `; F" }+ K
  22.                       newEVENT_id = newEVENT_id | EVENT_2;
    - v6 E, c6 |7 W7 X8 d
  23.               }2 e$ c2 O) x! f& }7 x2 p& i
  24.    }8 y3 H" T! c2 I4 j$ R% g
  25. }
复制代码
这样的话,我们开启一个EVENT,来指示系统是否正常运行,就很简单了,下面的简单代码就实现了:; f3 a: R# J: z" s: G/ a; a

  1. 4 ]8 \- X$ p* U7 F6 _
  2.                 //--LED1 Indicate the system running-------% }9 {" Y. |0 A4 x! ?
  3.                 if( newEVENT_id & EVENT_1). o- q/ S, R$ L9 ^
  4.                 {1 `* ~8 N0 U5 s& s0 y# ]! W+ ~
  5.                         newEVENT_id = newEVENT_id & (~EVENT_1);+ i/ l+ l0 C% t  ^

  6. ; i& T+ S. C/ L& N' s
  7.                         LED1_status = LED_FLASH_oneTime;
    . i; v  [9 ?$ D
  8.                         LED1_FLASH_count=0;" r* w5 U  O  Q& g+ ?+ y+ F' q' q6 u

  9. % \0 w4 R$ l  I0 ^9 D- `
  10.                         newEventStart(EVENT_1,  2000);
    $ c* w' N* ]  I0 |) [
  11.                 }
    8 o: q4 E, M5 K+ t! S0 e
复制代码

( q5 }# |/ ?  M3 Q2,串口的接收
6 e4 M" W6 P$ @" L- g3 H串口接收按以下思路进行:2 {/ }" c, k/ v% P7 D1 Z0 F
1,打开串口接收中断,每接收到一个字节即中断一次;
; C" D" _" A( M- K2,在中断里,把收到的字节移入接收数组里,同时启动一个EVENT,如果不断的有新的字节收到,即不断进入中断,即不断重新启动EVENT;& F8 l& S/ |7 m
3,当没有新的数据进来的时候,EVENT会不断计数到终止;
5 k2 z. N% K& o4 D* O! s4,EVENT计数到终止的时候,会置位串口收到数据的标志;& L1 N5 c/ ^- {0 s' h! \6 y& n
5,在主程序里面处理收到的数据;) h+ {0 I) v. [
这样串口接收的好处,不需要知道来的数据是否有特殊标志、是否有特殊长度,它实际上是判断如果6MS没有新的数据,即表示当前数据接收完毕。
1 T- v3 T2 k; j6 k8 W! _. `9 Z1 Y* N, ^& [7 V6 Q
  1. HAL_UART_Receive_IT(&huart1, aRxBuffer1, 1);          // Enable the USART1 Interrupt
复制代码
  1. //------------------------- t. L5 |. c- P; e0 g
  2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)2 S: I; z! j3 B, e0 ^- n* d0 e
  3. {
    2 R  v6 z. i. d" V5 [
  4.    //----UART1收到1个字节后 中断后来到这里----------$ u4 O* x; |' q5 g( Z
  5.    if(huart->Instance == huart1.Instance )1 T8 ~" ?1 `5 T1 u' s+ S
  6.    {$ K+ p7 G' _8 f% o: {- z, {9 }
  7.            UART1_received =1;   //--设置UART1收到数据的标志
    / P. x7 q5 I- V/ o% ~- V' z
  8.            UART1_receiveData[UART1_receive_len] = aRxBuffer1[0];  //--把数据放在UART1接收数据的数组里
    4 u0 ]7 w9 A; j6 O" U8 q, g
  9.            UART1_receive_len++;
    - B) X, r$ Z; q
  10.            if ( UART1_receive_len >= UART1_receiveBufLen)
    ' q8 V& Q  r/ i( \/ C' q
  11.            {
    0 F. Y3 h2 X, ^& ^3 Y. N
  12.                    UART1_receive_len=0;
    7 K$ F% s4 I) ^0 z" |# z6 \9 [9 U
  13.            }
    # j$ ]! C# n. x. w
  14.            UART1_receive_count=0;  //--清零收到数据的计数,该计数在TIMER3中断里面累加,如果累加到6,则认为这次串口接收数据结束
    / r( m, \. j# T0 x/ ~$ Y8 _& |+ ^
  15.    }
    % b5 H( x2 S! P  z3 j8 N
  16. }
复制代码
  1. /* USER CODE BEGIN 1 */3 w" `, M- `; y: j& M1 \
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    " g2 S2 P/ Z; [8 M
  3. {
    $ A/ g$ V) u- r  G( \! |0 |5 ]
  4.     if (htim->Instance == htim3.Instance)   //---Timer3 中断入口 ---------, A- X% v4 x# D$ l1 @. _
  5.     {
    + J, q; y9 b3 T- X2 P, N
  6.             LED1_FLASH();
    & a$ \* x- M$ R& k3 T0 @7 Z7 g
  7.             LED2_FLASH();! l% y- |7 q4 m- A, g
  8. 6 e& {6 A% D' P. |" `! A
  9.             newEventCount();. S$ A& |* _6 p( o3 ~; V
  10. 6 g' z+ ?& T6 {5 C# Q, s+ R
  11.             HAL_UART_ReceivedCount();
    ! P" B5 ?! ]; C: h! }+ o* W/ p

  12. $ b: R' c& ~' d* d$ m" \
  13.             //HAL_I2C_ReceivedCount();
    6 R. N7 m" i3 R8 Q" }: o. `" v
  14.     }9 j0 E, x) F  m* D; M
  15. }
复制代码
  1. //-------------------------------* j7 H$ Y, x& X2 P6 z5 X( h
  2. void HAL_UART_ReceivedCount(): Q2 n" `  ~) l  @+ \
  3. {+ f) b, Y% \: Y, I8 b+ Y: E
  4.     //---如果UART1收到了数据,则计数累加,到6表明UART1串口接收结束------
    2 c! o- L' C* I" m
  5.     if ( UART1_received )+ x$ }  }: t7 V
  6.         {
    + |" V  @8 E! w
  7.                 UART1_receive_count++;
    6 y+ t3 Q* i, W# B4 ]7 ]) y
  8.                 if (UART1_receive_count >= 6)   //---Default is 60 X' H7 _; G. h0 j
  9.                 {
    ' N, \" P6 b* K, ?
  10.                         EVENT_DO_UART = EVENT_DO_UART | EVENT_uart1_Received;# r; o9 U! f. ~! m( l
  11.                         UART1_received=0;" |- l4 F6 ^$ k, y7 b
  12.                         UART1_receive_count=0;$ a6 u; n- |, g, l+ \5 S
  13.                 }
    & S, u$ [- M- y) o  Q
  14.         }
      ^/ z9 c$ v  r* I  |; X3 `
  15. }
复制代码
: [4 D+ m6 ]9 t) a& w" {6 }
            
  1.                //----UART1 Received Data Completed-----------------------------------( E; X5 `1 z5 W( J3 q
  2.                 if(EVENT_DO_UART & EVENT_uart1_Received)
    1 W  H/ }  A# i& x: u
  3.                 {
    ( O+ d, x: ?- D! x' O
  4.                    EVENT_DO_UART = EVENT_DO_UART & (~EVENT_uart1_Received);
    * k. }: v2 f6 O7 g) p: b; U
  5.                    dtk_uart1receivedData(UART1_receiveData, UART1_receive_len);
    3 q! T3 u0 k& t+ L0 F

  6. + A% T, Y6 m/ \3 m8 f
  7.                    UART1_receive_len=0;; ?9 D0 N( O' Q: w2 }
  8.                 }  {. |1 X! ]0 x$ r4 J. b1 W2 q
复制代码
; N; V/ z' I9 b/ ^/ _  s& J$ A

2 _; k. w) i- e7 f0 ]
收藏 评论0 发布时间:2021-11-12 23:01

举报

0个回答

所属标签

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