aboutsummaryrefslogtreecommitdiff
path: root/examples/stm32g4
diff options
context:
space:
mode:
authorCorey Schuhen <[email protected]>2024-02-17 18:12:47 +1000
committerCorey Schuhen <[email protected]>2024-02-17 18:26:57 +1000
commit5ad291b708528b5772d6ebcc9309fbd3f8a002c8 (patch)
treed591f9170b2e63f054c85a7650aba70a52dc8c0a /examples/stm32g4
parent91c75c92a0e67c93550a163ae62b22a652bf2012 (diff)
Add a buffered mode.
Diffstat (limited to 'examples/stm32g4')
-rw-r--r--examples/stm32g4/src/bin/can.rs97
1 files changed, 90 insertions, 7 deletions
diff --git a/examples/stm32g4/src/bin/can.rs b/examples/stm32g4/src/bin/can.rs
index 5ff4f0ef0..043ca7144 100644
--- a/examples/stm32g4/src/bin/can.rs
+++ b/examples/stm32g4/src/bin/can.rs
@@ -5,6 +5,7 @@ use embassy_executor::Spawner;
5use embassy_stm32::peripherals::*; 5use embassy_stm32::peripherals::*;
6use embassy_stm32::{bind_interrupts, can, Config}; 6use embassy_stm32::{bind_interrupts, can, Config};
7use embassy_time::Timer; 7use embassy_time::Timer;
8use static_cell::StaticCell;
8use {defmt_rtt as _, panic_probe as _}; 9use {defmt_rtt as _, panic_probe as _};
9 10
10bind_interrupts!(struct Irqs { 11bind_interrupts!(struct Irqs {
@@ -28,13 +29,17 @@ async fn main(_spawner: Spawner) {
28 // 250k bps 29 // 250k bps
29 can.set_bitrate(250_000); 30 can.set_bitrate(250_000);
30 31
32 let use_fd = false;
33
31 // 1M bps 34 // 1M bps
32 can.set_fd_data_bitrate(1_000_000, false); 35 if use_fd {
36 can.set_fd_data_bitrate(1_000_000, false);
37 }
33 38
34 info!("Configured"); 39 info!("Configured");
35 40
36 //let mut can = can.into_normal_mode(); 41 let mut can = can.into_normal_mode();
37 let mut can = can.into_internal_loopback_mode(); 42 //let mut can = can.into_internal_loopback_mode();
38 43
39 let mut i = 0; 44 let mut i = 0;
40 let mut last_read_ts = embassy_time::Instant::now(); 45 let mut last_read_ts = embassy_time::Instant::now();
@@ -68,11 +73,17 @@ async fn main(_spawner: Spawner) {
68 } 73 }
69 74
70 // Use the FD API's even if we don't get FD packets. 75 // Use the FD API's even if we don't get FD packets.
71 loop {
72 let frame = can::frame::FdFrame::new_extended(0x123456F, &[i; 16]).unwrap();
73 info!("Writing frame using FD API");
74 76
75 _ = can.write_fd(&frame).await; 77 loop {
78 if use_fd {
79 let frame = can::frame::FdFrame::new_extended(0x123456F, &[i; 16]).unwrap();
80 info!("Writing frame using FD API");
81 _ = can.write_fd(&frame).await;
82 } else {
83 let frame = can::frame::FdFrame::new_extended(0x123456F, &[i; 8]).unwrap();
84 info!("Writing frame using FD API");
85 _ = can.write_fd(&frame).await;
86 }
76 87
77 match can.read_fd().await { 88 match can.read_fd().await {
78 Ok((rx_frame, ts)) => { 89 Ok((rx_frame, ts)) => {
@@ -96,6 +107,7 @@ async fn main(_spawner: Spawner) {
96 } 107 }
97 } 108 }
98 109
110 i = 0;
99 let (mut tx, mut rx) = can.split(); 111 let (mut tx, mut rx) = can.split();
100 // With split 112 // With split
101 loop { 113 loop {
@@ -120,5 +132,76 @@ async fn main(_spawner: Spawner) {
120 Timer::after_millis(250).await; 132 Timer::after_millis(250).await;
121 133
122 i += 1; 134 i += 1;
135
136 if i > 2 {
137 break;
138 }
139 }
140
141 let can = can::Fdcan::join(tx, rx);
142
143 info!("\n\n\nBuffered\n");
144 if use_fd {
145 static TX_BUF: StaticCell<can::TxFdBuf<8>> = StaticCell::new();
146 static RX_BUF: StaticCell<can::RxFdBuf<10>> = StaticCell::new();
147 let mut can = can.buffered_fd(
148 TX_BUF.init(can::TxFdBuf::<8>::new()),
149 RX_BUF.init(can::RxFdBuf::<10>::new()),
150 );
151 loop {
152 let frame = can::frame::FdFrame::new_extended(0x123456F, &[i; 16]).unwrap();
153 info!("Writing frame");
154
155 _ = can.write(frame).await;
156
157 match can.read().await {
158 Ok((rx_frame, ts)) => {
159 let delta = (ts - last_read_ts).as_millis();
160 last_read_ts = ts;
161 info!(
162 "Rx: {} {:02x} --- {}ms",
163 rx_frame.header().len(),
164 rx_frame.data()[0..rx_frame.header().len() as usize],
165 delta,
166 )
167 }
168 Err(_err) => error!("Error in frame"),
169 }
170
171 Timer::after_millis(250).await;
172
173 i += 1;
174 }
175 } else {
176 static TX_BUF: StaticCell<can::TxBuf<8>> = StaticCell::new();
177 static RX_BUF: StaticCell<can::RxBuf<10>> = StaticCell::new();
178 let mut can = can.buffered(
179 TX_BUF.init(can::TxBuf::<8>::new()),
180 RX_BUF.init(can::RxBuf::<10>::new()),
181 );
182 loop {
183 let frame = can::frame::ClassicFrame::new_extended(0x123456F, &[i; 8]).unwrap();
184 info!("Writing frame");
185
186 _ = can.write(frame).await;
187
188 match can.read().await {
189 Ok((rx_frame, ts)) => {
190 let delta = (ts - last_read_ts).as_millis();
191 last_read_ts = ts;
192 info!(
193 "Rx: {} {:02x} --- {}ms",
194 rx_frame.header().len(),
195 rx_frame.data()[0..rx_frame.header().len() as usize],
196 delta,
197 )
198 }
199 Err(_err) => error!("Error in frame"),
200 }
201
202 Timer::after_millis(250).await;
203
204 i += 1;
205 }
123 } 206 }
124} 207}