1,系统EVENT的实现4 u( w- t+ U: l$ V5 v
本项目是一个简单的系统,在这个项目中,我们采用了一种Timer3中断计时,时间到了以后,置位EVENT标志,然后再在主程序执行的方案。
0 u* P; ]2 n& a
# ?& @- C" e" r% ^- {' G0 L- while(1)
( Q- A8 E* N. P - {4 S$ ~2 }# s' u; H+ o
- if( newEVENT_id & EVENT_1)
7 r6 u& ?7 T R5 A7 W - {
& F3 w, Z8 c; v( [% c/ @. x6 ` - newEVENT_id = newEVENT_id & (~EVENT_1);
. Z U9 a: N7 T) O - 1 l) u5 H( J, O7 U- A- N
- newEventStart(EVENT_1, 2000);
. D2 T: l0 P2 C - }
( U+ M: o. H3 m5 i" ]
2 o0 H" W& A$ F+ @- if( newEVENT_id & EVENT_2)+ a# ?+ {% l- l& u
- {) m2 F$ O* I! N1 s# Q" B$ t& s# B
- newEVENT_id = newEVENT_id & (~EVENT_2);
, c& j) W, U8 o4 ^
! U6 n: o9 W+ O z* b- newEventStart(EVENT_2, 3000);$ C0 k! F& x; V5 D! D. [( E+ X
- }
) |% J: ?$ _1 z" E" Z' l - }
复制代码- //-------------------------------------------------
0 \* p' W9 |8 M - void newEventStart(uint32_t inputID, uint16_t endTime)
+ k. _$ d4 c8 Y2 ?) M1 A - {9 l$ [% J# A; A( p* q
- switch(inputID)
' u J6 l# `8 w2 U! R- a - {' M9 k! r9 [1 ]. r# m% [
- case EVENT_1:
/ W3 M8 c; v; V, V$ O9 t - EVENT_1_start=1;) i6 ]+ \& Z9 j% o- p3 O1 o
- EVENT_1_count=0;" a @% A" `% j* ?7 {
- EVENT_1_endTime = endTime;
. q9 k) U8 K. G2 M ^0 w - break;
$ e7 {( y+ I9 J# x: C5 m
" H+ S' }- |3 m. |- case EVENT_2:
9 A. y7 D+ P/ p7 ` - EVENT_2_start=1;4 l# Z* F: \3 C
- EVENT_2_count=0;: t/ P3 x- u% j8 A6 a# F
- EVENT_2_endTime = endTime;
! T n! `* ^) x! i - break;5 J6 C$ X2 ]0 B& Q
- }
4 D. ]; U0 L5 p6 ]& n - }
复制代码 & N- w9 v5 ?8 n3 ?- n
EVENT的计时,放在Timer3的中断里面:; F k4 @2 G8 p6 J" P8 F
到了EndTime以后,则置位EVENT标志- i" }/ H" B4 ?, k% E5 I
1 A2 {- p$ \3 ]
- /* USER CODE BEGIN 1 */
" u6 p$ E$ [' F- M4 d. m - void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
) X6 L3 l) S2 h( R8 E* P% N - {
+ y8 t2 a2 ^( D6 ^. y) }4 i1 o - if (htim->Instance == htim3.Instance) //---Timer3 中断入口 ---------
* C6 |; Z1 L% `. r( M - {
1 T1 }" N* M" q - newEventCount();/ h Z; p4 {4 h' |2 |! j3 r
- }# m0 T$ G$ z2 C- Z
- }
复制代码- //------------------------------------------------
0 h0 o' M0 o3 P0 O/ P8 b - void newEventCount()1 O* V! |3 \" I' W! ~2 k) G
- {4 [. t6 l F' N3 `+ d
- if(EVENT_1_start), u1 [! U" d, S- x! Q5 J
- {
6 S t! y3 u$ K7 ^ - EVENT_1_count++;
* J/ k; J# a7 ~ - if(EVENT_1_count >= EVENT_1_endTime)* I- v3 A9 X/ C
- {' B, M/ a0 R$ R/ |) L4 X/ J) L
- EVENT_1_start = 0;
) j4 ~3 Y' ~( t) a/ J - EVENT_1_count =0;8 H' e& s F7 ]
- newEVENT_id = newEVENT_id | EVENT_1;7 u6 J- y4 s( B5 r2 k
- }
y) w) S6 k$ `) H - }; o& x0 |! ?3 y! H% v
- 5 L/ L, P$ l. _3 W. j$ q! @# f1 i
- if(EVENT_2_start)
; U- D; d! X" r3 \7 X- @, [7 P7 S - {
. c% _' a% y( w- f) y( q& | - EVENT_2_count++;. t6 K! B) @6 f$ e9 z# ?% W% v6 E/ e
- if(EVENT_2_count >= EVENT_2_endTime)
4 p: W0 ?1 @0 q) ^: W T - {
" W( C( g5 N/ u4 j% X; H( z7 ^. G - EVENT_2_start = 0;' O. V2 V9 K1 a6 x/ J, K
- EVENT_2_count =0;) z% W' ?' W+ ~/ [; c! K1 `2 _5 W" T
- newEVENT_id = newEVENT_id | EVENT_2;
6 Y( ] a" o2 a2 @: [% a& j - }# V+ ^8 ]# _4 d, z( l$ M3 e
- }
$ y! }2 R/ Q5 M+ [) U - }
复制代码 这样的话,我们开启一个EVENT,来指示系统是否正常运行,就很简单了,下面的简单代码就实现了:2 X& F0 W8 }/ p. y
' z6 n/ P8 i1 I1 I- //--LED1 Indicate the system running-------
7 F/ ]" X* K' n - if( newEVENT_id & EVENT_1)# y7 P3 e7 U0 m+ e# I: d" g: S& q/ y
- {& x: @ n# L& \# C) Z8 o
- newEVENT_id = newEVENT_id & (~EVENT_1);4 |' r$ }& p, p2 X( P5 Q7 \* w
- / `* v1 x; d1 A2 ~1 |, i; @
- LED1_status = LED_FLASH_oneTime;7 C! F( H* ^6 h4 C0 R6 @8 K& [
- LED1_FLASH_count=0;- }) E- g/ h H# t& X( m6 w5 d
0 G' ~+ G! i8 P1 k7 s; \- newEventStart(EVENT_1, 2000);
# C- D& ?7 a- e7 u' j) @! ~3 } - }* n' A8 n# \2 R5 p$ A9 c/ X
复制代码 ) u- `: X, M1 y; v' D
2,串口的接收( M9 q2 I1 |5 o0 P* e
串口接收按以下思路进行:0 j, @) D$ ~6 v5 f. g
1,打开串口接收中断,每接收到一个字节即中断一次;5 ~2 e ~) b9 ~7 @
2,在中断里,把收到的字节移入接收数组里,同时启动一个EVENT,如果不断的有新的字节收到,即不断进入中断,即不断重新启动EVENT;
% v7 T" {1 U. k, K& ^3,当没有新的数据进来的时候,EVENT会不断计数到终止;4 M0 u, E. W6 G K
4,EVENT计数到终止的时候,会置位串口收到数据的标志;
' t- B6 [# q2 u1 V! w+ A2 I/ h5,在主程序里面处理收到的数据;) F2 a6 O1 W6 n" k6 Y, p
这样串口接收的好处,不需要知道来的数据是否有特殊标志、是否有特殊长度,它实际上是判断如果6MS没有新的数据,即表示当前数据接收完毕。
" U5 X: M1 s3 y* A, m1 E+ z, h$ k$ c0 ]) U" W' K6 N
- HAL_UART_Receive_IT(&huart1, aRxBuffer1, 1); // Enable the USART1 Interrupt
复制代码- //------------------------
, c h0 A1 h+ V8 { - void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
/ y% I4 ?' r9 a$ W - {
8 K+ k9 Y4 u4 T J+ x/ b, X - //----UART1收到1个字节后 中断后来到这里----------2 V- A! G4 A9 z, Q6 l. ~
- if(huart->Instance == huart1.Instance )1 |' B$ q) x/ }0 y1 [' h
- {
' m g: c6 s/ V4 b1 C) ]/ o$ E - UART1_received =1; //--设置UART1收到数据的标志
$ o0 k* \; I) l! `" G - UART1_receiveData[UART1_receive_len] = aRxBuffer1[0]; //--把数据放在UART1接收数据的数组里- n$ s* x) P# F' ]
- UART1_receive_len++;
) ^2 s8 v& Z9 m: T - if ( UART1_receive_len >= UART1_receiveBufLen)$ @+ S/ h1 W7 c' u
- {; \3 w$ ^/ w9 n' c( L3 R
- UART1_receive_len=0;0 V( ^/ R5 \& _& u' s0 A0 S6 m
- }
3 g a5 u8 l9 J( c# ~1 F" K" R - UART1_receive_count=0; //--清零收到数据的计数,该计数在TIMER3中断里面累加,如果累加到6,则认为这次串口接收数据结束1 Z( F+ A* S7 `% e
- }8 W w& b- z! o8 o8 B4 z# }4 ]" q
- }
复制代码- /* USER CODE BEGIN 1 */4 z- S0 |; }9 V, x( [, G
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)# T% j& b6 V8 E% B5 ?8 L m
- {$ P/ @( ^% {7 h8 X6 @9 K
- if (htim->Instance == htim3.Instance) //---Timer3 中断入口 ---------
, b( r. X* E$ J4 S- a% T4 c1 X* N6 D- Z - {8 e+ J( v r K$ i
- LED1_FLASH();9 q R3 x* e+ ]* e' v0 F
- LED2_FLASH();( P( Z* S3 H% a$ h
l: x* D% K5 V. r6 Q* m& L- newEventCount();
6 m6 K% U- l* w0 } - 3 n% R) [, S1 A$ \+ x
- HAL_UART_ReceivedCount();
! O% @9 l2 s' N+ S1 H+ c' \
( b4 z0 J' P) }5 B- //HAL_I2C_ReceivedCount();
6 V, Z! e9 ]$ b$ R+ @2 N$ t - }4 i" d- b4 \8 R- b% d
- }
复制代码- //-------------------------------
' V8 r2 G7 |7 r* ^. m - void HAL_UART_ReceivedCount()
y \4 u7 }3 l Z5 o( c - {, J3 u$ R0 ~3 \
- //---如果UART1收到了数据,则计数累加,到6表明UART1串口接收结束------ [0 P5 o7 q* O, {" [
- if ( UART1_received )+ _! b/ D) b/ _) k; a% F# g
- {, H( \3 Z: E- Q8 v
- UART1_receive_count++;
) Z0 B6 W3 S5 g, t5 q - if (UART1_receive_count >= 6) //---Default is 6
% d; v) ^: ]$ j - {! O4 X; v! D' g5 v/ C0 b
- EVENT_DO_UART = EVENT_DO_UART | EVENT_uart1_Received;
2 v) M, u7 c5 m& @2 k1 C' I0 S: \ - UART1_received=0;
% E9 O6 q- B0 K& F - UART1_receive_count=0;
R9 d+ o8 E1 @8 U" d" A - }
& O* ]; S/ ~$ j1 N( s1 Q) J - }
$ W3 D1 f1 f* u6 B - }
复制代码 ( n* P' _) [2 b* c/ N l& y% ^
- //----UART1 Received Data Completed-----------------------------------
L8 s! t) P* [) m, V4 s6 }4 q' B - if(EVENT_DO_UART & EVENT_uart1_Received)' j/ ~- Z/ K! }) P2 x: D, U, w
- {$ q4 @0 N0 x- g0 L
- EVENT_DO_UART = EVENT_DO_UART & (~EVENT_uart1_Received);
( ~- R8 D7 V8 {8 N( L1 V - dtk_uart1receivedData(UART1_receiveData, UART1_receive_len);) s$ _! @) F9 c" l
- ) Z' {& X3 u9 b& Y) Y1 {8 T
- UART1_receive_len=0;; X( C5 l0 C/ N3 B2 o8 _& ^1 H3 l& I
- }% v" {) m/ w& \! w% G3 g" B+ C: j
复制代码 ' u5 x& T+ M7 b/ f+ g7 y7 ?
% w7 X0 N, B, }3 T( o/ z. r |