3
3
4
4
extern crate panic_rtt_target;
5
5
6
+ use heapless:: {
7
+ consts:: U8 ,
8
+ spsc,
9
+ } ;
6
10
use nb:: block;
7
11
use rtt_target:: {
8
12
rprint,
@@ -26,10 +30,16 @@ const APP: () = {
26
30
struct Resources {
27
31
rx : serial:: Rx < USART2 > ,
28
32
tx : serial:: Tx < USART2 > ,
33
+
34
+ rx_prod : spsc:: Producer < ' static , u8 , U8 > ,
35
+ rx_cons : spsc:: Consumer < ' static , u8 , U8 > ,
29
36
}
30
37
31
38
#[ init]
32
39
fn init ( _: init:: Context ) -> init:: LateResources {
40
+ static mut RX_QUEUE : spsc:: Queue < u8 , U8 > =
41
+ spsc:: Queue ( heapless:: i:: Queue :: new ( ) ) ;
42
+
33
43
rtt_target:: rtt_init_print!( ) ;
34
44
rprint ! ( "Initializing... " ) ;
35
45
@@ -46,32 +56,61 @@ const APP: () = {
46
56
let tx_pin = gpioa. pa2 . into_af7 ( & mut gpioa. moder , & mut gpioa. afrl ) ;
47
57
let rx_pin = gpioa. pa3 . into_af7 ( & mut gpioa. moder , & mut gpioa. afrl ) ;
48
58
49
- let serial = Serial :: usart2 (
59
+ let mut serial = Serial :: usart2 (
50
60
p. USART2 ,
51
61
( tx_pin, rx_pin) ,
52
62
Config :: default ( )
53
63
. baudrate ( 115_200 . bps ( ) ) ,
54
64
clocks,
55
65
& mut rcc. apb1r1 ,
56
66
) ;
67
+ serial. listen ( serial:: Event :: Rxne ) ;
68
+
57
69
let ( tx, rx) = serial. split ( ) ;
70
+ let ( rx_prod, rx_cons) = RX_QUEUE . split ( ) ;
58
71
59
72
rprintln ! ( "done." ) ;
60
73
61
74
init:: LateResources {
62
75
rx,
63
76
tx,
77
+
78
+ rx_prod,
79
+ rx_cons,
64
80
}
65
81
}
66
82
67
- #[ idle( resources = [ rx , tx] ) ]
83
+ #[ idle( resources = [ rx_cons , tx] ) ]
68
84
fn idle ( cx : idle:: Context ) -> ! {
69
- let rx = cx. resources . rx ;
85
+ let rx = cx. resources . rx_cons ;
70
86
let tx = cx. resources . tx ;
71
87
72
88
loop {
73
- let b = block ! ( rx. read( ) ) . unwrap ( ) ;
74
- block ! ( tx. write( b) ) . unwrap ( ) ;
89
+ if let Some ( b) = rx. dequeue ( ) {
90
+ rprintln ! ( "Echoing '{}'" , b as char ) ;
91
+ block ! ( tx. write( b) ) . unwrap ( ) ;
92
+ }
93
+ }
94
+ }
95
+
96
+ #[ task( binds = USART2 , resources = [ rx, rx_prod] ) ]
97
+ fn usart2 ( cx : usart2:: Context ) {
98
+ let rx = cx. resources . rx ;
99
+ let queue = cx. resources . rx_prod ;
100
+
101
+ let b = match rx. read ( ) {
102
+ Ok ( b) => b,
103
+ Err ( err) => {
104
+ rprintln ! ( "Error reading from USART: {:?}" , err) ;
105
+ return ;
106
+ }
107
+ } ;
108
+ match queue. enqueue ( b) {
109
+ Ok ( ( ) ) => ( ) ,
110
+ Err ( err) => {
111
+ rprintln ! ( "Error adding received byte to queue: {:?}" , err) ;
112
+ return ;
113
+ }
75
114
}
76
115
}
77
116
} ;
0 commit comments