aboutsummaryrefslogtreecommitdiff
path: root/examples/stm32h5/src
diff options
context:
space:
mode:
Diffstat (limited to 'examples/stm32h5/src')
-rw-r--r--examples/stm32h5/src/bin/adc_dma.rs94
-rw-r--r--examples/stm32h5/src/bin/eth.rs3
-rw-r--r--examples/stm32h5/src/bin/i2c.rs2
-rw-r--r--examples/stm32h5/src/bin/sai.rs52
-rw-r--r--examples/stm32h5/src/bin/stop.rs6
-rw-r--r--examples/stm32h5/src/bin/usart.rs2
-rw-r--r--examples/stm32h5/src/bin/usart_dma.rs2
-rw-r--r--examples/stm32h5/src/bin/usart_split.rs2
-rw-r--r--examples/stm32h5/src/bin/usb_uac_speaker.rs10
9 files changed, 158 insertions, 15 deletions
diff --git a/examples/stm32h5/src/bin/adc_dma.rs b/examples/stm32h5/src/bin/adc_dma.rs
new file mode 100644
index 000000000..fb9fcbc5c
--- /dev/null
+++ b/examples/stm32h5/src/bin/adc_dma.rs
@@ -0,0 +1,94 @@
1#![no_std]
2#![no_main]
3
4use defmt::*;
5use embassy_executor::Spawner;
6use embassy_stm32::adc::{self, Adc, AdcChannel, RxDma, SampleTime};
7use embassy_stm32::peripherals::{ADC1, ADC2, GPDMA1_CH0, GPDMA1_CH1, PA0, PA1, PA2, PA3};
8use embassy_stm32::{Config, Peri};
9use embassy_time::Instant;
10use {defmt_rtt as _, panic_probe as _};
11
12#[embassy_executor::main]
13async fn main(spawner: Spawner) {
14 let mut config = Config::default();
15 {
16 use embassy_stm32::rcc::*;
17 config.rcc.hsi = Some(HSIPrescaler::DIV1);
18 config.rcc.csi = true;
19 config.rcc.pll1 = Some(Pll {
20 source: PllSource::HSI,
21 prediv: PllPreDiv::DIV4,
22 mul: PllMul::MUL25,
23 divp: Some(PllDiv::DIV2),
24 divq: Some(PllDiv::DIV4), // SPI1 cksel defaults to pll1_q
25 divr: None,
26 });
27 config.rcc.pll2 = Some(Pll {
28 source: PllSource::HSI,
29 prediv: PllPreDiv::DIV4,
30 mul: PllMul::MUL25,
31 divp: None,
32 divq: None,
33 divr: Some(PllDiv::DIV4), // 100mhz
34 });
35 config.rcc.sys = Sysclk::PLL1_P; // 200 Mhz
36 config.rcc.ahb_pre = AHBPrescaler::DIV1; // 200 Mhz
37 config.rcc.apb1_pre = APBPrescaler::DIV2; // 100 Mhz
38 config.rcc.apb2_pre = APBPrescaler::DIV2; // 100 Mhz
39 config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz
40 config.rcc.voltage_scale = VoltageScale::Scale1;
41 config.rcc.mux.adcdacsel = mux::Adcdacsel::PLL2_R;
42 }
43 let p = embassy_stm32::init(config);
44
45 spawner.spawn(unwrap!(adc1_task(p.ADC1, p.GPDMA1_CH0, p.PA0, p.PA2)));
46 spawner.spawn(unwrap!(adc2_task(p.ADC2, p.GPDMA1_CH1, p.PA1, p.PA3)));
47}
48
49#[embassy_executor::task]
50async fn adc1_task(
51 adc: Peri<'static, ADC1>,
52 dma: Peri<'static, GPDMA1_CH0>,
53 pin1: Peri<'static, PA0>,
54 pin2: Peri<'static, PA2>,
55) {
56 adc_task(adc, dma, pin1, pin2).await;
57}
58
59#[embassy_executor::task]
60async fn adc2_task(
61 adc: Peri<'static, ADC2>,
62 dma: Peri<'static, GPDMA1_CH1>,
63 pin1: Peri<'static, PA1>,
64 pin2: Peri<'static, PA3>,
65) {
66 adc_task(adc, dma, pin1, pin2).await;
67}
68
69async fn adc_task<'a, T: adc::Instance>(
70 adc: Peri<'a, T>,
71 mut dma: Peri<'a, impl RxDma<T>>,
72 pin1: impl AdcChannel<T>,
73 pin2: impl AdcChannel<T>,
74) {
75 let mut adc = Adc::new(adc);
76 let mut pin1 = pin1.degrade_adc();
77 let mut pin2 = pin2.degrade_adc();
78
79 let mut tic = Instant::now();
80 let mut buffer = [0u16; 512];
81 loop {
82 // This is not a true continuous read as there is downtime between each
83 // call to `Adc::read` where the ADC is sitting idle.
84 adc.read(
85 dma.reborrow(),
86 [(&mut pin1, SampleTime::CYCLES2_5), (&mut pin2, SampleTime::CYCLES2_5)].into_iter(),
87 &mut buffer,
88 )
89 .await;
90 let toc = Instant::now();
91 info!("\n adc1: {} dt = {}", buffer[0..16], (toc - tic).as_micros());
92 tic = toc;
93 }
94}
diff --git a/examples/stm32h5/src/bin/eth.rs b/examples/stm32h5/src/bin/eth.rs
index 4034b552c..a84fe358b 100644
--- a/examples/stm32h5/src/bin/eth.rs
+++ b/examples/stm32h5/src/bin/eth.rs
@@ -15,7 +15,6 @@ use embassy_stm32::time::Hertz;
15use embassy_stm32::{bind_interrupts, eth, peripherals, rng, Config}; 15use embassy_stm32::{bind_interrupts, eth, peripherals, rng, Config};
16use embassy_time::Timer; 16use embassy_time::Timer;
17use embedded_io_async::Write; 17use embedded_io_async::Write;
18use rand_core::RngCore;
19use static_cell::StaticCell; 18use static_cell::StaticCell;
20use {defmt_rtt as _, panic_probe as _}; 19use {defmt_rtt as _, panic_probe as _};
21 20
@@ -95,7 +94,7 @@ async fn main(spawner: Spawner) -> ! {
95 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 94 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
96 95
97 // Launch network task 96 // Launch network task
98 unwrap!(spawner.spawn(net_task(runner))); 97 spawner.spawn(unwrap!(net_task(runner)));
99 98
100 // Ensure DHCP configuration is up before trying connect 99 // Ensure DHCP configuration is up before trying connect
101 stack.wait_config_up().await; 100 stack.wait_config_up().await;
diff --git a/examples/stm32h5/src/bin/i2c.rs b/examples/stm32h5/src/bin/i2c.rs
index 31e83cbb5..870c57e0f 100644
--- a/examples/stm32h5/src/bin/i2c.rs
+++ b/examples/stm32h5/src/bin/i2c.rs
@@ -4,7 +4,6 @@
4use defmt::*; 4use defmt::*;
5use embassy_executor::Spawner; 5use embassy_executor::Spawner;
6use embassy_stm32::i2c::{Error, I2c}; 6use embassy_stm32::i2c::{Error, I2c};
7use embassy_stm32::time::Hertz;
8use embassy_stm32::{bind_interrupts, i2c, peripherals}; 7use embassy_stm32::{bind_interrupts, i2c, peripherals};
9use {defmt_rtt as _, panic_probe as _}; 8use {defmt_rtt as _, panic_probe as _};
10 9
@@ -28,7 +27,6 @@ async fn main(_spawner: Spawner) {
28 Irqs, 27 Irqs,
29 p.GPDMA1_CH4, 28 p.GPDMA1_CH4,
30 p.GPDMA1_CH5, 29 p.GPDMA1_CH5,
31 Hertz(100_000),
32 Default::default(), 30 Default::default(),
33 ); 31 );
34 32
diff --git a/examples/stm32h5/src/bin/sai.rs b/examples/stm32h5/src/bin/sai.rs
new file mode 100644
index 000000000..0e182f9cf
--- /dev/null
+++ b/examples/stm32h5/src/bin/sai.rs
@@ -0,0 +1,52 @@
1#![no_std]
2#![no_main]
3
4use defmt::info;
5use embassy_executor::Spawner;
6use embassy_stm32::{sai, Config};
7use {defmt_rtt as _, panic_probe as _};
8
9#[embassy_executor::main]
10async fn main(_spawner: Spawner) {
11 info!("Hello world.");
12
13 let mut config = Config::default();
14 {
15 use embassy_stm32::rcc::*;
16
17 config.rcc.pll2 = Some(Pll {
18 source: PllSource::HSI,
19 prediv: PllPreDiv::DIV16,
20 mul: PllMul::MUL32,
21 divp: Some(PllDiv::DIV16), // 8 MHz SAI clock
22 divq: None,
23 divr: None,
24 });
25
26 config.rcc.mux.sai1sel = mux::Saisel::PLL2_P;
27 }
28 let p = embassy_stm32::init(config);
29
30 let mut write_buffer = [0u16; 1024];
31 let (_, sai_b) = sai::split_subblocks(p.SAI1);
32
33 let mut sai_b = sai::Sai::new_asynchronous(
34 sai_b,
35 p.PF8,
36 p.PE3,
37 p.PF9,
38 p.GPDMA1_CH0,
39 &mut write_buffer,
40 Default::default(),
41 );
42
43 // Populate arbitrary data.
44 let mut data = [0u16; 256];
45 for (index, sample) in data.iter_mut().enumerate() {
46 *sample = index as u16;
47 }
48
49 loop {
50 sai_b.write(&data).await.unwrap();
51 }
52}
diff --git a/examples/stm32h5/src/bin/stop.rs b/examples/stm32h5/src/bin/stop.rs
index e650791c5..3c4f49f64 100644
--- a/examples/stm32h5/src/bin/stop.rs
+++ b/examples/stm32h5/src/bin/stop.rs
@@ -18,7 +18,7 @@ use {defmt_rtt as _, panic_probe as _};
18#[cortex_m_rt::entry] 18#[cortex_m_rt::entry]
19fn main() -> ! { 19fn main() -> ! {
20 Executor::take().run(|spawner| { 20 Executor::take().run(|spawner| {
21 unwrap!(spawner.spawn(async_main(spawner))); 21 spawner.spawn(unwrap!(async_main(spawner)));
22 }) 22 })
23} 23}
24 24
@@ -43,8 +43,8 @@ async fn async_main(spawner: Spawner) {
43 let rtc = RTC.init(rtc); 43 let rtc = RTC.init(rtc);
44 embassy_stm32::low_power::stop_with_rtc(rtc); 44 embassy_stm32::low_power::stop_with_rtc(rtc);
45 45
46 unwrap!(spawner.spawn(blinky(p.PB4.into()))); 46 spawner.spawn(unwrap!(blinky(p.PB4.into())));
47 unwrap!(spawner.spawn(timeout())); 47 spawner.spawn(unwrap!(timeout()));
48} 48}
49 49
50#[embassy_executor::task] 50#[embassy_executor::task]
diff --git a/examples/stm32h5/src/bin/usart.rs b/examples/stm32h5/src/bin/usart.rs
index cc49c2fdb..264e7d582 100644
--- a/examples/stm32h5/src/bin/usart.rs
+++ b/examples/stm32h5/src/bin/usart.rs
@@ -34,6 +34,6 @@ fn main() -> ! {
34 let executor = EXECUTOR.init(Executor::new()); 34 let executor = EXECUTOR.init(Executor::new());
35 35
36 executor.run(|spawner| { 36 executor.run(|spawner| {
37 unwrap!(spawner.spawn(main_task())); 37 spawner.spawn(unwrap!(main_task()));
38 }) 38 })
39} 39}
diff --git a/examples/stm32h5/src/bin/usart_dma.rs b/examples/stm32h5/src/bin/usart_dma.rs
index c644e84bd..ea48515d7 100644
--- a/examples/stm32h5/src/bin/usart_dma.rs
+++ b/examples/stm32h5/src/bin/usart_dma.rs
@@ -42,6 +42,6 @@ fn main() -> ! {
42 let executor = EXECUTOR.init(Executor::new()); 42 let executor = EXECUTOR.init(Executor::new());
43 43
44 executor.run(|spawner| { 44 executor.run(|spawner| {
45 unwrap!(spawner.spawn(main_task())); 45 spawner.spawn(unwrap!(main_task()));
46 }) 46 })
47} 47}
diff --git a/examples/stm32h5/src/bin/usart_split.rs b/examples/stm32h5/src/bin/usart_split.rs
index d26c5003c..f56c1c57d 100644
--- a/examples/stm32h5/src/bin/usart_split.rs
+++ b/examples/stm32h5/src/bin/usart_split.rs
@@ -27,7 +27,7 @@ async fn main(spawner: Spawner) -> ! {
27 27
28 let (mut tx, rx) = usart.split(); 28 let (mut tx, rx) = usart.split();
29 29
30 unwrap!(spawner.spawn(reader(rx))); 30 spawner.spawn(unwrap!(reader(rx)));
31 31
32 loop { 32 loop {
33 let buf = CHANNEL.receive().await; 33 let buf = CHANNEL.receive().await;
diff --git a/examples/stm32h5/src/bin/usb_uac_speaker.rs b/examples/stm32h5/src/bin/usb_uac_speaker.rs
index 5d007261c..86873cabd 100644
--- a/examples/stm32h5/src/bin/usb_uac_speaker.rs
+++ b/examples/stm32h5/src/bin/usb_uac_speaker.rs
@@ -366,9 +366,9 @@ async fn main(spawner: Spawner) {
366 } 366 }
367 367
368 // Launch USB audio tasks. 368 // Launch USB audio tasks.
369 unwrap!(spawner.spawn(usb_control_task(control_monitor))); 369 spawner.spawn(unwrap!(usb_control_task(control_monitor)));
370 unwrap!(spawner.spawn(usb_streaming_task(stream, sender))); 370 spawner.spawn(unwrap!(usb_streaming_task(stream, sender)));
371 unwrap!(spawner.spawn(usb_feedback_task(feedback))); 371 spawner.spawn(unwrap!(usb_feedback_task(feedback)));
372 unwrap!(spawner.spawn(usb_task(usb_device))); 372 spawner.spawn(unwrap!(usb_task(usb_device)));
373 unwrap!(spawner.spawn(audio_receiver_task(receiver))); 373 spawner.spawn(unwrap!(audio_receiver_task(receiver)));
374} 374}