diff options
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/stm32f4/src/bin/can.rs | 18 | ||||
| -rw-r--r-- | examples/stm32f7/src/bin/can.rs | 4 |
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}; | |||
| 10 | use embassy_stm32::can::{Can, Rx0InterruptHandler, Rx1InterruptHandler, SceInterruptHandler, TxInterruptHandler}; | 10 | use embassy_stm32::can::{Can, Rx0InterruptHandler, Rx1InterruptHandler, SceInterruptHandler, TxInterruptHandler}; |
| 11 | use embassy_stm32::gpio::{Input, Pull}; | 11 | use embassy_stm32::gpio::{Input, Pull}; |
| 12 | use embassy_stm32::peripherals::CAN1; | 12 | use embassy_stm32::peripherals::CAN1; |
| 13 | use embassy_time::Instant; | ||
| 13 | use {defmt_rtt as _, panic_probe as _}; | 14 | use {defmt_rtt as _, panic_probe as _}; |
| 14 | 15 | ||
| 15 | bind_interrupts!(struct Irqs { | 16 | bind_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 | } |
