1,系统EVENT的实现
/ G# B6 @6 H# [- f本项目是一个简单的系统,在这个项目中,我们采用了一种Timer3中断计时,时间到了以后,置位EVENT标志,然后再在主程序执行的方案。" ?% ~& v" |- v0 e5 K
- ~- z0 j* Q6 c0 N. `5 L5 w# Q1 t! i
- while(1)
1 e% O3 T/ d/ j# F" ? - {
% P4 V% \/ G( u; Y- t: } - if( newEVENT_id & EVENT_1)
. O$ ?; r5 b" N2 _ - {. e* F1 l$ F5 z
- newEVENT_id = newEVENT_id & (~EVENT_1);
N! ^0 s+ ]7 Y7 P0 N% f5 P5 I1 { - " ^& C& |/ I, G T$ I
- newEventStart(EVENT_1, 2000);
; Y, b* `# c& K# u2 d4 `8 @' c - }
n! y* F0 R2 @( t/ o5 Z
2 K5 r Z8 y7 E) e2 U9 K5 _- if( newEVENT_id & EVENT_2): g" C+ F) A, ^/ }
- {5 m% Y+ D6 u$ ?6 }$ H. S
- newEVENT_id = newEVENT_id & (~EVENT_2);9 p- A O5 E- |4 k: Z7 h$ U$ A
* M1 F9 p$ H& T' v- newEventStart(EVENT_2, 3000);
# V# t/ A1 R& D1 v - }& D. n" b6 }) p
- }
复制代码- //-------------------------------------------------
; n1 C( H$ S: y6 s% { - void newEventStart(uint32_t inputID, uint16_t endTime). v t6 x4 `- S0 l7 v
- {
0 k' x8 z* p- B2 v - switch(inputID)
+ `# t9 J* U$ i) H% I- \8 ]. E - {) b! X. x1 I( l
- case EVENT_1:4 h- b$ t& ]. u" n0 N- Y
- EVENT_1_start=1;0 {* Z4 Y2 U" J
- EVENT_1_count=0;
" m# I# [' n! l# I - EVENT_1_endTime = endTime;
- h2 _6 m/ r- H- d) {6 B4 }) e - break;8 H: } G, X3 t: t z
- / \; x8 u" C* S) x# w7 `# U4 A" D+ a
- case EVENT_2:
' y/ K! ` g9 W D: o+ t$ X - EVENT_2_start=1;
* t1 p; Q+ R5 I5 ^1 |7 c; @/ a - EVENT_2_count=0;, Y5 W9 Z1 ^6 @$ A+ J, D
- EVENT_2_endTime = endTime;
L- t9 Y N$ J - break;( y$ v- h- w" ?& T
- }) ]) @/ W! f( S7 J+ h# H
- }
复制代码 ( A1 R5 v( W% j( G) U+ S# F
EVENT的计时,放在Timer3的中断里面:
u; K8 Z0 X. [到了EndTime以后,则置位EVENT标志
" \1 ^& E3 H5 A( t3 K4 w
3 E5 J& U( {" f. G7 `" U- /* USER CODE BEGIN 1 */+ q" k; Y' _- x) [! }+ \) @
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)8 N6 E; X- q) E+ f
- {3 ]5 m/ A n0 l5 W0 H& K, u
- if (htim->Instance == htim3.Instance) //---Timer3 中断入口 ---------# _4 `% g& G: R& M+ H& R) e5 T/ q
- {0 r* _, {, C$ Z* I; g
- newEventCount();
! r, b$ U8 |! I - }
s9 ?: A. m; E+ J4 H - }
复制代码- //------------------------------------------------' f3 D/ b3 V. K1 R$ A) F
- void newEventCount()5 u" `* F7 Q- ~
- {
; p9 _' g$ |/ p& @% M) E( r$ R# p - if(EVENT_1_start)
' \# K- _5 q; D; u" ? - {
& B" x0 q* p2 K b; P* p: r - EVENT_1_count++;9 K7 N4 a8 f7 }! K4 ?- J
- if(EVENT_1_count >= EVENT_1_endTime)) b+ [/ d& S/ b; W& ^
- {
; \5 z1 G; h6 x; p - EVENT_1_start = 0;3 t0 b! Z. [% j+ k6 u, w: A
- EVENT_1_count =0;; [ ]" x5 X8 t" Q1 O. j( T9 X# W
- newEVENT_id = newEVENT_id | EVENT_1;
+ d; }4 O- ~% a8 d6 x% `% \% g4 V0 s - }
+ r5 S1 ~8 ?: F z7 M1 ` - }
& @. Z t! Y' f$ p# Y% k - 1 M8 R, S \6 u$ |: V7 F
- if(EVENT_2_start)/ J+ r. b0 I5 t/ d R" \
- {
3 t& ~/ C f* C4 }, j* c - EVENT_2_count++;
) R, L7 N5 u( n/ J. _8 | - if(EVENT_2_count >= EVENT_2_endTime)
7 N) n" _2 g' \$ o( y - {- m1 w$ ]: P+ e7 ^* v' V
- EVENT_2_start = 0;
8 M* C7 r% [# Z' G& f1 W8 j - EVENT_2_count =0;
4 L( ~& u$ @8 b8 D - newEVENT_id = newEVENT_id | EVENT_2;
) @# u1 _1 P t o/ b5 v - }
3 A& ?* H/ D5 o - }" `, u+ H2 A7 H/ C
- }
复制代码 这样的话,我们开启一个EVENT,来指示系统是否正常运行,就很简单了,下面的简单代码就实现了:
$ X. ?! Z' p( ~2 W) y: @3 g s- v- ; n" d2 d, X, ~
- //--LED1 Indicate the system running-------; I- I( \4 @# W# o$ P
- if( newEVENT_id & EVENT_1)
5 m( j$ r, P# t( Q9 ?, p& H - {! l% l* k8 A6 g$ u
- newEVENT_id = newEVENT_id & (~EVENT_1);
) M3 u' f$ \9 d' \2 |; B - 5 p4 P2 V! F$ d9 Q
- LED1_status = LED_FLASH_oneTime;
0 E, b% S @! R- a" Z r" e. D - LED1_FLASH_count=0;" ^% Z4 `* ?) a- T; V
! {2 n2 g* m+ [- newEventStart(EVENT_1, 2000);
Z6 v7 `, c6 B% s - }: z. K5 K; u8 N: D7 b' y
复制代码
" L+ U }# \/ n. I: u2,串口的接收
7 B7 i' |7 ]# @1 @串口接收按以下思路进行:
2 J; R# T+ _, @2 F" y8 T1,打开串口接收中断,每接收到一个字节即中断一次;8 [0 Q S! W1 F
2,在中断里,把收到的字节移入接收数组里,同时启动一个EVENT,如果不断的有新的字节收到,即不断进入中断,即不断重新启动EVENT; N% i" v6 o' i" M& s% W
3,当没有新的数据进来的时候,EVENT会不断计数到终止;6 H2 j0 @$ v1 {" D0 d( ~) l
4,EVENT计数到终止的时候,会置位串口收到数据的标志;; _: y7 T) ^$ T4 n# o
5,在主程序里面处理收到的数据;* j3 O0 S- M8 w
这样串口接收的好处,不需要知道来的数据是否有特殊标志、是否有特殊长度,它实际上是判断如果6MS没有新的数据,即表示当前数据接收完毕。
3 C' j8 T2 r, g# c, P2 s) f# k U- u3 I6 W4 \2 J. O4 K
- HAL_UART_Receive_IT(&huart1, aRxBuffer1, 1); // Enable the USART1 Interrupt
复制代码- //------------------------
) }7 ~: F( G q# O; ] - void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)3 R1 q, O! S4 u; Y& U- @- A+ h
- {' l) c( ]# h# L2 O
- //----UART1收到1个字节后 中断后来到这里----------
) y4 K r2 ?" a - if(huart->Instance == huart1.Instance )* Z( G* W! x O- R6 z; t4 s" ]
- {2 e" V+ |/ m8 q9 g6 Q. ^/ Z
- UART1_received =1; //--设置UART1收到数据的标志4 U/ q8 I+ v7 }
- UART1_receiveData[UART1_receive_len] = aRxBuffer1[0]; //--把数据放在UART1接收数据的数组里& T0 p/ H5 S% Z/ w; A3 u
- UART1_receive_len++;
W" E- u2 z: P; e& n5 H - if ( UART1_receive_len >= UART1_receiveBufLen)/ g: x5 w( N p9 w- U
- {
! D' e u2 p1 { - UART1_receive_len=0;# g( _, e. ]& t' L+ p) }- x, Q+ f \
- }
9 m2 @6 Y- c/ u( M) G \ - UART1_receive_count=0; //--清零收到数据的计数,该计数在TIMER3中断里面累加,如果累加到6,则认为这次串口接收数据结束/ ]" g! C5 e% {2 N/ ?
- }% m0 V" X4 E/ v7 c- m. h
- }
复制代码- /* USER CODE BEGIN 1 */
3 Z6 A: N }2 v* H; I* {9 W - void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim). L9 b# N0 g+ `
- {
% Q) v6 O. F' }: b/ _ - if (htim->Instance == htim3.Instance) //---Timer3 中断入口 ---------
0 I* |) h% W* q, U& N6 l5 d - {/ d( F# p, M* k F* T. s9 g
- LED1_FLASH();
' O# U6 s; }* Y% X, _& S - LED2_FLASH();
1 d6 e% ~1 C! x& N* P& X
) ?8 y3 K3 y; q T- f- newEventCount();
" i, y0 }; |$ J3 h - . \3 }- m) a# [' ]# o7 ]
- HAL_UART_ReceivedCount();/ T9 S8 S1 ]6 v0 j( _' \
2 K+ Z& P# Q I' c% X% f* E- //HAL_I2C_ReceivedCount();
, J$ {8 x. r$ R$ d7 ^) h& ? - }
2 ~# ^6 l. N" l, a. @: `8 G - }
复制代码- //-------------------------------
5 ^7 I( ~/ q/ @! q) z% B - void HAL_UART_ReceivedCount()
0 @3 D4 i7 m: g7 s0 @0 H$ v3 q/ | - {6 P9 w0 [- _- o; Z) O
- //---如果UART1收到了数据,则计数累加,到6表明UART1串口接收结束------4 \; [1 C6 W7 g
- if ( UART1_received )0 t+ G# T; u9 [" g) z
- {
1 X, T" d1 |/ V$ d( ]) i - UART1_receive_count++;
& I# U9 H# ~3 Y, W* s4 u - if (UART1_receive_count >= 6) //---Default is 68 e4 w+ R8 n" W4 D
- {" E6 r% [3 E; u
- EVENT_DO_UART = EVENT_DO_UART | EVENT_uart1_Received;! l% D9 `1 ]4 N0 W( p/ ?
- UART1_received=0;
0 w3 d8 m0 W8 N; b& ]$ C( _ - UART1_receive_count=0;7 Y; M5 k+ g# a7 _4 ?
- }
: T) J6 ^3 f3 N& N" w, X - }" @( ]" M9 ?1 k- F* @$ k
- }
复制代码
2 [* Q0 Q% R& \4 T8 i% P5 Z+ j - //----UART1 Received Data Completed-----------------------------------
0 C+ ]# C6 O0 v* e5 c( x \4 N - if(EVENT_DO_UART & EVENT_uart1_Received)
- |# p: U' Q' [" |/ G - {
4 a# M) ~8 i" r% B - EVENT_DO_UART = EVENT_DO_UART & (~EVENT_uart1_Received);# p, d/ D' v; ~% v" ~( O% [
- dtk_uart1receivedData(UART1_receiveData, UART1_receive_len);* ~0 K2 f1 C: |: k% Y
1 d3 w# T& Q0 [; |: z7 D u- UART1_receive_len=0;2 i6 c. D# N4 ~+ O
- }0 Z/ k9 G4 l3 k) W: i
复制代码
: Y! Q2 |1 i4 r3 T, D! w6 @9 H7 a. Z- Q, k% x4 Q, @- y
|