aboutsummaryrefslogtreecommitdiff
path: root/tests/stm32/src
diff options
context:
space:
mode:
Diffstat (limited to 'tests/stm32/src')
-rw-r--r--tests/stm32/src/bin/spi.rs1
-rw-r--r--tests/stm32/src/bin/usart.rs77
-rw-r--r--tests/stm32/src/bin/usart_dma.rs3
-rw-r--r--tests/stm32/src/bin/usart_rx_ringbuffered.rs7
-rw-r--r--tests/stm32/src/example_common.rs5
5 files changed, 72 insertions, 21 deletions
diff --git a/tests/stm32/src/bin/spi.rs b/tests/stm32/src/bin/spi.rs
index 0f5e563b1..a87ac3237 100644
--- a/tests/stm32/src/bin/spi.rs
+++ b/tests/stm32/src/bin/spi.rs
@@ -35,7 +35,6 @@ async fn main(_spawner: Spawner) {
35 #[cfg(feature = "stm32c031c6")] 35 #[cfg(feature = "stm32c031c6")]
36 let (spi, sck, mosi, miso) = (p.SPI1, p.PA5, p.PA7, p.PA6); 36 let (spi, sck, mosi, miso) = (p.SPI1, p.PA5, p.PA7, p.PA6);
37 37
38 info!("asdfa;");
39 let mut spi = Spi::new( 38 let mut spi = Spi::new(
40 spi, 39 spi,
41 sck, // Arduino D13 40 sck, // Arduino D13
diff --git a/tests/stm32/src/bin/usart.rs b/tests/stm32/src/bin/usart.rs
index cca8c42ee..bda2ce9c2 100644
--- a/tests/stm32/src/bin/usart.rs
+++ b/tests/stm32/src/bin/usart.rs
@@ -9,6 +9,7 @@ use embassy_executor::Spawner;
9use embassy_stm32::dma::NoDma; 9use embassy_stm32::dma::NoDma;
10use embassy_stm32::interrupt; 10use embassy_stm32::interrupt;
11use embassy_stm32::usart::{Config, Uart}; 11use embassy_stm32::usart::{Config, Uart};
12use embassy_time::{Duration, Instant};
12use example_common::*; 13use example_common::*;
13 14
14#[embassy_executor::main] 15#[embassy_executor::main]
@@ -19,36 +20,76 @@ async fn main(_spawner: Spawner) {
19 // Arduino pins D0 and D1 20 // Arduino pins D0 and D1
20 // They're connected together with a 1K resistor. 21 // They're connected together with a 1K resistor.
21 #[cfg(feature = "stm32f103c8")] 22 #[cfg(feature = "stm32f103c8")]
22 let (tx, rx, usart, irq) = (p.PA9, p.PA10, p.USART1, interrupt::take!(USART1)); 23 let (mut tx, mut rx, mut usart, mut irq) = (p.PA9, p.PA10, p.USART1, interrupt::take!(USART1));
23 #[cfg(feature = "stm32g491re")] 24 #[cfg(feature = "stm32g491re")]
24 let (tx, rx, usart, irq) = (p.PC4, p.PC5, p.USART1, interrupt::take!(USART1)); 25 let (mut tx, mut rx, mut usart, mut irq) = (p.PC4, p.PC5, p.USART1, interrupt::take!(USART1));
25 #[cfg(feature = "stm32g071rb")] 26 #[cfg(feature = "stm32g071rb")]
26 let (tx, rx, usart, irq) = (p.PC4, p.PC5, p.USART1, interrupt::take!(USART1)); 27 let (mut tx, mut rx, mut usart, mut irq) = (p.PC4, p.PC5, p.USART1, interrupt::take!(USART1));
27 #[cfg(feature = "stm32f429zi")] 28 #[cfg(feature = "stm32f429zi")]
28 let (tx, rx, usart, irq) = (p.PG14, p.PG9, p.USART6, interrupt::take!(USART6)); 29 let (mut tx, mut rx, mut usart, mut irq) = (p.PG14, p.PG9, p.USART6, interrupt::take!(USART6));
29 #[cfg(feature = "stm32wb55rg")] 30 #[cfg(feature = "stm32wb55rg")]
30 let (tx, rx, usart, irq) = (p.PA2, p.PA3, p.LPUART1, interrupt::take!(LPUART1)); 31 let (mut tx, mut rx, mut usart, mut irq) = (p.PA2, p.PA3, p.LPUART1, interrupt::take!(LPUART1));
31 #[cfg(feature = "stm32h755zi")] 32 #[cfg(feature = "stm32h755zi")]
32 let (tx, rx, usart, irq) = (p.PB6, p.PB7, p.USART1, interrupt::take!(USART1)); 33 let (mut tx, mut rx, mut usart, mut irq) = (p.PB6, p.PB7, p.USART1, interrupt::take!(USART1));
33 #[cfg(feature = "stm32u585ai")] 34 #[cfg(feature = "stm32u585ai")]
34 let (tx, rx, usart, irq) = (p.PD8, p.PD9, p.USART3, interrupt::take!(USART3)); 35 let (mut tx, mut rx, mut usart, mut irq) = (p.PD8, p.PD9, p.USART3, interrupt::take!(USART3));
35 #[cfg(feature = "stm32h563zi")] 36 #[cfg(feature = "stm32h563zi")]
36 let (tx, rx, usart, irq) = (p.PB6, p.PB7, p.LPUART1, interrupt::take!(LPUART1)); 37 let (mut tx, mut rx, mut usart, mut irq) = (p.PB6, p.PB7, p.LPUART1, interrupt::take!(LPUART1));
37 #[cfg(feature = "stm32c031c6")] 38 #[cfg(feature = "stm32c031c6")]
38 let (tx, rx, usart, irq) = (p.PB6, p.PB7, p.USART1, interrupt::take!(USART1)); 39 let (mut tx, mut rx, mut usart, mut irq) = (p.PB6, p.PB7, p.USART1, interrupt::take!(USART1));
39 40
40 let config = Config::default(); 41 {
41 let mut usart = Uart::new(usart, rx, tx, irq, NoDma, NoDma, config); 42 let config = Config::default();
43 let mut usart = Uart::new(&mut usart, &mut rx, &mut tx, &mut irq, NoDma, NoDma, config);
42 44
43 // We can't send too many bytes, they have to fit in the FIFO. 45 // We can't send too many bytes, they have to fit in the FIFO.
44 // This is because we aren't sending+receiving at the same time. 46 // This is because we aren't sending+receiving at the same time.
45 47
46 let data = [0xC0, 0xDE]; 48 let data = [0xC0, 0xDE];
47 usart.blocking_write(&data).unwrap(); 49 usart.blocking_write(&data).unwrap();
48 50
49 let mut buf = [0; 2]; 51 let mut buf = [0; 2];
50 usart.blocking_read(&mut buf).unwrap(); 52 usart.blocking_read(&mut buf).unwrap();
51 assert_eq!(buf, data); 53 assert_eq!(buf, data);
54 }
55
56 // Test that baudrate divider is calculated correctly.
57 // Do it by comparing the time it takes to send a known number of bytes.
58 for baudrate in [
59 300,
60 9600,
61 115200,
62 250_000,
63 337_934,
64 #[cfg(not(feature = "stm32f103c8"))]
65 1_000_000,
66 #[cfg(not(feature = "stm32f103c8"))]
67 2_000_000,
68 ] {
69 info!("testing baudrate {}", baudrate);
70
71 let mut config = Config::default();
72 config.baudrate = baudrate;
73 let mut usart = Uart::new(&mut usart, &mut rx, &mut tx, &mut irq, NoDma, NoDma, config);
74
75 let n = (baudrate as usize / 100).max(64);
76
77 let start = Instant::now();
78 for _ in 0..n {
79 usart.blocking_write(&[0x00]).unwrap();
80 }
81 let dur = Instant::now() - start;
82 let want_dur = Duration::from_micros(n as u64 * 10 * 1_000_000 / (baudrate as u64));
83 let fuzz = want_dur / 5;
84 if dur < want_dur - fuzz || dur > want_dur + fuzz {
85 defmt::panic!(
86 "bad duration for baudrate {}: got {:?} want {:?}",
87 baudrate,
88 dur,
89 want_dur
90 );
91 }
92 }
52 93
53 info!("Test OK"); 94 info!("Test OK");
54 cortex_m::asm::bkpt(); 95 cortex_m::asm::bkpt();
diff --git a/tests/stm32/src/bin/usart_dma.rs b/tests/stm32/src/bin/usart_dma.rs
index de6cd41d1..62444f0a8 100644
--- a/tests/stm32/src/bin/usart_dma.rs
+++ b/tests/stm32/src/bin/usart_dma.rs
@@ -94,6 +94,9 @@ async fn main(_spawner: Spawner) {
94 let rx_fut = async { 94 let rx_fut = async {
95 rx.read(&mut rx_buf).await.unwrap(); 95 rx.read(&mut rx_buf).await.unwrap();
96 }; 96 };
97
98 // note: rx needs to be polled first, to workaround this bug:
99 // https://github.com/embassy-rs/embassy/issues/1426
97 join(rx_fut, tx_fut).await; 100 join(rx_fut, tx_fut).await;
98 101
99 assert_eq!(tx_buf, rx_buf); 102 assert_eq!(tx_buf, rx_buf);
diff --git a/tests/stm32/src/bin/usart_rx_ringbuffered.rs b/tests/stm32/src/bin/usart_rx_ringbuffered.rs
index 2c4a8fdf4..9d75dbe55 100644
--- a/tests/stm32/src/bin/usart_rx_ringbuffered.rs
+++ b/tests/stm32/src/bin/usart_rx_ringbuffered.rs
@@ -145,13 +145,16 @@ async fn main(spawner: Spawner) {
145 145
146#[embassy_executor::task] 146#[embassy_executor::task]
147async fn transmit_task(mut tx: UartTx<'static, board::Uart, board::TxDma>) { 147async fn transmit_task(mut tx: UartTx<'static, board::Uart, board::TxDma>) {
148 // workaround https://github.com/embassy-rs/embassy/issues/1426
149 Timer::after(Duration::from_millis(100) as _).await;
150
148 let mut rng = ChaCha8Rng::seed_from_u64(1337); 151 let mut rng = ChaCha8Rng::seed_from_u64(1337);
149 152
150 info!("Starting random transmissions into void..."); 153 info!("Starting random transmissions into void...");
151 154
152 let mut i: u8 = 0; 155 let mut i: u8 = 0;
153 loop { 156 loop {
154 let mut buf = [0; 32]; 157 let mut buf = [0; 256];
155 let len = 1 + (rng.next_u32() as usize % buf.len()); 158 let len = 1 + (rng.next_u32() as usize % buf.len());
156 for b in &mut buf[..len] { 159 for b in &mut buf[..len] {
157 *b = i; 160 *b = i;
@@ -172,7 +175,7 @@ async fn receive_task(mut rx: RingBufferedUartRx<'static, board::Uart, board::Rx
172 let mut i = 0; 175 let mut i = 0;
173 let mut expected = 0; 176 let mut expected = 0;
174 loop { 177 loop {
175 let mut buf = [0; 100]; 178 let mut buf = [0; 256];
176 let max_len = 1 + (rng.next_u32() as usize % buf.len()); 179 let max_len = 1 + (rng.next_u32() as usize % buf.len());
177 let received = match rx.read(&mut buf[..max_len]).await { 180 let received = match rx.read(&mut buf[..max_len]).await {
178 Ok(r) => r, 181 Ok(r) => r,
diff --git a/tests/stm32/src/example_common.rs b/tests/stm32/src/example_common.rs
index a4f8668c7..3d150da60 100644
--- a/tests/stm32/src/example_common.rs
+++ b/tests/stm32/src/example_common.rs
@@ -16,5 +16,10 @@ pub fn config() -> Config {
16 config.rcc.pll1.q_ck = Some(Hertz(100_000_000)); 16 config.rcc.pll1.q_ck = Some(Hertz(100_000_000));
17 } 17 }
18 18
19 #[cfg(feature = "stm32u585ai")]
20 {
21 config.rcc.mux = embassy_stm32::rcc::ClockSrc::MSI(embassy_stm32::rcc::MSIRange::Range48mhz);
22 }
23
19 config 24 config
20} 25}