aboutsummaryrefslogtreecommitdiff
path: root/examples
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 /examples
parent77e34c5e8a7d31eac6fdc144a329027a0ce731a5 (diff)
stm32/can: implement proper RX timestamps
Diffstat (limited to 'examples')
-rw-r--r--examples/stm32f4/src/bin/can.rs18
-rw-r--r--examples/stm32f7/src/bin/can.rs4
2 files changed, 18 insertions, 4 deletions
diff --git a/examples/stm32f4/src/bin/can.rs b/examples/stm32f4/src/bin/can.rs
index f84f74d30..20ce4edce 100644
--- a/examples/stm32f4/src/bin/can.rs
+++ b/examples/stm32f4/src/bin/can.rs
@@ -10,6 +10,7 @@ use embassy_stm32::can::bxcan::{Fifo, Frame, StandardId};
10use embassy_stm32::can::{Can, Rx0InterruptHandler, Rx1InterruptHandler, SceInterruptHandler, TxInterruptHandler}; 10use embassy_stm32::can::{Can, Rx0InterruptHandler, Rx1InterruptHandler, SceInterruptHandler, TxInterruptHandler};
11use embassy_stm32::gpio::{Input, Pull}; 11use embassy_stm32::gpio::{Input, Pull};
12use embassy_stm32::peripherals::CAN1; 12use embassy_stm32::peripherals::CAN1;
13use embassy_time::Instant;
13use {defmt_rtt as _, panic_probe as _}; 14use {defmt_rtt as _, panic_probe as _};
14 15
15bind_interrupts!(struct Irqs { 16bind_interrupts!(struct Irqs {
@@ -51,9 +52,22 @@ async fn main(_spawner: Spawner) {
51 let mut i: u8 = 0; 52 let mut i: u8 = 0;
52 loop { 53 loop {
53 let tx_frame = Frame::new_data(unwrap!(StandardId::new(i as _)), [i]); 54 let tx_frame = Frame::new_data(unwrap!(StandardId::new(i as _)), [i]);
55 let tx_ts = Instant::now();
54 can.write(&tx_frame).await; 56 can.write(&tx_frame).await;
55 let (_, rx_frame) = can.read().await.unwrap(); 57
56 info!("loopback frame {=u8}", unwrap!(rx_frame.data())[0]); 58 let envelope = can.read().await.unwrap();
59
60 // We can measure loopback latency by using receive timestamp in the `Envelope`.
61 // Our frame is ~55 bits long (exlcuding bit stuffing), so at 1mbps loopback delay is at least 55 us.
62 // When measured with `tick-hz-1_000_000` actual latency is 80~83 us, giving a combined hardware and software
63 // overhead of ~25 us. Note that CPU frequency can greatly affect the result.
64 let latency = envelope.ts.saturating_duration_since(tx_ts);
65
66 info!(
67 "loopback frame {=u8}, latency: {} us",
68 unwrap!(envelope.frame.data())[0],
69 latency.as_micros()
70 );
57 i += 1; 71 i += 1;
58 } 72 }
59} 73}
diff --git a/examples/stm32f7/src/bin/can.rs b/examples/stm32f7/src/bin/can.rs
index 1b5b377ea..e9650f23a 100644
--- a/examples/stm32f7/src/bin/can.rs
+++ b/examples/stm32f7/src/bin/can.rs
@@ -60,7 +60,7 @@ async fn main(spawner: Spawner) {
60 spawner.spawn(send_can_message(tx)).unwrap(); 60 spawner.spawn(send_can_message(tx)).unwrap();
61 61
62 loop { 62 loop {
63 let frame = rx.read().await.unwrap(); 63 let envelope = rx.read().await.unwrap();
64 println!("Received: {:?}", frame); 64 println!("Received: {:?}", envelope);
65 } 65 }
66} 66}