diff options
| author | Dario Nieuwenhuis <[email protected]> | 2023-05-01 18:17:02 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2023-05-01 23:20:51 +0200 |
| commit | 76017796933f0335bcdadbd6b765721833fdacec (patch) | |
| tree | 9fcba8bc1ecec7fc1e475111d731963e08e5a4b5 | |
| parent | 1806422763be4e9e47201f741a03e5968fc8dedb (diff) | |
stm32/test: cleanup ringbuffer test, exit on success (transferring 100kb)
| -rw-r--r-- | tests/stm32/src/bin/usart_rx_ringbuffered.rs | 77 |
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"] |
| 8 | mod example_common; | 8 | mod example_common; |
| 9 | use defmt::{assert_eq, panic}; | ||
| 9 | use embassy_executor::Spawner; | 10 | use embassy_executor::Spawner; |
| 10 | use embassy_stm32::interrupt; | 11 | use embassy_stm32::interrupt; |
| 11 | use embassy_stm32::usart::{Config, DataBits, Parity, RingBufferedUartRx, StopBits, Uart, UartTx}; | 12 | use 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")] |
| 36 | mod board { | 37 | mod 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")] |
| 42 | mod board { | 43 | mod 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")] | ||
| 61 | mod 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 | ||
| 60 | const ONE_BYTE_DURATION_US: u32 = 9_000_000 / 115200; | 67 | const DMA_BUF_SIZE: usize = 256; |
| 61 | const DMA_BUF_SIZE: usize = 64; | ||
| 62 | 68 | ||
| 63 | #[embassy_executor::main] | 69 | #[embassy_executor::main] |
| 64 | async fn main(spawner: Spawner) { | 70 | async 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 | } |
