From 803b809e5dbe7651b7171917e02289b067e90dad Mon Sep 17 00:00:00 2001 From: liebman Date: Sat, 13 Dec 2025 08:36:04 -0800 Subject: stm32: set pins to ANALOG on init --- embassy-stm32/build.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs index 46d6290e7..665717e26 100644 --- a/embassy-stm32/build.rs +++ b/embassy-stm32/build.rs @@ -950,6 +950,24 @@ fn main() { } } + for p in METADATA.peripherals { + // only set GPIOs to analog mode for GPIOs that are not version 1 + // version 1 uses 0b00 for analog mode instead of 0b11 and has no ALTERNATE mode (0b10 for v2) + if p.registers.is_some() && p.registers.as_ref().unwrap().kind == "gpio" && p.registers.as_ref().unwrap().version != "v1" { + let port = format_ident!("{}", p.name); + let value = if p.name == "GPIOA" { + // GPIOA is special because it has a special mode for PA13 and PA14 which are SWDIO and SWDCLK + // and we leave those as ALTERNATE mode (0b10) + 0b11_10_10_11_11_11_11_11_11_11_11_11_11_11_11_11_u32 + } else { + u32::MAX + }; + gg.extend(quote! { + crate::pac::#port.moder().modify(|w| w.0 = #value); + }) + } + } + let fname = format_ident!("init_{}", kind); g.extend(quote! { pub unsafe fn #fname(){ -- cgit From 67a67c7d3cd9a5e2b917b108bfdebc858a2f79a3 Mon Sep 17 00:00:00 2001 From: liebman Date: Sat, 13 Dec 2025 10:01:57 -0800 Subject: stm32: update stm32wle5 low powe examples --- examples/stm32wle5/src/bin/adc.rs | 18 ------------------ examples/stm32wle5/src/bin/blinky.rs | 22 ++-------------------- examples/stm32wle5/src/bin/button_exti.rs | 18 ------------------ examples/stm32wle5/src/bin/i2c.rs | 23 +++-------------------- 4 files changed, 5 insertions(+), 76 deletions(-) diff --git a/examples/stm32wle5/src/bin/adc.rs b/examples/stm32wle5/src/bin/adc.rs index ea91fb063..8cc84ccdf 100644 --- a/examples/stm32wle5/src/bin/adc.rs +++ b/examples/stm32wle5/src/bin/adc.rs @@ -34,24 +34,6 @@ async fn async_main(_spawner: Spawner) { // Initialize STM32WL peripherals (use default config like wio-e5-async example) let p = embassy_stm32::init(config); - // start with all GPIOs as analog to reduce power consumption - for r in [ - embassy_stm32::pac::GPIOA, - embassy_stm32::pac::GPIOB, - embassy_stm32::pac::GPIOC, - embassy_stm32::pac::GPIOH, - ] { - r.moder().modify(|w| { - for i in 0..16 { - // don't reset these if probe-rs should stay connected! - #[cfg(feature = "defmt-rtt")] - if config.enable_debug_during_sleep && r == embassy_stm32::pac::GPIOA && [13, 14].contains(&i) { - continue; - } - w.set_moder(i, embassy_stm32::pac::gpio::vals::Moder::ANALOG); - } - }); - } #[cfg(feature = "defmt-serial")] { use embassy_stm32::mode::Blocking; diff --git a/examples/stm32wle5/src/bin/blinky.rs b/examples/stm32wle5/src/bin/blinky.rs index 9f0c04672..3b7eb7761 100644 --- a/examples/stm32wle5/src/bin/blinky.rs +++ b/examples/stm32wle5/src/bin/blinky.rs @@ -32,24 +32,6 @@ async fn async_main(_spawner: Spawner) { // Initialize STM32WL peripherals (use default config like wio-e5-async example) let p = embassy_stm32::init(config); - // start with all GPIOs as analog to reduce power consumption - for r in [ - embassy_stm32::pac::GPIOA, - embassy_stm32::pac::GPIOB, - embassy_stm32::pac::GPIOC, - embassy_stm32::pac::GPIOH, - ] { - r.moder().modify(|w| { - for i in 0..16 { - // don't reset these if probe-rs should stay connected! - #[cfg(feature = "defmt-rtt")] - if config.enable_debug_during_sleep && r == embassy_stm32::pac::GPIOA && [13, 14].contains(&i) { - continue; - } - w.set_moder(i, embassy_stm32::pac::gpio::vals::Moder::ANALOG); - } - }); - } #[cfg(feature = "defmt-serial")] { use embassy_stm32::mode::Blocking; @@ -67,10 +49,10 @@ async fn async_main(_spawner: Spawner) { loop { info!("low"); led.set_low(); - Timer::after_millis(500).await; + Timer::after_millis(15000).await; info!("high"); led.set_high(); - Timer::after_millis(500).await; + Timer::after_millis(15000).await; } } diff --git a/examples/stm32wle5/src/bin/button_exti.rs b/examples/stm32wle5/src/bin/button_exti.rs index f248b6147..9ffc39948 100644 --- a/examples/stm32wle5/src/bin/button_exti.rs +++ b/examples/stm32wle5/src/bin/button_exti.rs @@ -39,24 +39,6 @@ async fn async_main(_spawner: Spawner) { // Initialize STM32WL peripherals (use default config like wio-e5-async example) let p = embassy_stm32::init(config); - // start with all GPIOs as analog to reduce power consumption - for r in [ - embassy_stm32::pac::GPIOA, - embassy_stm32::pac::GPIOB, - embassy_stm32::pac::GPIOC, - embassy_stm32::pac::GPIOH, - ] { - r.moder().modify(|w| { - for i in 0..16 { - // don't reset these if probe-rs should stay connected! - #[cfg(feature = "defmt-rtt")] - if config.enable_debug_during_sleep && r == embassy_stm32::pac::GPIOA && [13, 14].contains(&i) { - continue; - } - w.set_moder(i, embassy_stm32::pac::gpio::vals::Moder::ANALOG); - } - }); - } #[cfg(feature = "defmt-serial")] { use embassy_stm32::mode::Blocking; diff --git a/examples/stm32wle5/src/bin/i2c.rs b/examples/stm32wle5/src/bin/i2c.rs index 68c17a672..bd94c061f 100644 --- a/examples/stm32wle5/src/bin/i2c.rs +++ b/examples/stm32wle5/src/bin/i2c.rs @@ -40,24 +40,6 @@ async fn async_main(_spawner: Spawner) { // Initialize STM32WL peripherals (use default config like wio-e5-async example) let p = embassy_stm32::init(config); - // start with all GPIOs as analog to reduce power consumption - for r in [ - embassy_stm32::pac::GPIOA, - embassy_stm32::pac::GPIOB, - embassy_stm32::pac::GPIOC, - embassy_stm32::pac::GPIOH, - ] { - r.moder().modify(|w| { - for i in 0..16 { - // don't reset these if probe-rs should stay connected! - #[cfg(feature = "defmt-rtt")] - if config.enable_debug_during_sleep && r == embassy_stm32::pac::GPIOA && [13, 14].contains(&i) { - continue; - } - w.set_moder(i, embassy_stm32::pac::gpio::vals::Moder::ANALOG); - } - }); - } #[cfg(feature = "defmt-serial")] { use embassy_stm32::mode::Blocking; @@ -79,14 +61,15 @@ async fn async_main(_spawner: Spawner) { let mut i2c = I2c::new(p.I2C2, p.PB15, p.PA15, IrqsI2C, p.DMA1_CH6, p.DMA1_CH7, { let mut config = i2c::Config::default(); config.frequency = Hertz::khz(100); - config.timeout = Duration::from_millis(500); + config.timeout = Duration::from_millis(1000); config }); + let _device_busy = low_power::DeviceBusy::new_stop2(); loop { let mut buffer = [0; 2]; // read the temperature register of the onboard lm75 - match i2c.read(0x48, &mut buffer).await { + match i2c.write_read(0x48, &[0x00], &mut buffer).await { Ok(_) => info!("--> {:?}", buffer), Err(e) => info!("--> Error: {:?}", e), } -- cgit From 6a1b9e26b4779308a4006a518aa65a4785b37460 Mon Sep 17 00:00:00 2001 From: liebman Date: Sat, 13 Dec 2025 10:04:15 -0800 Subject: stm32: set pins to ANALOG on init only change specific pins --- embassy-stm32/build.rs | 63 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 15 deletions(-) diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs index 665717e26..45b2e79a5 100644 --- a/embassy-stm32/build.rs +++ b/embassy-stm32/build.rs @@ -950,21 +950,54 @@ fn main() { } } - for p in METADATA.peripherals { - // only set GPIOs to analog mode for GPIOs that are not version 1 - // version 1 uses 0b00 for analog mode instead of 0b11 and has no ALTERNATE mode (0b10 for v2) - if p.registers.is_some() && p.registers.as_ref().unwrap().kind == "gpio" && p.registers.as_ref().unwrap().version != "v1" { - let port = format_ident!("{}", p.name); - let value = if p.name == "GPIOA" { - // GPIOA is special because it has a special mode for PA13 and PA14 which are SWDIO and SWDCLK - // and we leave those as ALTERNATE mode (0b10) - 0b11_10_10_11_11_11_11_11_11_11_11_11_11_11_11_11_u32 - } else { - u32::MAX - }; - gg.extend(quote! { - crate::pac::#port.moder().modify(|w| w.0 = #value); - }) + if kind == "gpio" { + for p in METADATA.peripherals { + // set all GPIOs to analog mode except for PA13 and PA14 which are SWDIO and SWDCLK + if p.registers.is_some() && p.registers.as_ref().unwrap().kind == "gpio" { + let port = format_ident!("{}", p.name); + if p.name == "GPIOA" { + gg.extend(quote! { + // leave PA13 and PA14 as unchanged + crate::pac::#port.moder().modify(|w| { + w.set_moder(0, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(1, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(2, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(3, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(4, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(5, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(6, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(7, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(8, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(9, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(10, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(11, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(12, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(15, crate::pac::gpio::vals::Moder::ANALOG); + }); + }); + } else { + gg.extend(quote! { + crate::pac::#port.moder().modify(|w| { + w.set_moder(0, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(1, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(2, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(3, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(4, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(5, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(6, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(7, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(8, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(9, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(10, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(11, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(12, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(13, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(14, crate::pac::gpio::vals::Moder::ANALOG); + w.set_moder(15, crate::pac::gpio::vals::Moder::ANALOG); + }); + }); + } + } } } -- cgit From 875093747b7dbd6c7d64c8a307b94072ec420397 Mon Sep 17 00:00:00 2001 From: liebman Date: Sat, 13 Dec 2025 10:40:36 -0800 Subject: stm32: only set analog if not v1 --- embassy-stm32/build.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs index 45b2e79a5..a3b863340 100644 --- a/embassy-stm32/build.rs +++ b/embassy-stm32/build.rs @@ -953,7 +953,10 @@ fn main() { if kind == "gpio" { for p in METADATA.peripherals { // set all GPIOs to analog mode except for PA13 and PA14 which are SWDIO and SWDCLK - if p.registers.is_some() && p.registers.as_ref().unwrap().kind == "gpio" { + if p.registers.is_some() + && p.registers.as_ref().unwrap().kind == "gpio" + && p.registers.as_ref().unwrap().version != "v1" + { let port = format_ident!("{}", p.name); if p.name == "GPIOA" { gg.extend(quote! { -- cgit From edc58c3f1122196313dada19f0068bb948775f12 Mon Sep 17 00:00:00 2001 From: liebman Date: Sat, 13 Dec 2025 12:08:28 -0800 Subject: stm32: remove unneeded DeviceBusy --- examples/stm32wle5/src/bin/i2c.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/stm32wle5/src/bin/i2c.rs b/examples/stm32wle5/src/bin/i2c.rs index bd94c061f..8e7a6e2d8 100644 --- a/examples/stm32wle5/src/bin/i2c.rs +++ b/examples/stm32wle5/src/bin/i2c.rs @@ -65,11 +65,10 @@ async fn async_main(_spawner: Spawner) { config }); - let _device_busy = low_power::DeviceBusy::new_stop2(); loop { let mut buffer = [0; 2]; // read the temperature register of the onboard lm75 - match i2c.write_read(0x48, &[0x00], &mut buffer).await { + match i2c.read(0x48, &mut buffer).await { Ok(_) => info!("--> {:?}", buffer), Err(e) => info!("--> Error: {:?}", e), } -- cgit