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# |
- while(1)! l) S( Y+ B; H/ D8 K4 Q- o
- {
& @3 j4 s# S: Z1 ~ - if( newEVENT_id & EVENT_1)
! u: M6 ~! F7 y# a* y - {
0 K$ H$ f* n8 z2 k - newEVENT_id = newEVENT_id & (~EVENT_1);2 n( y3 q3 T) s4 ?/ G+ V
# \" e( Q7 L2 k- newEventStart(EVENT_1, 2000);3 M. B* G$ f4 V' h( W. }- M
- }
1 J3 f e2 A8 M( L
5 Q2 ~" P$ ~- }- g6 k6 }# v- if( newEVENT_id & EVENT_2)$ J4 e0 }1 q" z0 P7 C% k3 n9 R
- {
% ^& A$ c2 F. T, f: s/ M* u( l: N - newEVENT_id = newEVENT_id & (~EVENT_2);
0 }" O1 l: W1 a9 t% Q - 0 e! d3 B& [2 [! U( c8 s! [
- newEventStart(EVENT_2, 3000);3 U1 Q& P- S i* M8 T
- }
* o% P, `. O! K* }5 v - }
复制代码- //-------------------------------------------------+ \4 t6 R& C. O: B
- void newEventStart(uint32_t inputID, uint16_t endTime), k3 q; T+ s2 c8 g, ^" ^
- {
, K/ H9 a5 S" X \( G" x' d - switch(inputID)! x: q5 {7 } q6 W7 n
- {
1 D- }4 c h# I u/ Y4 g% A y - case EVENT_1:
9 u( U- ~0 D% K T - EVENT_1_start=1;
9 a6 J6 I6 H7 V7 s" u) e; ^' J$ Y7 } - EVENT_1_count=0;1 R) D, l1 z# J! |$ O' E) i, _
- EVENT_1_endTime = endTime;, _: M8 x( ~9 g& U
- break;
/ ^) Q2 `5 | Z" W
3 p( e- V" M. }0 c- r! N- case EVENT_2:: ?# D' v N2 _$ e
- EVENT_2_start=1;
+ B3 R$ B6 d& s/ E/ w6 j - EVENT_2_count=0;
/ E1 m. ^1 M) B - EVENT_2_endTime = endTime;2 g: v, q4 w" `# N! j5 H& m
- break;9 K& I' A7 C% h: b
- } d/ J6 Q" ] r y+ d
- }
复制代码 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$ ]
- /* USER CODE BEGIN 1 */3 z" \9 j! }8 x5 a9 O) H, z. s+ I4 ]
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)0 Z& a1 B; h0 G
- {) I; c4 N, j. o8 s, X' c5 R4 C
- if (htim->Instance == htim3.Instance) //---Timer3 中断入口 ---------1 {1 M$ @! `8 m
- {/ T" l% c- |. _; J, x; C
- newEventCount();
e( s. h# c) E3 d - }% y# N8 t: _& ^
- }
复制代码- //------------------------------------------------
+ X1 F! _! u% L+ O2 c' a - void newEventCount()
# p+ ^8 Z7 c/ X* u - {% C) U% v# ]# }0 l7 f1 X
- if(EVENT_1_start); n- H. v8 @* h8 n
- {
' J) ^* }8 L$ N: \5 K - EVENT_1_count++;
+ Z0 k$ N1 B4 m - if(EVENT_1_count >= EVENT_1_endTime)
# \1 K$ l. a0 Z+ a4 j - {: c5 M9 r" F" `( E1 | O* F( `
- EVENT_1_start = 0;
+ r* ~7 d, G$ g9 j* ~ - EVENT_1_count =0;6 G+ C. |2 ] Z0 k* B- W8 `/ e
- newEVENT_id = newEVENT_id | EVENT_1;- ~: P- Q6 r( Q! \0 b" h2 m/ M
- }
+ y# Q9 |1 [% ?7 \7 @2 K0 h9 y - }
6 g) i6 w4 T% e - 9 }7 a$ I5 W+ S% F* x) b3 ?$ K/ i3 J
- if(EVENT_2_start)
+ I& R: ~3 G5 n; y8 Y - {' l! [/ i8 j# W0 H
- EVENT_2_count++;
1 B- ?3 o# t3 [8 `4 J" y1 K - if(EVENT_2_count >= EVENT_2_endTime)2 s8 R: O: C3 W" h
- {
$ G! }& l/ ~+ D3 Z. e! N3 a - EVENT_2_start = 0;
( c3 r- G$ k. N5 g7 R9 D - EVENT_2_count =0;3 ?5 W4 Y0 B8 q+ R( I
- newEVENT_id = newEVENT_id | EVENT_2;
# m( G( `+ ]! R( B - }
+ R! O: c" r- M$ K! ?. g* K - }
2 {- @( J8 W1 }) x - }
复制代码 这样的话,我们开启一个EVENT,来指示系统是否正常运行,就很简单了,下面的简单代码就实现了:- M6 k4 N' I* e: m; d- o) t! u$ x9 l
- $ Y Y O$ t/ u1 G+ f# U" c
- //--LED1 Indicate the system running-------7 E/ V" d8 c0 ^( [4 M- I+ Y! b
- if( newEVENT_id & EVENT_1)
. ^7 X2 z5 G! H- n; w% D - {
2 V% G4 J, B8 l/ L1 g7 W - newEVENT_id = newEVENT_id & (~EVENT_1);
6 C: [8 m2 s' \& p* ?3 r1 b - + B9 y) i" E, |1 L, F/ o2 ~8 j! @
- LED1_status = LED_FLASH_oneTime;
( t) t4 b5 x9 z - LED1_FLASH_count=0;
% F5 p; ~' o4 b% g - % b# g' h. q% E/ D. `
- newEventStart(EVENT_1, 2000);
6 w1 X, _/ v4 k0 G* f - }
) [ 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- HAL_UART_Receive_IT(&huart1, aRxBuffer1, 1); // Enable the USART1 Interrupt
复制代码- //------------------------
; n1 Q R7 [4 w/ ~, j - void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)8 x, g6 Y' X4 g. ^% j5 G7 L. K
- { S5 [5 l K( |6 S
- //----UART1收到1个字节后 中断后来到这里----------/ m$ V* P: x0 V0 P( @+ x
- if(huart->Instance == huart1.Instance )8 V; r! f. ^; w% N* f! c' U
- {
# y7 u1 w* M* Y - UART1_received =1; //--设置UART1收到数据的标志
1 G6 {: P- q, \/ ? - UART1_receiveData[UART1_receive_len] = aRxBuffer1[0]; //--把数据放在UART1接收数据的数组里- g/ M# N7 v3 z* g3 U5 R5 s
- UART1_receive_len++;4 u1 E" g8 R. ^% o
- if ( UART1_receive_len >= UART1_receiveBufLen)
0 c; B9 O" J# I - {( X/ R- K/ _5 b1 A
- UART1_receive_len=0;
7 e% l" l9 X2 h - }
: w; h* n$ {6 T- M" Q( H9 d - UART1_receive_count=0; //--清零收到数据的计数,该计数在TIMER3中断里面累加,如果累加到6,则认为这次串口接收数据结束$ t2 h8 t2 x2 N7 k5 ]
- }
+ B) Q, Y# `) j6 [% D2 X( i - }
复制代码- /* USER CODE BEGIN 1 */( @# Y6 a6 z; j
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
; H" w, P( y$ Y - {3 Y& m( z% O# [) R3 q
- if (htim->Instance == htim3.Instance) //---Timer3 中断入口 ---------/ B4 i, j$ \ J( O7 a$ H
- { F) i5 g& n' l3 x+ [
- LED1_FLASH();
. k$ I5 f9 [, y1 o0 m - LED2_FLASH();
% @, r$ {" J+ \6 B! E7 l - 6 k5 p; o5 ^2 ?
- newEventCount();
! n1 y* \0 @7 E& k: x
4 K5 x7 ~6 I7 e' h- HAL_UART_ReceivedCount();
9 c0 k! {/ D- {' x6 {
! g4 D1 t0 ?) O. s7 g- //HAL_I2C_ReceivedCount();8 z3 @9 g' Z; y& z; W3 V( z7 I
- }. _7 A& w4 a; A+ D2 {
- }
复制代码- //-------------------------------
9 G. E! I' s! }4 K/ E - void HAL_UART_ReceivedCount()
4 j+ P4 |' p, B9 b- J5 C - {
+ ~7 V5 O, F- i0 _. J - //---如果UART1收到了数据,则计数累加,到6表明UART1串口接收结束------
6 m% a2 i; G) @3 x7 N0 p w - if ( UART1_received )2 ?. n& d6 z3 f' k# x$ ^" {
- {
* q& I: b1 X' j$ v - UART1_receive_count++;7 L2 D' }3 P* z: H' a. O: n1 Z/ m
- if (UART1_receive_count >= 6) //---Default is 62 c) J+ A8 Y1 v" S* N H) l
- {
7 ]7 U6 X3 Z$ I. N; ^# }6 X/ o - EVENT_DO_UART = EVENT_DO_UART | EVENT_uart1_Received;1 Z x4 A1 z6 x- L, ^( J6 A
- UART1_received=0;0 j$ Q! ^) S0 _& t: h( \( v# a; S5 {
- UART1_receive_count=0;
: W8 i' D9 z7 u x - }- G: |* Z: a) A
- }8 y1 @$ X; [ C$ P
- }
复制代码
Q$ ]" Q* @$ a/ V* Y. ? - //----UART1 Received Data Completed-----------------------------------
1 E/ W/ H- T. X' Z/ d - if(EVENT_DO_UART & EVENT_uart1_Received)
9 J% A8 {- X9 O - {$ l; Z& T% M. p
- EVENT_DO_UART = EVENT_DO_UART & (~EVENT_uart1_Received);7 F" u. {+ f5 O* T$ g6 F
- dtk_uart1receivedData(UART1_receiveData, UART1_receive_len);
8 ~: o7 [3 @% ?- c8 G - 9 @9 [( h: J l# N
- UART1_receive_len=0;
( E' W4 D& U4 r6 L$ M$ p& o$ v" | - }
/ |+ 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 |