diff options
| author | chemicstry <[email protected]> | 2023-07-25 12:07:09 +0300 |
|---|---|---|
| committer | chemicstry <[email protected]> | 2023-07-25 12:12:45 +0300 |
| commit | 62ab0bf2e75c560aa255ab51aab1f5ebf591ba97 (patch) | |
| tree | 5f1704223f27c3b40708b85fd7cac7b20fe66bac /tests/stm32 | |
| parent | 77e34c5e8a7d31eac6fdc144a329027a0ce731a5 (diff) | |
stm32/can: implement proper RX timestamps
Diffstat (limited to 'tests/stm32')
| -rw-r--r-- | tests/stm32/src/bin/can.rs | 13 |
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"] |
| 8 | mod common; | 8 | mod common; |
| 9 | use common::*; | 9 | use common::*; |
| 10 | use defmt::assert; | ||
| 10 | use embassy_executor::Spawner; | 11 | use embassy_executor::Spawner; |
| 11 | use embassy_stm32::bind_interrupts; | 12 | use embassy_stm32::bind_interrupts; |
| 12 | use embassy_stm32::can::bxcan::filter::Mask32; | 13 | use embassy_stm32::can::bxcan::filter::Mask32; |
| @@ -14,6 +15,7 @@ use embassy_stm32::can::bxcan::{Fifo, Frame, StandardId}; | |||
| 14 | use embassy_stm32::can::{Can, Rx0InterruptHandler, Rx1InterruptHandler, SceInterruptHandler, TxInterruptHandler}; | 15 | use embassy_stm32::can::{Can, Rx0InterruptHandler, Rx1InterruptHandler, SceInterruptHandler, TxInterruptHandler}; |
| 15 | use embassy_stm32::gpio::{Input, Pull}; | 16 | use embassy_stm32::gpio::{Input, Pull}; |
| 16 | use embassy_stm32::peripherals::CAN1; | 17 | use embassy_stm32::peripherals::CAN1; |
| 18 | use embassy_time::{Duration, Instant}; | ||
| 17 | use {defmt_rtt as _, panic_probe as _}; | 19 | use {defmt_rtt as _, panic_probe as _}; |
| 18 | 20 | ||
| 19 | bind_interrupts!(struct Irqs { | 21 | bind_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 { |
