diff options
Diffstat (limited to 'examples/stm32h5/src')
| -rw-r--r-- | examples/stm32h5/src/bin/adc_dma.rs | 94 | ||||
| -rw-r--r-- | examples/stm32h5/src/bin/eth.rs | 3 | ||||
| -rw-r--r-- | examples/stm32h5/src/bin/i2c.rs | 2 | ||||
| -rw-r--r-- | examples/stm32h5/src/bin/sai.rs | 52 | ||||
| -rw-r--r-- | examples/stm32h5/src/bin/stop.rs | 6 | ||||
| -rw-r--r-- | examples/stm32h5/src/bin/usart.rs | 2 | ||||
| -rw-r--r-- | examples/stm32h5/src/bin/usart_dma.rs | 2 | ||||
| -rw-r--r-- | examples/stm32h5/src/bin/usart_split.rs | 2 | ||||
| -rw-r--r-- | examples/stm32h5/src/bin/usb_uac_speaker.rs | 10 |
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 | |||
| 4 | use defmt::*; | ||
| 5 | use embassy_executor::Spawner; | ||
| 6 | use embassy_stm32::adc::{self, Adc, AdcChannel, RxDma, SampleTime}; | ||
| 7 | use embassy_stm32::peripherals::{ADC1, ADC2, GPDMA1_CH0, GPDMA1_CH1, PA0, PA1, PA2, PA3}; | ||
| 8 | use embassy_stm32::{Config, Peri}; | ||
| 9 | use embassy_time::Instant; | ||
| 10 | use {defmt_rtt as _, panic_probe as _}; | ||
| 11 | |||
| 12 | #[embassy_executor::main] | ||
| 13 | async 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] | ||
| 50 | async 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] | ||
| 60 | async 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 | |||
| 69 | async 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; | |||
| 15 | use embassy_stm32::{bind_interrupts, eth, peripherals, rng, Config}; | 15 | use embassy_stm32::{bind_interrupts, eth, peripherals, rng, Config}; |
| 16 | use embassy_time::Timer; | 16 | use embassy_time::Timer; |
| 17 | use embedded_io_async::Write; | 17 | use embedded_io_async::Write; |
| 18 | use rand_core::RngCore; | ||
| 19 | use static_cell::StaticCell; | 18 | use static_cell::StaticCell; |
| 20 | use {defmt_rtt as _, panic_probe as _}; | 19 | use {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 @@ | |||
| 4 | use defmt::*; | 4 | use defmt::*; |
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_stm32::i2c::{Error, I2c}; | 6 | use embassy_stm32::i2c::{Error, I2c}; |
| 7 | use embassy_stm32::time::Hertz; | ||
| 8 | use embassy_stm32::{bind_interrupts, i2c, peripherals}; | 7 | use embassy_stm32::{bind_interrupts, i2c, peripherals}; |
| 9 | use {defmt_rtt as _, panic_probe as _}; | 8 | use {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 | |||
| 4 | use defmt::info; | ||
| 5 | use embassy_executor::Spawner; | ||
| 6 | use embassy_stm32::{sai, Config}; | ||
| 7 | use {defmt_rtt as _, panic_probe as _}; | ||
| 8 | |||
| 9 | #[embassy_executor::main] | ||
| 10 | async 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] |
| 19 | fn main() -> ! { | 19 | fn 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 | } |
