diff --git a/embassy-stm32/src/rcc/h.rs b/embassy-stm32/src/rcc/h.rs index 55543472c..644647d91 100644 --- a/embassy-stm32/src/rcc/h.rs +++ b/embassy-stm32/src/rcc/h.rs @@ -120,6 +120,7 @@ impl From for Timpre { /// Power supply configuration /// See RM0433 Rev 4 7.4 #[cfg(any(pwr_h7rm0399, pwr_h7rm0455, pwr_h7rm0468))] +#[derive(PartialEq)] pub enum SupplyConfig { /// Default power supply configuration. /// V CORE Power Domains are supplied from the LDO according to VOS. @@ -143,31 +144,43 @@ pub enum SupplyConfig { /// LDO power mode (Main, LP, Off) will follow system low-power modes. /// SMPS step-down converter enabled according to SDLEVEL, and supplies the LDO. /// SMPS step-down converter power mode (MR, LP, Off) will follow system low-power modes. - SMPSLDO, + SMPSLDO(SMPSSupplyVoltage), /// Power supply configuration from SMPS supplying external circuits and potentially the LDO. /// V CORE Power Domains are supplied from voltage regulator according to VOS /// LDO power mode (Main, LP, Off) will follow system low-power modes. /// SMPS step-down converter enabled according to SDLEVEL used to supply external circuits and may supply the LDO. /// SMPS step-down converter forced ON in MR mode. - SMPSExternalLDO, + SMPSExternalLDO(SMPSSupplyVoltage), /// Power supply configuration from SMPS supplying external circuits and bypassing the LDO. /// V CORE supplied from external source /// SMPS step-down converter enabled according to SDLEVEL used to supply external circuits and may supply the external source for V CORE . /// SMPS step-down converter forced ON in MR mode. - SMPSExternalLDOBypass, + SMPSExternalLDOBypass(SMPSSupplyVoltage), } /// SMPS step-down converter voltage output level. /// This is only used in certain power supply configurations: /// SMPSLDO, SMPSExternalLDO, SMPSExternalLDOBypass. #[cfg(any(pwr_h7rm0399, pwr_h7rm0455, pwr_h7rm0468))] +#[derive(PartialEq)] pub enum SMPSSupplyVoltage { V1_8, V2_5, } +#[cfg(any(pwr_h7rm0399, pwr_h7rm0455, pwr_h7rm0468))] +impl SMPSSupplyVoltage { + /// Convert SMPSSupplyVoltage to u8 representation. + fn to_u8(&self) -> u8 { + match self { + SMPSSupplyVoltage::V1_8 => 0b01, + SMPSSupplyVoltage::V2_5 => 0b10, + } + } +} + /// Configuration of the core clocks #[non_exhaustive] pub struct Config { @@ -198,7 +211,6 @@ pub struct Config { #[cfg(any(pwr_h7rm0399, pwr_h7rm0455, pwr_h7rm0468))] pub supply_config: SupplyConfig, - pub smps_supply_voltage: Option, } impl Default for Config { @@ -235,7 +247,6 @@ impl Default for Config { #[cfg(any(pwr_h7rm0399, pwr_h7rm0455, pwr_h7rm0468))] supply_config: SupplyConfig::Default, - smps_supply_voltage: None, } } } @@ -280,61 +291,21 @@ pub(crate) unsafe fn init(config: Config) { w.set_bypass(false); }); } - SupplyConfig::SMPSLDO => { + SupplyConfig::SMPSLDO(ref smps_supply_voltage) + | SupplyConfig::SMPSExternalLDO(ref smps_supply_voltage) + | SupplyConfig::SMPSExternalLDOBypass(ref smps_supply_voltage) => { PWR.cr3().modify(|w| { - match config.smps_supply_voltage { - Some(SMPSSupplyVoltage::V1_8) => { - PWR.cr3().modify(|w| w.set_sdlevel(0b01)); - } - Some(SMPSSupplyVoltage::V2_5) => { - PWR.cr3().modify(|w| w.set_sdlevel(0b10)); - } - None => { - panic!("Supply configuration SMPSLDO requires a supply voltage to be set."); - } - } - w.set_sdexthp(false); + w.set_sdlevel(smps_supply_voltage.to_u8()); + w.set_sdexthp(matches!( + config.supply_config, + SupplyConfig::SMPSExternalLDO(_) | SupplyConfig::SMPSExternalLDOBypass(_) + )); w.set_sden(true); - w.set_ldoen(true); - w.set_bypass(false); - }); - } - SupplyConfig::SMPSExternalLDO => { - PWR.cr3().modify(|w| { - match config.smps_supply_voltage { - Some(SMPSSupplyVoltage::V1_8) => { - PWR.cr3().modify(|w| w.set_sdlevel(0b01)); - } - Some(SMPSSupplyVoltage::V2_5) => { - PWR.cr3().modify(|w| w.set_sdlevel(0b10)); - } - None => { - panic!("Supply configuration SMPSExternalLDO requires a supply voltage to be set."); - } - } - w.set_sdexthp(true); - w.set_sden(true); - w.set_ldoen(true); - w.set_bypass(false); - }); - } - SupplyConfig::SMPSExternalLDOBypass => { - PWR.cr3().modify(|w| { - match config.smps_supply_voltage { - Some(SMPSSupplyVoltage::V1_8) => { - PWR.cr3().modify(|w| w.set_sdlevel(0b01)); - } - Some(SMPSSupplyVoltage::V2_5) => { - PWR.cr3().modify(|w| w.set_sdlevel(0b10)); - } - None => { - panic!("Supply configuration SMPSExternalLDOBypass requires a supply voltage to be set."); - } - } - w.set_sdexthp(true); - w.set_sden(true); - w.set_ldoen(false); - w.set_bypass(true); + w.set_ldoen(matches!( + config.supply_config, + SupplyConfig::SMPSLDO(_) | SupplyConfig::SMPSExternalLDO(_) + )); + w.set_bypass(matches!(config.supply_config, SupplyConfig::SMPSExternalLDOBypass(_))); }); } }