diff options
| author | Dario Nieuwenhuis <[email protected]> | 2024-05-21 22:34:13 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-05-21 22:34:13 +0000 |
| commit | 68e784ccd6e17a2fa4dc837a6eb46b2ff93504d5 (patch) | |
| tree | d904f9d44ae48464c2d454d4c0e70f5ebc3f21f0 /examples | |
| parent | 608c953fc8bf782d73b3e2a22ae06150a6259bb6 (diff) | |
| parent | 2f2869f195af52613602331a186a3919694a4498 (diff) | |
Merge pull request #2983 from reneherrero/main
Added a CAN example for the stm32l4
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/stm32l4/src/bin/can.rs | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/examples/stm32l4/src/bin/can.rs b/examples/stm32l4/src/bin/can.rs new file mode 100644 index 000000000..3c4cdac24 --- /dev/null +++ b/examples/stm32l4/src/bin/can.rs | |||
| @@ -0,0 +1,68 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | |||
| 4 | use defmt::*; | ||
| 5 | use embassy_executor::Spawner; | ||
| 6 | use embassy_stm32::can::filter::Mask32; | ||
| 7 | use embassy_stm32::can::{ | ||
| 8 | Can, Fifo, Frame, Rx0InterruptHandler, Rx1InterruptHandler, SceInterruptHandler, TxInterruptHandler, | ||
| 9 | }; | ||
| 10 | use embassy_stm32::peripherals::CAN1; | ||
| 11 | use embassy_stm32::{bind_interrupts, Config}; | ||
| 12 | use embassy_time::Timer; | ||
| 13 | use {defmt_rtt as _, panic_probe as _}; | ||
| 14 | |||
| 15 | bind_interrupts!(struct Irqs { | ||
| 16 | CAN1_RX0 => Rx0InterruptHandler<CAN1>; | ||
| 17 | CAN1_RX1 => Rx1InterruptHandler<CAN1>; | ||
| 18 | CAN1_SCE => SceInterruptHandler<CAN1>; | ||
| 19 | CAN1_TX => TxInterruptHandler<CAN1>; | ||
| 20 | }); | ||
| 21 | |||
| 22 | #[embassy_executor::main] | ||
| 23 | async fn main(_spawner: Spawner) { | ||
| 24 | let p = embassy_stm32::init(Config::default()); | ||
| 25 | |||
| 26 | let mut can = Can::new(p.CAN1, p.PA11, p.PA12, Irqs); | ||
| 27 | |||
| 28 | can.modify_filters().enable_bank(0, Fifo::Fifo0, Mask32::accept_all()); | ||
| 29 | |||
| 30 | can.modify_config() | ||
| 31 | .set_loopback(true) // Receive own frames | ||
| 32 | .set_silent(true) | ||
| 33 | .set_bitrate(250_000); | ||
| 34 | |||
| 35 | can.enable().await; | ||
| 36 | println!("CAN enabled"); | ||
| 37 | |||
| 38 | let mut i = 0; | ||
| 39 | let mut last_read_ts = embassy_time::Instant::now(); | ||
| 40 | loop { | ||
| 41 | let frame = Frame::new_extended(0x123456F, &[i; 8]).unwrap(); | ||
| 42 | info!("Writing frame"); | ||
| 43 | |||
| 44 | _ = can.write(&frame).await; | ||
| 45 | |||
| 46 | match can.read().await { | ||
| 47 | Ok(envelope) => { | ||
| 48 | let (ts, rx_frame) = (envelope.ts, envelope.frame); | ||
| 49 | let delta = (ts - last_read_ts).as_millis(); | ||
| 50 | last_read_ts = ts; | ||
| 51 | info!( | ||
| 52 | "Rx: {} {:02x} --- {}ms", | ||
| 53 | rx_frame.header().len(), | ||
| 54 | rx_frame.data()[0..rx_frame.header().len() as usize], | ||
| 55 | delta, | ||
| 56 | ) | ||
| 57 | } | ||
| 58 | Err(err) => error!("Error in frame: {}", err), | ||
| 59 | } | ||
| 60 | |||
| 61 | Timer::after_millis(250).await; | ||
| 62 | |||
| 63 | i += 1; | ||
| 64 | if i > 2 { | ||
| 65 | break; | ||
| 66 | } | ||
| 67 | } | ||
| 68 | } | ||
