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- ]
- while(1)2 B- s- U8 Y7 g7 @' a* D
- {
2 O' v- z2 g! k' l6 T - if( newEVENT_id & EVENT_1)
% O* W, H4 v0 ^$ C- \6 h& E. X A - {: [5 B0 a' G6 v
- newEVENT_id = newEVENT_id & (~EVENT_1);! w$ ?# V1 H# a# F; S( x* p
b8 }) r {: }4 v7 r- newEventStart(EVENT_1, 2000);) u1 K: R% m: [: H; ] d: B
- }7 q( B5 c2 ]7 J
/ c* F1 s9 F `- if( newEVENT_id & EVENT_2)2 s2 w C( a: N) Z L
- {! b i: ]. m F2 H; `
- newEVENT_id = newEVENT_id & (~EVENT_2);
! N8 {" A$ ^6 S - 9 ~, D9 t. o3 x1 J% @4 H
- newEventStart(EVENT_2, 3000);
- h/ y. ~3 w+ T- _% W% E$ p - }3 [9 t3 _* q9 W/ W# R
- }
复制代码- //-------------------------------------------------2 w' h' W8 W: c- O7 X& e& Z
- void newEventStart(uint32_t inputID, uint16_t endTime)
9 k$ k0 Z' ], ]0 F; Z - {
( I4 e: H, P$ G' ]- s - switch(inputID)) Q# a$ u% ^( \
- {
) _1 @' \* F5 Y7 x - case EVENT_1:0 U& P1 L4 y3 s6 |) a
- EVENT_1_start=1;( r, F) l7 d) h9 |5 J/ c2 i5 O p
- EVENT_1_count=0;, |9 g& W3 z6 b) `& p
- EVENT_1_endTime = endTime;
4 U* X- b8 i, R. |$ r8 V W - break;
$ z* f" L( K6 k( O; a1 n0 H$ `$ e - , ]; w5 S3 G+ G! B3 k; A" P' e
- case EVENT_2:
1 t1 g1 T8 _4 J, Q" U5 x - EVENT_2_start=1;
! o M$ d/ Y$ @* y! v - EVENT_2_count=0;, q5 b2 B1 }/ S- R% D6 k
- EVENT_2_endTime = endTime;- M1 F" H6 g8 P4 ?8 s' [
- break;) y' P( m4 J. D
- }/ J, m1 V* u8 w5 L; }: T7 x2 _% ~; B! e
- }
复制代码 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
- /* USER CODE BEGIN 1 */
/ h9 \: V; M( j - void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)# J5 l7 U' X' x4 p
- {2 B) w# u% L6 Z
- if (htim->Instance == htim3.Instance) //---Timer3 中断入口 ---------7 A2 p8 | b. o: ~
- {
, j8 {2 h( j' v" L J9 z; U7 W/ X - newEventCount();
, q# \6 z& l q8 |: w/ j- y6 @4 q1 H - }
, [8 o# e4 o* X. T9 P+ j* K - }
复制代码- //------------------------------------------------& R9 f5 I, C9 N% Q4 u2 e" S
- void newEventCount()
3 J" c7 U" Y, d/ o+ j) k# S5 N- u - {: | i7 C3 K+ R; h5 s* O
- if(EVENT_1_start)
. K" N6 @: D- W3 R - {2 \% w. w' W# t" ?7 J3 V1 h
- EVENT_1_count++;
) t' r' t8 @# X/ l, v! J* \9 O - if(EVENT_1_count >= EVENT_1_endTime)+ T# ~3 E7 { Z E
- {9 z- v/ e% b1 L, O& g* _8 T, ~
- EVENT_1_start = 0;$ D7 L; B# }. l" w8 E" o" {: _
- EVENT_1_count =0; y: `+ n7 j z: {+ |
- newEVENT_id = newEVENT_id | EVENT_1;! U4 x, V5 C! {. O# i* z' f* g! b
- }5 z' W* D+ x. \/ Q8 y
- }3 [. K6 e- n+ o0 Q/ P
/ \5 ?. f+ h( q0 y( W) ^. J- if(EVENT_2_start) M# w4 t! y8 @6 ^1 `
- {
& V( w4 S3 B4 S4 n1 s1 j) _: v - EVENT_2_count++;/ O# I# t0 E! w, G; C
- if(EVENT_2_count >= EVENT_2_endTime)
* I+ M; \7 W0 U$ b) `3 ? - {
5 z7 O0 |2 q+ y3 Y7 O - EVENT_2_start = 0;
* D" b, m* `+ X0 O6 g- K/ K7 D - EVENT_2_count =0;' j O% `; F" }+ K
- newEVENT_id = newEVENT_id | EVENT_2;
- v6 E, c6 |7 W7 X8 d - }2 e$ c2 O) x! f& }7 x2 p& i
- }8 y3 H" T! c2 I4 j$ R% g
- }
复制代码 这样的话,我们开启一个EVENT,来指示系统是否正常运行,就很简单了,下面的简单代码就实现了:; f3 a: R# J: z" s: G/ a; a
4 ]8 \- X$ p* U7 F6 _- //--LED1 Indicate the system running-------% }9 {" Y. |0 A4 x! ?
- if( newEVENT_id & EVENT_1). o- q/ S, R$ L9 ^
- {1 `* ~8 N0 U5 s& s0 y# ]! W+ ~
- newEVENT_id = newEVENT_id & (~EVENT_1);+ i/ l+ l0 C% t ^
; i& T+ S. C/ L& N' s- LED1_status = LED_FLASH_oneTime;
. i; v [9 ?$ D - LED1_FLASH_count=0;" r* w5 U O Q& g+ ?+ y+ F' q' q6 u
% \0 w4 R$ l I0 ^9 D- `- newEventStart(EVENT_1, 2000);
$ c* w' N* ] I0 |) [ - }
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
- HAL_UART_Receive_IT(&huart1, aRxBuffer1, 1); // Enable the USART1 Interrupt
复制代码- //------------------------- t. L5 |. c- P; e0 g
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)2 S: I; z! j3 B, e0 ^- n* d0 e
- {
2 R v6 z. i. d" V5 [ - //----UART1收到1个字节后 中断后来到这里----------$ u4 O* x; |' q5 g( Z
- if(huart->Instance == huart1.Instance )1 T8 ~" ?1 `5 T1 u' s+ S
- {$ K+ p7 G' _8 f% o: {- z, {9 }
- UART1_received =1; //--设置UART1收到数据的标志
/ P. x7 q5 I- V/ o% ~- V' z - UART1_receiveData[UART1_receive_len] = aRxBuffer1[0]; //--把数据放在UART1接收数据的数组里
4 u0 ]7 w9 A; j6 O" U8 q, g - UART1_receive_len++;
- B) X, r$ Z; q - if ( UART1_receive_len >= UART1_receiveBufLen)
' q8 V& Q r/ i( \/ C' q - {
0 F. Y3 h2 X, ^& ^3 Y. N - UART1_receive_len=0;
7 K$ F% s4 I) ^0 z" |# z6 \9 [9 U - }
# j$ ]! C# n. x. w - UART1_receive_count=0; //--清零收到数据的计数,该计数在TIMER3中断里面累加,如果累加到6,则认为这次串口接收数据结束
/ r( m, \. j# T0 x/ ~$ Y8 _& |+ ^ - }
% b5 H( x2 S! P z3 j8 N - }
复制代码- /* USER CODE BEGIN 1 */3 w" `, M- `; y: j& M1 \
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
" g2 S2 P/ Z; [8 M - {
$ A/ g$ V) u- r G( \! |0 |5 ] - if (htim->Instance == htim3.Instance) //---Timer3 中断入口 ---------, A- X% v4 x# D$ l1 @. _
- {
+ J, q; y9 b3 T- X2 P, N - LED1_FLASH();
& a$ \* x- M$ R& k3 T0 @7 Z7 g - LED2_FLASH();! l% y- |7 q4 m- A, g
- 6 e& {6 A% D' P. |" `! A
- newEventCount();. S$ A& |* _6 p( o3 ~; V
- 6 g' z+ ?& T6 {5 C# Q, s+ R
- HAL_UART_ReceivedCount();
! P" B5 ?! ]; C: h! }+ o* W/ p
$ b: R' c& ~' d* d$ m" \- //HAL_I2C_ReceivedCount();
6 R. N7 m" i3 R8 Q" }: o. `" v - }9 j0 E, x) F m* D; M
- }
复制代码- //-------------------------------* j7 H$ Y, x& X2 P6 z5 X( h
- void HAL_UART_ReceivedCount(): Q2 n" ` ~) l @+ \
- {+ f) b, Y% \: Y, I8 b+ Y: E
- //---如果UART1收到了数据,则计数累加,到6表明UART1串口接收结束------
2 c! o- L' C* I" m - if ( UART1_received )+ x$ } }: t7 V
- {
+ |" V @8 E! w - UART1_receive_count++;
6 y+ t3 Q* i, W# B4 ]7 ]) y - if (UART1_receive_count >= 6) //---Default is 60 X' H7 _; G. h0 j
- {
' N, \" P6 b* K, ? - EVENT_DO_UART = EVENT_DO_UART | EVENT_uart1_Received;# r; o9 U! f. ~! m( l
- UART1_received=0;" |- l4 F6 ^$ k, y7 b
- UART1_receive_count=0;$ a6 u; n- |, g, l+ \5 S
- }
& S, u$ [- M- y) o Q - }
^/ z9 c$ v r* I |; X3 ` - }
复制代码 : [4 D+ m6 ]9 t) a& w" {6 }
- //----UART1 Received Data Completed-----------------------------------( E; X5 `1 z5 W( J3 q
- if(EVENT_DO_UART & EVENT_uart1_Received)
1 W H/ } A# i& x: u - {
( O+ d, x: ?- D! x' O - EVENT_DO_UART = EVENT_DO_UART & (~EVENT_uart1_Received);
* k. }: v2 f6 O7 g) p: b; U - dtk_uart1receivedData(UART1_receiveData, UART1_receive_len);
3 q! T3 u0 k& t+ L0 F
+ A% T, Y6 m/ \3 m8 f- UART1_receive_len=0;; ?9 D0 N( O' Q: w2 }
- } {. |1 X! ]0 x$ r4 J. b1 W2 q
复制代码 ; N; V/ z' I9 b/ ^/ _ s& J$ A
2 _; k. w) i- e7 f0 ] |