aboutsummaryrefslogtreecommitdiff
path: root/tests/stm32
diff options
context:
space:
mode:
authorchemicstry <[email protected]>2023-07-25 12:07:09 +0300
committerchemicstry <[email protected]>2023-07-25 12:12:45 +0300
commit62ab0bf2e75c560aa255ab51aab1f5ebf591ba97 (patch)
tree5f1704223f27c3b40708b85fd7cac7b20fe66bac /tests/stm32
parent77e34c5e8a7d31eac6fdc144a329027a0ce731a5 (diff)
stm32/can: implement proper RX timestamps
Diffstat (limited to 'tests/stm32')
-rw-r--r--tests/stm32/src/bin/can.rs13
1 files changed, 10 insertions, 3 deletions
diff --git a/tests/stm32/src/bin/can.rs b/tests/stm32/src/bin/can.rs
index 8bdd3c24f..93253ab84 100644
--- a/tests/stm32/src/bin/can.rs
+++ b/tests/stm32/src/bin/can.rs
@@ -7,6 +7,7 @@
7#[path = "../common.rs"] 7#[path = "../common.rs"]
8mod common; 8mod common;
9use common::*; 9use common::*;
10use defmt::assert;
10use embassy_executor::Spawner; 11use embassy_executor::Spawner;
11use embassy_stm32::bind_interrupts; 12use embassy_stm32::bind_interrupts;
12use embassy_stm32::can::bxcan::filter::Mask32; 13use embassy_stm32::can::bxcan::filter::Mask32;
@@ -14,6 +15,7 @@ use embassy_stm32::can::bxcan::{Fifo, Frame, StandardId};
14use embassy_stm32::can::{Can, Rx0InterruptHandler, Rx1InterruptHandler, SceInterruptHandler, TxInterruptHandler}; 15use embassy_stm32::can::{Can, Rx0InterruptHandler, Rx1InterruptHandler, SceInterruptHandler, TxInterruptHandler};
15use embassy_stm32::gpio::{Input, Pull}; 16use embassy_stm32::gpio::{Input, Pull};
16use embassy_stm32::peripherals::CAN1; 17use embassy_stm32::peripherals::CAN1;
18use embassy_time::{Duration, Instant};
17use {defmt_rtt as _, panic_probe as _}; 19use {defmt_rtt as _, panic_probe as _};
18 20
19bind_interrupts!(struct Irqs { 21bind_interrupts!(struct Irqs {
@@ -62,13 +64,18 @@ async fn main(_spawner: Spawner) {
62 let tx_frame = Frame::new_data(unwrap!(StandardId::new(i as _)), [i]); 64 let tx_frame = Frame::new_data(unwrap!(StandardId::new(i as _)), [i]);
63 65
64 info!("Transmitting frame..."); 66 info!("Transmitting frame...");
67 let tx_ts = Instant::now();
65 can.write(&tx_frame).await; 68 can.write(&tx_frame).await;
66 69
67 info!("Receiving frame..."); 70 info!("Receiving frame...");
68 let (time, rx_frame) = can.read().await.unwrap(); 71 let envelope = can.read().await.unwrap();
69 72
70 info!("loopback time {}", time); 73 info!("loopback time {}", envelope.ts);
71 info!("loopback frame {=u8}", rx_frame.data().unwrap()[0]); 74 info!("loopback frame {=u8}", envelope.frame.data().unwrap()[0]);
75
76 // Theoretical minimum latency is 55us, actual is usually ~80us
77 let latency = envelope.ts.saturating_duration_since(tx_ts);
78 assert!(Duration::from_micros(50) < latency && latency < Duration::from_micros(100));
72 79
73 i += 1; 80 i += 1;
74 if i > 10 { 81 if i > 10 {