Merge pull request #2983 from reneherrero/main
Added a CAN example for the stm32l4
This commit is contained in:
		
						commit
						68e784ccd6
					
				
							
								
								
									
										68
									
								
								examples/stm32l4/src/bin/can.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								examples/stm32l4/src/bin/can.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,68 @@ | |||||||
|  | #![no_std] | ||||||
|  | #![no_main] | ||||||
|  | 
 | ||||||
|  | use defmt::*; | ||||||
|  | use embassy_executor::Spawner; | ||||||
|  | use embassy_stm32::can::filter::Mask32; | ||||||
|  | use embassy_stm32::can::{ | ||||||
|  |     Can, Fifo, Frame, Rx0InterruptHandler, Rx1InterruptHandler, SceInterruptHandler, TxInterruptHandler, | ||||||
|  | }; | ||||||
|  | use embassy_stm32::peripherals::CAN1; | ||||||
|  | use embassy_stm32::{bind_interrupts, Config}; | ||||||
|  | use embassy_time::Timer; | ||||||
|  | use {defmt_rtt as _, panic_probe as _}; | ||||||
|  | 
 | ||||||
|  | bind_interrupts!(struct Irqs { | ||||||
|  |     CAN1_RX0 => Rx0InterruptHandler<CAN1>; | ||||||
|  |     CAN1_RX1 => Rx1InterruptHandler<CAN1>; | ||||||
|  |     CAN1_SCE => SceInterruptHandler<CAN1>; | ||||||
|  |     CAN1_TX => TxInterruptHandler<CAN1>; | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | #[embassy_executor::main] | ||||||
|  | async fn main(_spawner: Spawner) { | ||||||
|  |     let p = embassy_stm32::init(Config::default()); | ||||||
|  | 
 | ||||||
|  |     let mut can = Can::new(p.CAN1, p.PA11, p.PA12, Irqs); | ||||||
|  | 
 | ||||||
|  |     can.modify_filters().enable_bank(0, Fifo::Fifo0, Mask32::accept_all()); | ||||||
|  | 
 | ||||||
|  |     can.modify_config() | ||||||
|  |         .set_loopback(true) // Receive own frames
 | ||||||
|  |         .set_silent(true) | ||||||
|  |         .set_bitrate(250_000); | ||||||
|  | 
 | ||||||
|  |     can.enable().await; | ||||||
|  |     println!("CAN enabled"); | ||||||
|  | 
 | ||||||
|  |     let mut i = 0; | ||||||
|  |     let mut last_read_ts = embassy_time::Instant::now(); | ||||||
|  |     loop { | ||||||
|  |         let frame = Frame::new_extended(0x123456F, &[i; 8]).unwrap(); | ||||||
|  |         info!("Writing frame"); | ||||||
|  | 
 | ||||||
|  |         _ = can.write(&frame).await; | ||||||
|  | 
 | ||||||
|  |         match can.read().await { | ||||||
|  |             Ok(envelope) => { | ||||||
|  |                 let (ts, rx_frame) = (envelope.ts, envelope.frame); | ||||||
|  |                 let delta = (ts - last_read_ts).as_millis(); | ||||||
|  |                 last_read_ts = ts; | ||||||
|  |                 info!( | ||||||
|  |                     "Rx: {} {:02x} --- {}ms", | ||||||
|  |                     rx_frame.header().len(), | ||||||
|  |                     rx_frame.data()[0..rx_frame.header().len() as usize], | ||||||
|  |                     delta, | ||||||
|  |                 ) | ||||||
|  |             } | ||||||
|  |             Err(err) => error!("Error in frame: {}", err), | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         Timer::after_millis(250).await; | ||||||
|  | 
 | ||||||
|  |         i += 1; | ||||||
|  |         if i > 2 { | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user