aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32f4-examples/src/serial.rs14
-rw-r--r--embassy-stm32f4/src/serial.rs108
2 files changed, 59 insertions, 63 deletions
diff --git a/embassy-stm32f4-examples/src/serial.rs b/embassy-stm32f4-examples/src/serial.rs
index 11a5b8904..ea0497016 100644
--- a/embassy-stm32f4-examples/src/serial.rs
+++ b/embassy-stm32f4-examples/src/serial.rs
@@ -28,8 +28,8 @@ async fn run(dp: stm32::Peripherals, cp: cortex_m::Peripherals) {
28 .pclk1(24.mhz()) 28 .pclk1(24.mhz())
29 .freeze(); 29 .freeze();
30 30
31 unsafe { 31 let mut serial = unsafe {
32 let mut serial = serial::Serial::new( 32 serial::Serial::new(
33 gpioa.pa9.into_alternate_af7(), 33 gpioa.pa9.into_alternate_af7(),
34 gpioa.pa10.into_alternate_af7(), 34 gpioa.pa10.into_alternate_af7(),
35 interrupt::take!(DMA2_STREAM7), 35 interrupt::take!(DMA2_STREAM7),
@@ -40,12 +40,12 @@ async fn run(dp: stm32::Peripherals, cp: cortex_m::Peripherals) {
40 config::Parity::ParityNone, 40 config::Parity::ParityNone,
41 9600.bps(), 41 9600.bps(),
42 clocks, 42 clocks,
43 ); 43 )
44 let buf = singleton!(: [u8; 30] = [0; 30]).unwrap(); 44 };
45 let buf = singleton!(: [u8; 30] = [0; 30]).unwrap();
45 46
46 buf[5] = 0x01; 47 buf[5] = 0x01;
47 serial.send(buf).await; 48 serial.send(buf).await;
48 }
49} 49}
50 50
51static EXECUTOR: Forever<Executor> = Forever::new(); 51static EXECUTOR: Forever<Executor> = Forever::new();
diff --git a/embassy-stm32f4/src/serial.rs b/embassy-stm32f4/src/serial.rs
index b13438272..c430ee95f 100644
--- a/embassy-stm32f4/src/serial.rs
+++ b/embassy-stm32f4/src/serial.rs
@@ -152,37 +152,35 @@ impl Uart for Serial<USART1, Stream7<DMA2>, Stream2<DMA2>> {
152 fn send<'a>(&'a mut self, buf: &'a [u8]) -> Self::SendFuture<'a> { 152 fn send<'a>(&'a mut self, buf: &'a [u8]) -> Self::SendFuture<'a> {
153 unsafe { INSTANCE = self }; 153 unsafe { INSTANCE = self };
154 154
155 unsafe { 155 let static_buf = unsafe { core::mem::transmute::<&'a [u8], &'static mut [u8]>(buf) };
156 let static_buf = core::mem::transmute::<&'a [u8], &'static mut [u8]>(buf); 156
157 157 let tx_stream = self.tx_stream.take().unwrap();
158 let tx_stream = self.tx_stream.take().unwrap(); 158 let usart = self.usart.take().unwrap();
159 let usart = self.usart.take().unwrap(); 159 STATE.tx_int.reset();
160 STATE.tx_int.reset(); 160
161 161 async move {
162 async move { 162 let mut tx_transfer = Transfer::init(
163 let mut tx_transfer = Transfer::init( 163 tx_stream,
164 tx_stream, 164 usart,
165 usart, 165 static_buf,
166 static_buf, 166 None,
167 None, 167 DmaConfig::default()
168 DmaConfig::default() 168 .transfer_complete_interrupt(true)
169 .transfer_complete_interrupt(true) 169 .memory_increment(true)
170 .memory_increment(true) 170 .double_buffer(false),
171 .double_buffer(false), 171 );
172 ); 172
173 173 self.tx_int.unpend();
174 self.tx_int.unpend(); 174 self.tx_int.enable();
175 self.tx_int.enable(); 175 tx_transfer.start(|_usart| {});
176 tx_transfer.start(|_usart| {}); 176
177 177 STATE.tx_int.wait().await;
178 STATE.tx_int.wait().await; 178
179 179 let (tx_stream, usart, _buf, _) = tx_transfer.free();
180 let (tx_stream, usart, _buf, _) = tx_transfer.free(); 180 self.tx_stream.replace(tx_stream);
181 self.tx_stream.replace(tx_stream); 181 self.usart.replace(usart);
182 self.usart.replace(usart); 182
183 183 Ok(())
184 Ok(())
185 }
186 } 184 }
187 } 185 }
188 186
@@ -199,31 +197,29 @@ impl Uart for Serial<USART1, Stream7<DMA2>, Stream2<DMA2>> {
199 fn receive<'a>(&'a mut self, buf: &'a mut [u8]) -> Self::ReceiveFuture<'a> { 197 fn receive<'a>(&'a mut self, buf: &'a mut [u8]) -> Self::ReceiveFuture<'a> {
200 unsafe { INSTANCE = self }; 198 unsafe { INSTANCE = self };
201 199
202 unsafe { 200 let static_buf = unsafe { core::mem::transmute::<&'a mut [u8], &'static mut [u8]>(buf) };
203 let static_buf = core::mem::transmute::<&'a mut [u8], &'static mut [u8]>(buf); 201 let rx_stream = self.rx_stream.take().unwrap();
204 let rx_stream = self.rx_stream.take().unwrap(); 202 let usart = self.usart.take().unwrap();
205 let usart = self.usart.take().unwrap(); 203 STATE.rx_int.reset();
206 STATE.rx_int.reset(); 204 async move {
207 async move { 205 let mut rx_transfer = Transfer::init(
208 let mut rx_transfer = Transfer::init( 206 rx_stream,
209 rx_stream, 207 usart,
210 usart, 208 static_buf,
211 static_buf, 209 None,
212 None, 210 DmaConfig::default()
213 DmaConfig::default() 211 .transfer_complete_interrupt(true)
214 .transfer_complete_interrupt(true) 212 .memory_increment(true)
215 .memory_increment(true) 213 .double_buffer(false),
216 .double_buffer(false), 214 );
217 ); 215 self.rx_int.unpend();
218 self.rx_int.unpend(); 216 self.rx_int.enable();
219 self.rx_int.enable(); 217 rx_transfer.start(|_usart| {});
220 rx_transfer.start(|_usart| {}); 218 STATE.rx_int.wait().await;
221 STATE.rx_int.wait().await; 219 let (rx_stream, usart, _, _) = rx_transfer.free();
222 let (rx_stream, usart, buf, _) = rx_transfer.free(); 220 self.rx_stream.replace(rx_stream);
223 self.rx_stream.replace(rx_stream); 221 self.usart.replace(usart);
224 self.usart.replace(usart); 222 Ok(())
225 Ok(())
226 }
227 } 223 }
228 } 224 }
229} 225}