aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/stm32/src/bin/usart_rx_ringbuffered.rs77
1 files changed, 38 insertions, 39 deletions
diff --git a/tests/stm32/src/bin/usart_rx_ringbuffered.rs b/tests/stm32/src/bin/usart_rx_ringbuffered.rs
index 86bcfab8d..2c4a8fdf4 100644
--- a/tests/stm32/src/bin/usart_rx_ringbuffered.rs
+++ b/tests/stm32/src/bin/usart_rx_ringbuffered.rs
@@ -6,6 +6,7 @@
6 6
7#[path = "../example_common.rs"] 7#[path = "../example_common.rs"]
8mod example_common; 8mod example_common;
9use defmt::{assert_eq, panic};
9use embassy_executor::Spawner; 10use embassy_executor::Spawner;
10use embassy_stm32::interrupt; 11use embassy_stm32::interrupt;
11use embassy_stm32::usart::{Config, DataBits, Parity, RingBufferedUartRx, StopBits, Uart, UartTx}; 12use embassy_stm32::usart::{Config, DataBits, Parity, RingBufferedUartRx, StopBits, Uart, UartTx};
@@ -34,9 +35,9 @@ mod board {
34} 35}
35#[cfg(feature = "stm32f429zi")] 36#[cfg(feature = "stm32f429zi")]
36mod board { 37mod board {
37 pub type Uart = embassy_stm32::peripherals::USART2; 38 pub type Uart = embassy_stm32::peripherals::USART6;
38 pub type TxDma = embassy_stm32::peripherals::DMA1_CH6; 39 pub type TxDma = embassy_stm32::peripherals::DMA2_CH6;
39 pub type RxDma = embassy_stm32::peripherals::DMA1_CH5; 40 pub type RxDma = embassy_stm32::peripherals::DMA2_CH1;
40} 41}
41#[cfg(feature = "stm32wb55rg")] 42#[cfg(feature = "stm32wb55rg")]
42mod board { 43mod board {
@@ -56,9 +57,14 @@ mod board {
56 pub type TxDma = embassy_stm32::peripherals::GPDMA1_CH0; 57 pub type TxDma = embassy_stm32::peripherals::GPDMA1_CH0;
57 pub type RxDma = embassy_stm32::peripherals::GPDMA1_CH1; 58 pub type RxDma = embassy_stm32::peripherals::GPDMA1_CH1;
58} 59}
60#[cfg(feature = "stm32c031c6")]
61mod board {
62 pub type Uart = embassy_stm32::peripherals::USART1;
63 pub type TxDma = embassy_stm32::peripherals::DMA1_CH1;
64 pub type RxDma = embassy_stm32::peripherals::DMA1_CH2;
65}
59 66
60const ONE_BYTE_DURATION_US: u32 = 9_000_000 / 115200; 67const DMA_BUF_SIZE: usize = 256;
61const DMA_BUF_SIZE: usize = 64;
62 68
63#[embassy_executor::main] 69#[embassy_executor::main]
64async fn main(spawner: Spawner) { 70async fn main(spawner: Spawner) {
@@ -83,8 +89,14 @@ async fn main(spawner: Spawner) {
83 let (tx, rx, usart, irq, tx_dma, rx_dma) = 89 let (tx, rx, usart, irq, tx_dma, rx_dma) =
84 (p.PC4, p.PC5, p.USART1, interrupt::take!(USART1), p.DMA1_CH1, p.DMA1_CH2); 90 (p.PC4, p.PC5, p.USART1, interrupt::take!(USART1), p.DMA1_CH1, p.DMA1_CH2);
85 #[cfg(feature = "stm32f429zi")] 91 #[cfg(feature = "stm32f429zi")]
86 let (tx, rx, usart, irq, tx_dma, rx_dma) = 92 let (tx, rx, usart, irq, tx_dma, rx_dma) = (
87 (p.PA2, p.PA3, p.USART2, interrupt::take!(USART2), p.DMA1_CH6, p.DMA1_CH5); 93 p.PG14,
94 p.PG9,
95 p.USART6,
96 interrupt::take!(USART6),
97 p.DMA2_CH6,
98 p.DMA2_CH1,
99 );
88 #[cfg(feature = "stm32wb55rg")] 100 #[cfg(feature = "stm32wb55rg")]
89 let (tx, rx, usart, irq, tx_dma, rx_dma) = ( 101 let (tx, rx, usart, irq, tx_dma, rx_dma) = (
90 p.PA2, 102 p.PA2,
@@ -106,11 +118,16 @@ async fn main(spawner: Spawner) {
106 p.GPDMA1_CH0, 118 p.GPDMA1_CH0,
107 p.GPDMA1_CH1, 119 p.GPDMA1_CH1,
108 ); 120 );
121 #[cfg(feature = "stm32c031c6")]
122 let (tx, rx, usart, irq, tx_dma, rx_dma) =
123 (p.PB6, p.PB7, p.USART1, interrupt::take!(USART1), p.DMA1_CH1, p.DMA1_CH2);
109 124
110 // To run this test, use the saturating_serial test utility to saturate the serial port 125 // To run this test, use the saturating_serial test utility to saturate the serial port
111 126
112 let mut config = Config::default(); 127 let mut config = Config::default();
113 config.baudrate = 115200; 128 // this is the fastest we can go without tuning RCC
129 // some chips have default pclk=8mhz, and uart can run at max pclk/16
130 config.baudrate = 500_000;
114 config.data_bits = DataBits::DataBits8; 131 config.data_bits = DataBits::DataBits8;
115 config.stop_bits = StopBits::STOP1; 132 config.stop_bits = StopBits::STOP1;
116 config.parity = Parity::ParityNone; 133 config.parity = Parity::ParityNone;
@@ -135,19 +152,14 @@ async fn transmit_task(mut tx: UartTx<'static, board::Uart, board::TxDma>) {
135 let mut i: u8 = 0; 152 let mut i: u8 = 0;
136 loop { 153 loop {
137 let mut buf = [0; 32]; 154 let mut buf = [0; 32];
138 let len = 1 + (rng.next_u32() as usize % (buf.len() - 1)); 155 let len = 1 + (rng.next_u32() as usize % buf.len());
139 for b in &mut buf[..len] { 156 for b in &mut buf[..len] {
140 *b = i; 157 *b = i;
141 i = i.wrapping_add(1); 158 i = i.wrapping_add(1);
142 } 159 }
143 160
144 tx.write(&buf[..len]).await.unwrap(); 161 tx.write(&buf[..len]).await.unwrap();
145 Timer::after(Duration::from_micros((rng.next_u32() % 10000) as _)).await; 162 Timer::after(Duration::from_micros((rng.next_u32() % 1000) as _)).await;
146
147 //i += 1;
148 //if i % 1000 == 0 {
149 // trace!("Wrote {} times", i);
150 //}
151 } 163 }
152} 164}
153 165
@@ -158,44 +170,31 @@ async fn receive_task(mut rx: RingBufferedUartRx<'static, board::Uart, board::Rx
158 let mut rng = ChaCha8Rng::seed_from_u64(1337); 170 let mut rng = ChaCha8Rng::seed_from_u64(1337);
159 171
160 let mut i = 0; 172 let mut i = 0;
161 let mut expected: Option<u8> = None; 173 let mut expected = 0;
162 loop { 174 loop {
163 let mut buf = [0; 100]; 175 let mut buf = [0; 100];
164 let max_len = 1 + (rng.next_u32() as usize % (buf.len() - 1)); 176 let max_len = 1 + (rng.next_u32() as usize % buf.len());
165 let received = match rx.read(&mut buf[..max_len]).await { 177 let received = match rx.read(&mut buf[..max_len]).await {
166 Ok(r) => r, 178 Ok(r) => r,
167 Err(e) => { 179 Err(e) => {
168 error!("Test fail! read error: {:?}", e); 180 panic!("Test fail! read error: {:?}", e);
169 cortex_m::asm::bkpt();
170 return;
171 } 181 }
172 }; 182 };
173 183
174 if expected.is_none() {
175 info!("Test started");
176 expected = Some(buf[0]);
177 }
178
179 for byte in &buf[..received] { 184 for byte in &buf[..received] {
180 if byte != &expected.unwrap() { 185 assert_eq!(*byte, expected);
181 error!("Test fail! received {}, expected {}", *byte, expected.unwrap()); 186 expected = expected.wrapping_add(1);
182 cortex_m::asm::bkpt();
183 return;
184 }
185 expected = Some(expected.unwrap().wrapping_add(1));
186 } 187 }
187 188
188 if received < max_len { 189 if received < max_len {
189 let byte_count = rng.next_u32() % (DMA_BUF_SIZE as u32); 190 Timer::after(Duration::from_micros((rng.next_u32() % 1000) as _)).await;
190 let random_delay_us = (byte_count * ONE_BYTE_DURATION_US) as u64;
191 if random_delay_us > 200 {
192 Timer::after(Duration::from_micros(random_delay_us - 200)).await;
193 }
194 } 191 }
195 192
196 i += 1; 193 i += received;
197 if i % 1000 == 0 { 194
198 trace!("Read {} times", i); 195 if i > 100000 {
196 info!("Test OK!");
197 cortex_m::asm::bkpt();
199 } 198 }
200 } 199 }
201} 200}