Merge pull request #4231 from ROMemories/feat/stm32-rcc-const-constructors
feat(stm32): provide a `const` constructor on `rcc::Config`
This commit is contained in:
		
						commit
						f3983328e0
					
				| @ -92,6 +92,17 @@ pub struct LsConfig { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl LsConfig { | impl LsConfig { | ||||||
|  |     /// Creates an [`LsConfig`] using the LSI when possible.
 | ||||||
|  |     pub const fn new() -> Self { | ||||||
|  |         // on L5, just the fact that LSI is enabled makes things crash.
 | ||||||
|  |         // TODO: investigate.
 | ||||||
|  | 
 | ||||||
|  |         #[cfg(not(stm32l5))] | ||||||
|  |         return Self::default_lsi(); | ||||||
|  |         #[cfg(stm32l5)] | ||||||
|  |         return Self::off(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     pub const fn default_lse() -> Self { |     pub const fn default_lse() -> Self { | ||||||
|         Self { |         Self { | ||||||
|             rtc: RtcClockSource::LSE, |             rtc: RtcClockSource::LSE, | ||||||
| @ -124,13 +135,7 @@ impl LsConfig { | |||||||
| 
 | 
 | ||||||
| impl Default for LsConfig { | impl Default for LsConfig { | ||||||
|     fn default() -> Self { |     fn default() -> Self { | ||||||
|         // on L5, just the fact that LSI is enabled makes things crash.
 |         Self::new() | ||||||
|         // TODO: investigate.
 |  | ||||||
| 
 |  | ||||||
|         #[cfg(not(stm32l5))] |  | ||||||
|         return Self::default_lsi(); |  | ||||||
|         #[cfg(stm32l5)] |  | ||||||
|         return Self::off(); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -59,9 +59,8 @@ pub struct Config { | |||||||
|     pub mux: super::mux::ClockMux, |     pub mux: super::mux::ClockMux, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Default for Config { | impl Config { | ||||||
|     #[inline] |     pub const fn new() -> Self { | ||||||
|     fn default() -> Config { |  | ||||||
|         Config { |         Config { | ||||||
|             hsi: Some(Hsi { |             hsi: Some(Hsi { | ||||||
|                 sys_div: HsiSysDiv::DIV4, |                 sys_div: HsiSysDiv::DIV4, | ||||||
| @ -71,12 +70,18 @@ impl Default for Config { | |||||||
|             sys: Sysclk::HSISYS, |             sys: Sysclk::HSISYS, | ||||||
|             ahb_pre: AHBPrescaler::DIV1, |             ahb_pre: AHBPrescaler::DIV1, | ||||||
|             apb1_pre: APBPrescaler::DIV1, |             apb1_pre: APBPrescaler::DIV1, | ||||||
|             ls: Default::default(), |             ls: crate::rcc::LsConfig::new(), | ||||||
|             mux: Default::default(), |             mux: super::mux::ClockMux::default(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | impl Default for Config { | ||||||
|  |     fn default() -> Config { | ||||||
|  |         Self::new() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| pub(crate) unsafe fn init(config: Config) { | pub(crate) unsafe fn init(config: Config) { | ||||||
|     // Turn on the HSI
 |     // Turn on the HSI
 | ||||||
|     match config.hsi { |     match config.hsi { | ||||||
|  | |||||||
| @ -126,13 +126,13 @@ pub struct Config { | |||||||
|     pub ls: super::LsConfig, |     pub ls: super::LsConfig, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Default for Config { | impl Config { | ||||||
|     fn default() -> Self { |     pub const fn new() -> Self { | ||||||
|         Self { |         Self { | ||||||
|             hsi: true, |             hsi: true, | ||||||
|             hse: None, |             hse: None, | ||||||
|             #[cfg(crs)] |             #[cfg(crs)] | ||||||
|             hsi48: Some(Default::default()), |             hsi48: Some(crate::rcc::Hsi48Config::new()), | ||||||
|             sys: Sysclk::HSI, |             sys: Sysclk::HSI, | ||||||
|             pll: None, |             pll: None, | ||||||
| 
 | 
 | ||||||
| @ -147,7 +147,7 @@ impl Default for Config { | |||||||
|             apb1_pre: APBPrescaler::DIV1, |             apb1_pre: APBPrescaler::DIV1, | ||||||
|             #[cfg(not(stm32f0))] |             #[cfg(not(stm32f0))] | ||||||
|             apb2_pre: APBPrescaler::DIV1, |             apb2_pre: APBPrescaler::DIV1, | ||||||
|             ls: Default::default(), |             ls: crate::rcc::LsConfig::new(), | ||||||
| 
 | 
 | ||||||
|             #[cfg(stm32f1)] |             #[cfg(stm32f1)] | ||||||
|             // ensure ADC is not out of range by default even if APB2 is maxxed out (36mhz)
 |             // ensure ADC is not out of range by default even if APB2 is maxxed out (36mhz)
 | ||||||
| @ -163,11 +163,17 @@ impl Default for Config { | |||||||
|             #[cfg(stm32f107)] |             #[cfg(stm32f107)] | ||||||
|             i2s3_src: I2s2src::SYS, |             i2s3_src: I2s2src::SYS, | ||||||
| 
 | 
 | ||||||
|             mux: Default::default(), |             mux: super::mux::ClockMux::default(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | impl Default for Config { | ||||||
|  |     fn default() -> Self { | ||||||
|  |         Self::new() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /// Initialize and Set the clock frequencies
 | /// Initialize and Set the clock frequencies
 | ||||||
| pub(crate) unsafe fn init(config: Config) { | pub(crate) unsafe fn init(config: Config) { | ||||||
|     // Turn on the HSI
 |     // Turn on the HSI
 | ||||||
|  | |||||||
| @ -108,8 +108,8 @@ pub struct Config { | |||||||
|     pub voltage: VoltageScale, |     pub voltage: VoltageScale, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Default for Config { | impl Config { | ||||||
|     fn default() -> Self { |     pub const fn new() -> Self { | ||||||
|         Self { |         Self { | ||||||
|             hsi: true, |             hsi: true, | ||||||
|             hse: None, |             hse: None, | ||||||
| @ -127,15 +127,21 @@ impl Default for Config { | |||||||
|             apb1_pre: APBPrescaler::DIV1, |             apb1_pre: APBPrescaler::DIV1, | ||||||
|             apb2_pre: APBPrescaler::DIV1, |             apb2_pre: APBPrescaler::DIV1, | ||||||
| 
 | 
 | ||||||
|             ls: Default::default(), |             ls: crate::rcc::LsConfig::new(), | ||||||
| 
 | 
 | ||||||
|             #[cfg(stm32f2)] |             #[cfg(stm32f2)] | ||||||
|             voltage: VoltageScale::Range3, |             voltage: VoltageScale::Range3, | ||||||
|             mux: Default::default(), |             mux: super::mux::ClockMux::default(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | impl Default for Config { | ||||||
|  |     fn default() -> Self { | ||||||
|  |         Self::new() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| pub(crate) unsafe fn init(config: Config) { | pub(crate) unsafe fn init(config: Config) { | ||||||
|     // set VOS to SCALE1, if use PLL
 |     // set VOS to SCALE1, if use PLL
 | ||||||
|     // TODO: check real clock speed before set VOS
 |     // TODO: check real clock speed before set VOS
 | ||||||
|  | |||||||
| @ -97,9 +97,8 @@ pub struct Config { | |||||||
|     pub mux: super::mux::ClockMux, |     pub mux: super::mux::ClockMux, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Default for Config { | impl Config { | ||||||
|     #[inline] |     pub const fn new() -> Self { | ||||||
|     fn default() -> Config { |  | ||||||
|         Config { |         Config { | ||||||
|             hsi: Some(Hsi { |             hsi: Some(Hsi { | ||||||
|                 sys_div: HsiSysDiv::DIV1, |                 sys_div: HsiSysDiv::DIV1, | ||||||
| @ -107,18 +106,24 @@ impl Default for Config { | |||||||
|             hse: None, |             hse: None, | ||||||
|             sys: Sysclk::HSI, |             sys: Sysclk::HSI, | ||||||
|             #[cfg(crs)] |             #[cfg(crs)] | ||||||
|             hsi48: Some(Default::default()), |             hsi48: Some(crate::rcc::Hsi48Config::new()), | ||||||
|             pll: None, |             pll: None, | ||||||
|             ahb_pre: AHBPrescaler::DIV1, |             ahb_pre: AHBPrescaler::DIV1, | ||||||
|             apb1_pre: APBPrescaler::DIV1, |             apb1_pre: APBPrescaler::DIV1, | ||||||
|             low_power_run: false, |             low_power_run: false, | ||||||
|             ls: Default::default(), |             ls: crate::rcc::LsConfig::new(), | ||||||
|             voltage_range: VoltageRange::RANGE1, |             voltage_range: VoltageRange::RANGE1, | ||||||
|             mux: Default::default(), |             mux: super::mux::ClockMux::default(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | impl Default for Config { | ||||||
|  |     fn default() -> Config { | ||||||
|  |         Self::new() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #[derive(Default)] | #[derive(Default)] | ||||||
| pub struct PllFreq { | pub struct PllFreq { | ||||||
|     pub pll_p: Option<Hertz>, |     pub pll_p: Option<Hertz>, | ||||||
|  | |||||||
| @ -91,26 +91,31 @@ pub struct Config { | |||||||
|     pub mux: super::mux::ClockMux, |     pub mux: super::mux::ClockMux, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Default for Config { | impl Config { | ||||||
|     #[inline] |     pub const fn new() -> Self { | ||||||
|     fn default() -> Config { |  | ||||||
|         Config { |         Config { | ||||||
|             hsi: true, |             hsi: true, | ||||||
|             hse: None, |             hse: None, | ||||||
|             sys: Sysclk::HSI, |             sys: Sysclk::HSI, | ||||||
|             hsi48: Some(Default::default()), |             hsi48: Some(crate::rcc::Hsi48Config::new()), | ||||||
|             pll: None, |             pll: None, | ||||||
|             ahb_pre: AHBPrescaler::DIV1, |             ahb_pre: AHBPrescaler::DIV1, | ||||||
|             apb1_pre: APBPrescaler::DIV1, |             apb1_pre: APBPrescaler::DIV1, | ||||||
|             apb2_pre: APBPrescaler::DIV1, |             apb2_pre: APBPrescaler::DIV1, | ||||||
|             low_power_run: false, |             low_power_run: false, | ||||||
|             ls: Default::default(), |             ls: crate::rcc::LsConfig::new(), | ||||||
|             boost: false, |             boost: false, | ||||||
|             mux: Default::default(), |             mux: super::mux::ClockMux::default(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | impl Default for Config { | ||||||
|  |     fn default() -> Config { | ||||||
|  |         Self::new() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #[derive(Default)] | #[derive(Default)] | ||||||
| pub struct PllFreq { | pub struct PllFreq { | ||||||
|     pub pll_p: Option<Hertz>, |     pub pll_p: Option<Hertz>, | ||||||
|  | |||||||
| @ -218,13 +218,13 @@ pub struct Config { | |||||||
|     pub mux: super::mux::ClockMux, |     pub mux: super::mux::ClockMux, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Default for Config { | impl Config { | ||||||
|     fn default() -> Self { |     pub const fn new() -> Self { | ||||||
|         Self { |         Self { | ||||||
|             hsi: Some(HSIPrescaler::DIV1), |             hsi: Some(HSIPrescaler::DIV1), | ||||||
|             hse: None, |             hse: None, | ||||||
|             csi: false, |             csi: false, | ||||||
|             hsi48: Some(Default::default()), |             hsi48: Some(crate::rcc::Hsi48Config::new()), | ||||||
|             sys: Sysclk::HSI, |             sys: Sysclk::HSI, | ||||||
|             pll1: None, |             pll1: None, | ||||||
|             pll2: None, |             pll2: None, | ||||||
| @ -248,16 +248,22 @@ impl Default for Config { | |||||||
|             voltage_scale: VoltageScale::Scale0, |             voltage_scale: VoltageScale::Scale0, | ||||||
|             #[cfg(rcc_h7rs)] |             #[cfg(rcc_h7rs)] | ||||||
|             voltage_scale: VoltageScale::HIGH, |             voltage_scale: VoltageScale::HIGH, | ||||||
|             ls: Default::default(), |             ls: crate::rcc::LsConfig::new(), | ||||||
| 
 | 
 | ||||||
|             #[cfg(any(pwr_h7rm0399, pwr_h7rm0455, pwr_h7rm0468, pwr_h7rs))] |             #[cfg(any(pwr_h7rm0399, pwr_h7rm0455, pwr_h7rm0468, pwr_h7rs))] | ||||||
|             supply_config: SupplyConfig::LDO, |             supply_config: SupplyConfig::LDO, | ||||||
| 
 | 
 | ||||||
|             mux: Default::default(), |             mux: super::mux::ClockMux::default(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | impl Default for Config { | ||||||
|  |     fn default() -> Self { | ||||||
|  |         Self::new() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| pub(crate) unsafe fn init(config: Config) { | pub(crate) unsafe fn init(config: Config) { | ||||||
|     #[cfg(any(stm32h7))] |     #[cfg(any(stm32h7))] | ||||||
|     let pwr_reg = PWR.cr3(); |     let pwr_reg = PWR.cr3(); | ||||||
|  | |||||||
| @ -18,9 +18,15 @@ pub struct Hsi48Config { | |||||||
|     pub sync_from_usb: bool, |     pub sync_from_usb: bool, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | impl Hsi48Config { | ||||||
|  |     pub const fn new() -> Self { | ||||||
|  |         Self { sync_from_usb: false } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| impl Default for Hsi48Config { | impl Default for Hsi48Config { | ||||||
|     fn default() -> Self { |     fn default() -> Self { | ||||||
|         Self { sync_from_usb: false } |         Self::new() | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -68,9 +68,8 @@ pub struct Config { | |||||||
|     pub mux: super::mux::ClockMux, |     pub mux: super::mux::ClockMux, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Default for Config { | impl Config { | ||||||
|     #[inline] |     pub const fn new() -> Self { | ||||||
|     fn default() -> Config { |  | ||||||
|         Config { |         Config { | ||||||
|             hse: None, |             hse: None, | ||||||
|             hsi: false, |             hsi: false, | ||||||
| @ -90,15 +89,21 @@ impl Default for Config { | |||||||
|             #[cfg(any(stm32l47x, stm32l48x, stm32l49x, stm32l4ax, rcc_l4plus, stm32l5))] |             #[cfg(any(stm32l47x, stm32l48x, stm32l49x, stm32l4ax, rcc_l4plus, stm32l5))] | ||||||
|             pllsai2: None, |             pllsai2: None, | ||||||
|             #[cfg(crs)] |             #[cfg(crs)] | ||||||
|             hsi48: Some(Default::default()), |             hsi48: Some(crate::rcc::Hsi48Config::new()), | ||||||
|             ls: Default::default(), |             ls: crate::rcc::LsConfig::new(), | ||||||
|             #[cfg(any(stm32l0, stm32l1))] |             #[cfg(any(stm32l0, stm32l1))] | ||||||
|             voltage_scale: VoltageScale::RANGE1, |             voltage_scale: VoltageScale::RANGE1, | ||||||
|             mux: Default::default(), |             mux: super::mux::ClockMux::default(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | impl Default for Config { | ||||||
|  |     fn default() -> Config { | ||||||
|  |         Self::new() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #[cfg(stm32wb)] | #[cfg(stm32wb)] | ||||||
| pub const WPAN_DEFAULT: Config = Config { | pub const WPAN_DEFAULT: Config = Config { | ||||||
|     hse: Some(Hse { |     hse: Some(Hse { | ||||||
|  | |||||||
| @ -97,14 +97,14 @@ pub struct Config { | |||||||
|     pub mux: super::mux::ClockMux, |     pub mux: super::mux::ClockMux, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Default for Config { | impl Config { | ||||||
|     fn default() -> Self { |     pub const fn new() -> Self { | ||||||
|         Self { |         Self { | ||||||
|             msis: Some(Msirange::RANGE_4MHZ), |             msis: Some(Msirange::RANGE_4MHZ), | ||||||
|             msik: Some(Msirange::RANGE_4MHZ), |             msik: Some(Msirange::RANGE_4MHZ), | ||||||
|             hse: None, |             hse: None, | ||||||
|             hsi: false, |             hsi: false, | ||||||
|             hsi48: Some(Default::default()), |             hsi48: Some(crate::rcc::Hsi48Config::new()), | ||||||
|             pll1: None, |             pll1: None, | ||||||
|             pll2: None, |             pll2: None, | ||||||
|             pll3: None, |             pll3: None, | ||||||
| @ -114,12 +114,18 @@ impl Default for Config { | |||||||
|             apb2_pre: APBPrescaler::DIV1, |             apb2_pre: APBPrescaler::DIV1, | ||||||
|             apb3_pre: APBPrescaler::DIV1, |             apb3_pre: APBPrescaler::DIV1, | ||||||
|             voltage_range: VoltageScale::RANGE1, |             voltage_range: VoltageScale::RANGE1, | ||||||
|             ls: Default::default(), |             ls: crate::rcc::LsConfig::new(), | ||||||
|             mux: Default::default(), |             mux: super::mux::ClockMux::default(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | impl Default for Config { | ||||||
|  |     fn default() -> Self { | ||||||
|  |         Self::new() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| pub(crate) unsafe fn init(config: Config) { | pub(crate) unsafe fn init(config: Config) { | ||||||
|     // Set the requested power mode
 |     // Set the requested power mode
 | ||||||
|     PWR.vosr().modify(|w| w.set_vos(config.voltage_range)); |     PWR.vosr().modify(|w| w.set_vos(config.voltage_range)); | ||||||
|  | |||||||
| @ -37,9 +37,8 @@ pub struct Config { | |||||||
|     pub mux: super::mux::ClockMux, |     pub mux: super::mux::ClockMux, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Default for Config { | impl Config { | ||||||
|     #[inline] |     pub const fn new() -> Self { | ||||||
|     fn default() -> Config { |  | ||||||
|         Config { |         Config { | ||||||
|             hse: None, |             hse: None, | ||||||
|             hsi: true, |             hsi: true, | ||||||
| @ -48,13 +47,19 @@ impl Default for Config { | |||||||
|             apb1_pre: APBPrescaler::DIV1, |             apb1_pre: APBPrescaler::DIV1, | ||||||
|             apb2_pre: APBPrescaler::DIV1, |             apb2_pre: APBPrescaler::DIV1, | ||||||
|             apb7_pre: APBPrescaler::DIV1, |             apb7_pre: APBPrescaler::DIV1, | ||||||
|             ls: Default::default(), |             ls: crate::rcc::LsConfig::new(), | ||||||
|             voltage_scale: VoltageScale::RANGE2, |             voltage_scale: VoltageScale::RANGE2, | ||||||
|             mux: Default::default(), |             mux: super::mux::ClockMux::default(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | impl Default for Config { | ||||||
|  |     fn default() -> Config { | ||||||
|  |         Self::new() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| fn hsi_enable() { | fn hsi_enable() { | ||||||
|     RCC.cr().modify(|w| w.set_hsion(true)); |     RCC.cr().modify(|w| w.set_hsion(true)); | ||||||
|     while !RCC.cr().read().hsirdy() {} |     while !RCC.cr().read().hsirdy() {} | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user