Merge pull request #1915 from xoviat/rcc
stm32/rcc: convert bus prescalers to pac enums
This commit is contained in:
		
						commit
						3ddc9cd110
					
				| @ -59,7 +59,7 @@ sdio-host = "0.5.0" | |||||||
| embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true } | embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true } | ||||||
| critical-section = "1.1" | critical-section = "1.1" | ||||||
| atomic-polyfill = "1.0.1" | atomic-polyfill = "1.0.1" | ||||||
| stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-546aead07086342605102d66dec49c5e2d459a0c" } | stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-907dd82c848bc912252c61509944e85c2a48c919" } | ||||||
| vcell = "0.1.3" | vcell = "0.1.3" | ||||||
| bxcan = "0.7.0" | bxcan = "0.7.0" | ||||||
| nb = "1.0.0" | nb = "1.0.0" | ||||||
| @ -78,7 +78,7 @@ critical-section = { version = "1.1", features = ["std"] } | |||||||
| [build-dependencies] | [build-dependencies] | ||||||
| proc-macro2 = "1.0.36" | proc-macro2 = "1.0.36" | ||||||
| quote = "1.0.15" | quote = "1.0.15" | ||||||
| stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-546aead07086342605102d66dec49c5e2d459a0c", default-features = false, features = ["metadata"]} | stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-907dd82c848bc912252c61509944e85c2a48c919", default-features = false, features = ["metadata"]} | ||||||
| 
 | 
 | ||||||
| [features] | [features] | ||||||
| default = ["rt"] | default = ["rt"] | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ use core::ops::Div; | |||||||
| 
 | 
 | ||||||
| #[allow(unused_imports)] | #[allow(unused_imports)] | ||||||
| use crate::pac::rcc; | use crate::pac::rcc; | ||||||
|  | pub use crate::pac::rcc::vals::{Hpre as AHBPrescaler, Ppre as APBPrescaler}; | ||||||
| use crate::time::Hertz; | use crate::time::Hertz; | ||||||
| 
 | 
 | ||||||
| /// Voltage Scale
 | /// Voltage Scale
 | ||||||
| @ -20,149 +21,48 @@ pub enum VoltageScale { | |||||||
|     Scale3, |     Scale3, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// AHB prescaler
 |  | ||||||
| #[derive(Clone, Copy, PartialEq)] |  | ||||||
| pub enum AHBPrescaler { |  | ||||||
|     NotDivided, |  | ||||||
|     Div2, |  | ||||||
|     #[cfg(any(rcc_wb, rcc_wl5, rcc_wle))] |  | ||||||
|     Div3, |  | ||||||
|     Div4, |  | ||||||
|     #[cfg(any(rcc_wb, rcc_wl5, rcc_wle))] |  | ||||||
|     Div5, |  | ||||||
|     #[cfg(any(rcc_wb, rcc_wl5, rcc_wle))] |  | ||||||
|     Div6, |  | ||||||
|     Div8, |  | ||||||
|     #[cfg(any(rcc_wb, rcc_wl5, rcc_wle))] |  | ||||||
|     Div10, |  | ||||||
|     Div16, |  | ||||||
|     #[cfg(any(rcc_wb, rcc_wl5, rcc_wle))] |  | ||||||
|     Div32, |  | ||||||
|     Div64, |  | ||||||
|     Div128, |  | ||||||
|     Div256, |  | ||||||
|     Div512, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl Div<AHBPrescaler> for Hertz { | impl Div<AHBPrescaler> for Hertz { | ||||||
|     type Output = Hertz; |     type Output = Hertz; | ||||||
| 
 | 
 | ||||||
|     fn div(self, rhs: AHBPrescaler) -> Self::Output { |     fn div(self, rhs: AHBPrescaler) -> Self::Output { | ||||||
|         let divisor = match rhs { |         let divisor = match rhs { | ||||||
|             AHBPrescaler::NotDivided => 1, |             AHBPrescaler::DIV1 => 1, | ||||||
|             AHBPrescaler::Div2 => 2, |             AHBPrescaler::DIV2 => 2, | ||||||
|             #[cfg(any(rcc_wb, rcc_wl5, rcc_wle))] |             #[cfg(any(rcc_wb, rcc_wl5, rcc_wle))] | ||||||
|             AHBPrescaler::Div3 => 3, |             AHBPrescaler::DIV3 => 3, | ||||||
|             AHBPrescaler::Div4 => 4, |             AHBPrescaler::DIV4 => 4, | ||||||
|             #[cfg(any(rcc_wb, rcc_wl5, rcc_wle))] |             #[cfg(any(rcc_wb, rcc_wl5, rcc_wle))] | ||||||
|             AHBPrescaler::Div5 => 5, |             AHBPrescaler::DIV5 => 5, | ||||||
|             #[cfg(any(rcc_wb, rcc_wl5, rcc_wle))] |             #[cfg(any(rcc_wb, rcc_wl5, rcc_wle))] | ||||||
|             AHBPrescaler::Div6 => 6, |             AHBPrescaler::DIV6 => 6, | ||||||
|             AHBPrescaler::Div8 => 8, |             AHBPrescaler::DIV8 => 8, | ||||||
|             #[cfg(any(rcc_wb, rcc_wl5, rcc_wle))] |             #[cfg(any(rcc_wb, rcc_wl5, rcc_wle))] | ||||||
|             AHBPrescaler::Div10 => 10, |             AHBPrescaler::DIV10 => 10, | ||||||
|             AHBPrescaler::Div16 => 16, |             AHBPrescaler::DIV16 => 16, | ||||||
|             #[cfg(any(rcc_wb, rcc_wl5, rcc_wle))] |             #[cfg(any(rcc_wb, rcc_wl5, rcc_wle))] | ||||||
|             AHBPrescaler::Div32 => 32, |             AHBPrescaler::DIV32 => 32, | ||||||
|             AHBPrescaler::Div64 => 64, |             AHBPrescaler::DIV64 => 64, | ||||||
|             AHBPrescaler::Div128 => 128, |             AHBPrescaler::DIV128 => 128, | ||||||
|             AHBPrescaler::Div256 => 256, |             AHBPrescaler::DIV256 => 256, | ||||||
|             AHBPrescaler::Div512 => 512, |             AHBPrescaler::DIV512 => 512, | ||||||
|  |             _ => unreachable!(), | ||||||
|         }; |         }; | ||||||
|         Hertz(self.0 / divisor) |         Hertz(self.0 / divisor) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[cfg(not(any(rcc_g4, rcc_wb, rcc_wl5, rcc_wle)))] |  | ||||||
| impl From<AHBPrescaler> for rcc::vals::Hpre { |  | ||||||
|     fn from(val: AHBPrescaler) -> rcc::vals::Hpre { |  | ||||||
|         use rcc::vals::Hpre; |  | ||||||
| 
 |  | ||||||
|         match val { |  | ||||||
|             AHBPrescaler::NotDivided => Hpre::DIV1, |  | ||||||
|             AHBPrescaler::Div2 => Hpre::DIV2, |  | ||||||
|             AHBPrescaler::Div4 => Hpre::DIV4, |  | ||||||
|             AHBPrescaler::Div8 => Hpre::DIV8, |  | ||||||
|             AHBPrescaler::Div16 => Hpre::DIV16, |  | ||||||
|             AHBPrescaler::Div64 => Hpre::DIV64, |  | ||||||
|             AHBPrescaler::Div128 => Hpre::DIV128, |  | ||||||
|             AHBPrescaler::Div256 => Hpre::DIV256, |  | ||||||
|             AHBPrescaler::Div512 => Hpre::DIV512, |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #[cfg(any(rcc_wb, rcc_wl5, rcc_wle))] |  | ||||||
| impl From<AHBPrescaler> for u8 { |  | ||||||
|     fn from(val: AHBPrescaler) -> u8 { |  | ||||||
|         match val { |  | ||||||
|             AHBPrescaler::NotDivided => 0x0, |  | ||||||
|             AHBPrescaler::Div2 => 0x08, |  | ||||||
|             AHBPrescaler::Div3 => 0x01, |  | ||||||
|             AHBPrescaler::Div4 => 0x09, |  | ||||||
|             AHBPrescaler::Div5 => 0x02, |  | ||||||
|             AHBPrescaler::Div6 => 0x05, |  | ||||||
|             AHBPrescaler::Div8 => 0x0a, |  | ||||||
|             AHBPrescaler::Div10 => 0x06, |  | ||||||
|             AHBPrescaler::Div16 => 0x0b, |  | ||||||
|             AHBPrescaler::Div32 => 0x07, |  | ||||||
|             AHBPrescaler::Div64 => 0x0c, |  | ||||||
|             AHBPrescaler::Div128 => 0x0d, |  | ||||||
|             AHBPrescaler::Div256 => 0x0e, |  | ||||||
|             AHBPrescaler::Div512 => 0x0f, |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /// APB prescaler
 |  | ||||||
| #[derive(Clone, Copy)] |  | ||||||
| pub enum APBPrescaler { |  | ||||||
|     NotDivided, |  | ||||||
|     Div2, |  | ||||||
|     Div4, |  | ||||||
|     Div8, |  | ||||||
|     Div16, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl Div<APBPrescaler> for Hertz { | impl Div<APBPrescaler> for Hertz { | ||||||
|     type Output = Hertz; |     type Output = Hertz; | ||||||
| 
 | 
 | ||||||
|     fn div(self, rhs: APBPrescaler) -> Self::Output { |     fn div(self, rhs: APBPrescaler) -> Self::Output { | ||||||
|         let divisor = match rhs { |         let divisor = match rhs { | ||||||
|             APBPrescaler::NotDivided => 1, |             APBPrescaler::DIV1 => 1, | ||||||
|             APBPrescaler::Div2 => 2, |             APBPrescaler::DIV2 => 2, | ||||||
|             APBPrescaler::Div4 => 4, |             APBPrescaler::DIV4 => 4, | ||||||
|             APBPrescaler::Div8 => 8, |             APBPrescaler::DIV8 => 8, | ||||||
|             APBPrescaler::Div16 => 16, |             APBPrescaler::DIV16 => 16, | ||||||
|  |             _ => unreachable!(), | ||||||
|         }; |         }; | ||||||
|         Hertz(self.0 / divisor) |         Hertz(self.0 / divisor) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 |  | ||||||
| #[cfg(not(any(rcc_f1, rcc_f100, rcc_f1cl, rcc_g4, rcc_h7, rcc_h7ab, rcc_wb, rcc_wl5, rcc_wle)))] |  | ||||||
| impl From<APBPrescaler> for rcc::vals::Ppre { |  | ||||||
|     fn from(val: APBPrescaler) -> rcc::vals::Ppre { |  | ||||||
|         use rcc::vals::Ppre; |  | ||||||
| 
 |  | ||||||
|         match val { |  | ||||||
|             APBPrescaler::NotDivided => Ppre::DIV1, |  | ||||||
|             APBPrescaler::Div2 => Ppre::DIV2, |  | ||||||
|             APBPrescaler::Div4 => Ppre::DIV4, |  | ||||||
|             APBPrescaler::Div8 => Ppre::DIV8, |  | ||||||
|             APBPrescaler::Div16 => Ppre::DIV16, |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #[cfg(any(rcc_wb, rcc_wl5, rcc_wle))] |  | ||||||
| impl From<APBPrescaler> for u8 { |  | ||||||
|     fn from(val: APBPrescaler) -> u8 { |  | ||||||
|         match val { |  | ||||||
|             APBPrescaler::NotDivided => 1, |  | ||||||
|             APBPrescaler::Div2 => 0x04, |  | ||||||
|             APBPrescaler::Div4 => 0x05, |  | ||||||
|             APBPrescaler::Div8 => 0x06, |  | ||||||
|             APBPrescaler::Div16 => 0x07, |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | |||||||
| @ -58,8 +58,8 @@ impl Default for Config { | |||||||
|     fn default() -> Config { |     fn default() -> Config { | ||||||
|         Config { |         Config { | ||||||
|             mux: ClockSrc::HSI(HSIPrescaler::NotDivided), |             mux: ClockSrc::HSI(HSIPrescaler::NotDivided), | ||||||
|             ahb_pre: AHBPrescaler::NotDivided, |             ahb_pre: AHBPrescaler::DIV1, | ||||||
|             apb_pre: APBPrescaler::NotDivided, |             apb_pre: APBPrescaler::DIV1, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -151,20 +151,21 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     let ahb_div = match config.ahb_pre { |     let ahb_div = match config.ahb_pre { | ||||||
|         AHBPrescaler::NotDivided => 1, |         AHBPrescaler::DIV1 => 1, | ||||||
|         AHBPrescaler::Div2 => 2, |         AHBPrescaler::DIV2 => 2, | ||||||
|         AHBPrescaler::Div4 => 4, |         AHBPrescaler::DIV4 => 4, | ||||||
|         AHBPrescaler::Div8 => 8, |         AHBPrescaler::DIV8 => 8, | ||||||
|         AHBPrescaler::Div16 => 16, |         AHBPrescaler::DIV16 => 16, | ||||||
|         AHBPrescaler::Div64 => 64, |         AHBPrescaler::DIV64 => 64, | ||||||
|         AHBPrescaler::Div128 => 128, |         AHBPrescaler::DIV128 => 128, | ||||||
|         AHBPrescaler::Div256 => 256, |         AHBPrescaler::DIV256 => 256, | ||||||
|         AHBPrescaler::Div512 => 512, |         AHBPrescaler::DIV512 => 512, | ||||||
|  |         _ => unreachable!(), | ||||||
|     }; |     }; | ||||||
|     let ahb_freq = sys_clk / ahb_div; |     let ahb_freq = sys_clk / ahb_div; | ||||||
| 
 | 
 | ||||||
|     let (apb_freq, apb_tim_freq) = match config.apb_pre { |     let (apb_freq, apb_tim_freq) = match config.apb_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: Ppre = pre.into(); |             let pre: Ppre = pre.into(); | ||||||
|             let pre: u8 = 1 << (pre.to_bits() - 3); |             let pre: u8 = 1 << (pre.to_bits() - 3); | ||||||
|  | |||||||
| @ -163,8 +163,8 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     // Only needed for stm32f103?
 |     // Only needed for stm32f103?
 | ||||||
|     RCC.cfgr().modify(|w| { |     RCC.cfgr().modify(|w| { | ||||||
|         w.set_adcpre(Adcpre::from_bits(apre_bits)); |         w.set_adcpre(Adcpre::from_bits(apre_bits)); | ||||||
|         w.set_ppre2(Ppre1::from_bits(ppre2_bits)); |         w.set_ppre2(Ppre::from_bits(ppre2_bits)); | ||||||
|         w.set_ppre1(Ppre1::from_bits(ppre1_bits)); |         w.set_ppre1(Ppre::from_bits(ppre1_bits)); | ||||||
|         w.set_hpre(Hpre::from_bits(hpre_bits)); |         w.set_hpre(Hpre::from_bits(hpre_bits)); | ||||||
|         #[cfg(not(rcc_f100))] |         #[cfg(not(rcc_f100))] | ||||||
|         w.set_usbpre(Usbpre::from_bits(usbpre as u8)); |         w.set_usbpre(Usbpre::from_bits(usbpre as u8)); | ||||||
|  | |||||||
| @ -308,9 +308,9 @@ impl Default for Config { | |||||||
|             voltage: VoltageScale::Scale3, |             voltage: VoltageScale::Scale3, | ||||||
|             mux: ClockSrc::HSI, |             mux: ClockSrc::HSI, | ||||||
|             rtc: None, |             rtc: None, | ||||||
|             ahb_pre: AHBPrescaler::NotDivided, |             ahb_pre: AHBPrescaler::DIV1, | ||||||
|             apb1_pre: APBPrescaler::NotDivided, |             apb1_pre: APBPrescaler::DIV1, | ||||||
|             apb2_pre: APBPrescaler::NotDivided, |             apb2_pre: APBPrescaler::DIV1, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -383,7 +383,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     assert!(ahb_freq <= Hertz(120_000_000)); |     assert!(ahb_freq <= Hertz(120_000_000)); | ||||||
| 
 | 
 | ||||||
|     let (apb1_freq, apb1_tim_freq) = match config.apb1_pre { |     let (apb1_freq, apb1_tim_freq) = match config.apb1_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let freq = ahb_freq / pre; |             let freq = ahb_freq / pre; | ||||||
|             (freq, Hertz(freq.0 * 2)) |             (freq, Hertz(freq.0 * 2)) | ||||||
| @ -393,7 +393,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     assert!(apb1_freq <= Hertz(30_000_000)); |     assert!(apb1_freq <= Hertz(30_000_000)); | ||||||
| 
 | 
 | ||||||
|     let (apb2_freq, apb2_tim_freq) = match config.apb2_pre { |     let (apb2_freq, apb2_tim_freq) = match config.apb2_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let freq = ahb_freq / pre; |             let freq = ahb_freq / pre; | ||||||
|             (freq, Hertz(freq.0 * 2)) |             (freq, Hertz(freq.0 * 2)) | ||||||
|  | |||||||
| @ -186,8 +186,8 @@ impl Default for Config { | |||||||
|     fn default() -> Config { |     fn default() -> Config { | ||||||
|         Config { |         Config { | ||||||
|             mux: ClockSrc::HSI16(HSI16Prescaler::NotDivided), |             mux: ClockSrc::HSI16(HSI16Prescaler::NotDivided), | ||||||
|             ahb_pre: AHBPrescaler::NotDivided, |             ahb_pre: AHBPrescaler::DIV1, | ||||||
|             apb_pre: APBPrescaler::NotDivided, |             apb_pre: APBPrescaler::DIV1, | ||||||
|             low_power_run: false, |             low_power_run: false, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -377,7 +377,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     let ahb_freq = Hertz(sys_clk) / config.ahb_pre; |     let ahb_freq = Hertz(sys_clk) / config.ahb_pre; | ||||||
| 
 | 
 | ||||||
|     let (apb_freq, apb_tim_freq) = match config.apb_pre { |     let (apb_freq, apb_tim_freq) = match config.apb_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq.0, ahb_freq.0), |         APBPrescaler::DIV1 => (ahb_freq.0, ahb_freq.0), | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: Ppre = pre.into(); |             let pre: Ppre = pre.into(); | ||||||
|             let pre: u8 = 1 << (pre.to_bits() - 3); |             let pre: u8 = 1 << (pre.to_bits() - 3); | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| use stm32_metapac::flash::vals::Latency; | use stm32_metapac::flash::vals::Latency; | ||||||
| use stm32_metapac::rcc::vals::{Adcsel, Hpre, Pllsrc, Ppre, Sw}; | use stm32_metapac::rcc::vals::{Adcsel, Pllsrc, Sw}; | ||||||
| use stm32_metapac::FLASH; | use stm32_metapac::FLASH; | ||||||
| 
 | 
 | ||||||
| pub use super::bus::{AHBPrescaler, APBPrescaler}; | pub use super::bus::{AHBPrescaler, APBPrescaler}; | ||||||
| @ -261,59 +261,29 @@ pub struct Pll { | |||||||
|     pub div_r: Option<PllR>, |     pub div_r: Option<PllR>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl AHBPrescaler { | fn ahb_div(ahb: AHBPrescaler) -> u32 { | ||||||
|     const fn div(self) -> u32 { |     match ahb { | ||||||
|         match self { |         AHBPrescaler::DIV1 => 1, | ||||||
|             AHBPrescaler::NotDivided => 1, |         AHBPrescaler::DIV2 => 2, | ||||||
|             AHBPrescaler::Div2 => 2, |         AHBPrescaler::DIV4 => 4, | ||||||
|             AHBPrescaler::Div4 => 4, |         AHBPrescaler::DIV8 => 8, | ||||||
|             AHBPrescaler::Div8 => 8, |         AHBPrescaler::DIV16 => 16, | ||||||
|             AHBPrescaler::Div16 => 16, |         AHBPrescaler::DIV64 => 64, | ||||||
|             AHBPrescaler::Div64 => 64, |         AHBPrescaler::DIV128 => 128, | ||||||
|             AHBPrescaler::Div128 => 128, |         AHBPrescaler::DIV256 => 256, | ||||||
|             AHBPrescaler::Div256 => 256, |         AHBPrescaler::DIV512 => 512, | ||||||
|             AHBPrescaler::Div512 => 512, |         _ => unreachable!(), | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl APBPrescaler { | fn apb_div(apb: APBPrescaler) -> u32 { | ||||||
|     const fn div(self) -> u32 { |     match apb { | ||||||
|         match self { |         APBPrescaler::DIV1 => 1, | ||||||
|             APBPrescaler::NotDivided => 1, |         APBPrescaler::DIV2 => 2, | ||||||
|             APBPrescaler::Div2 => 2, |         APBPrescaler::DIV4 => 4, | ||||||
|             APBPrescaler::Div4 => 4, |         APBPrescaler::DIV8 => 8, | ||||||
|             APBPrescaler::Div8 => 8, |         APBPrescaler::DIV16 => 16, | ||||||
|             APBPrescaler::Div16 => 16, |         _ => unreachable!(), | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl Into<Ppre> for APBPrescaler { |  | ||||||
|     fn into(self) -> Ppre { |  | ||||||
|         match self { |  | ||||||
|             APBPrescaler::NotDivided => Ppre::DIV1, |  | ||||||
|             APBPrescaler::Div2 => Ppre::DIV2, |  | ||||||
|             APBPrescaler::Div4 => Ppre::DIV4, |  | ||||||
|             APBPrescaler::Div8 => Ppre::DIV8, |  | ||||||
|             APBPrescaler::Div16 => Ppre::DIV16, |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl Into<Hpre> for AHBPrescaler { |  | ||||||
|     fn into(self) -> Hpre { |  | ||||||
|         match self { |  | ||||||
|             AHBPrescaler::NotDivided => Hpre::DIV1, |  | ||||||
|             AHBPrescaler::Div2 => Hpre::DIV2, |  | ||||||
|             AHBPrescaler::Div4 => Hpre::DIV4, |  | ||||||
|             AHBPrescaler::Div8 => Hpre::DIV8, |  | ||||||
|             AHBPrescaler::Div16 => Hpre::DIV16, |  | ||||||
|             AHBPrescaler::Div64 => Hpre::DIV64, |  | ||||||
|             AHBPrescaler::Div128 => Hpre::DIV128, |  | ||||||
|             AHBPrescaler::Div256 => Hpre::DIV256, |  | ||||||
|             AHBPrescaler::Div512 => Hpre::DIV512, |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -365,9 +335,9 @@ impl Default for Config { | |||||||
|     fn default() -> Config { |     fn default() -> Config { | ||||||
|         Config { |         Config { | ||||||
|             mux: ClockSrc::HSI16, |             mux: ClockSrc::HSI16, | ||||||
|             ahb_pre: AHBPrescaler::NotDivided, |             ahb_pre: AHBPrescaler::DIV1, | ||||||
|             apb1_pre: APBPrescaler::NotDivided, |             apb1_pre: APBPrescaler::DIV1, | ||||||
|             apb2_pre: APBPrescaler::NotDivided, |             apb2_pre: APBPrescaler::DIV1, | ||||||
|             low_power_run: false, |             low_power_run: false, | ||||||
|             pll: None, |             pll: None, | ||||||
|             clock_48mhz_src: None, |             clock_48mhz_src: None, | ||||||
| @ -512,22 +482,22 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     let ahb_freq: u32 = match config.ahb_pre { |     let ahb_freq: u32 = match config.ahb_pre { | ||||||
|         AHBPrescaler::NotDivided => sys_clk, |         AHBPrescaler::DIV1 => sys_clk, | ||||||
|         pre => sys_clk / pre.div(), |         pre => sys_clk / ahb_div(pre), | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let (apb1_freq, apb1_tim_freq) = match config.apb1_pre { |     let (apb1_freq, apb1_tim_freq) = match config.apb1_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let freq = ahb_freq / pre.div(); |             let freq = ahb_freq / apb_div(pre); | ||||||
|             (freq, freq * 2) |             (freq, freq * 2) | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let (apb2_freq, apb2_tim_freq) = match config.apb2_pre { |     let (apb2_freq, apb2_tim_freq) = match config.apb2_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let freq = ahb_freq / pre.div(); |             let freq = ahb_freq / apb_div(pre); | ||||||
|             (freq, freq * 2) |             (freq, freq * 2) | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
|  | |||||||
| @ -91,25 +91,25 @@ pub struct Pll { | |||||||
|     pub divr: Option<u16>, |     pub divr: Option<u16>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl APBPrescaler { | fn apb_div_tim(apb: &APBPrescaler, clk: Hertz, tim: TimerPrescaler) -> Hertz { | ||||||
|     fn div_tim(&self, clk: Hertz, tim: TimerPrescaler) -> Hertz { |     match (tim, apb) { | ||||||
|         match (tim, self) { |         // The timers kernel clock is equal to rcc_hclk1 if PPRE1 or PPRE2 corresponds to a
 | ||||||
|             // The timers kernel clock is equal to rcc_hclk1 if PPRE1 or PPRE2 corresponds to a
 |         // division by 1 or 2, else it is equal to 2 x Frcc_pclk1 or 2 x Frcc_pclk2
 | ||||||
|             // division by 1 or 2, else it is equal to 2 x Frcc_pclk1 or 2 x Frcc_pclk2
 |         (TimerPrescaler::DefaultX2, APBPrescaler::DIV1) => clk, | ||||||
|             (TimerPrescaler::DefaultX2, Self::NotDivided) => clk, |         (TimerPrescaler::DefaultX2, APBPrescaler::DIV2) => clk, | ||||||
|             (TimerPrescaler::DefaultX2, Self::Div2) => clk, |         (TimerPrescaler::DefaultX2, APBPrescaler::DIV4) => clk / 2u32, | ||||||
|             (TimerPrescaler::DefaultX2, Self::Div4) => clk / 2u32, |         (TimerPrescaler::DefaultX2, APBPrescaler::DIV8) => clk / 4u32, | ||||||
|             (TimerPrescaler::DefaultX2, Self::Div8) => clk / 4u32, |         (TimerPrescaler::DefaultX2, APBPrescaler::DIV16) => clk / 8u32, | ||||||
|             (TimerPrescaler::DefaultX2, Self::Div16) => clk / 8u32, |         // The timers kernel clock is equal to 2 x Frcc_pclk1 or 2 x Frcc_pclk2 if PPRE1 or PPRE2
 | ||||||
|             // The timers kernel clock is equal to 2 x Frcc_pclk1 or 2 x Frcc_pclk2 if PPRE1 or PPRE2
 |         // corresponds to a division by 1, 2 or 4, else it is equal to 4 x Frcc_pclk1 or 4 x Frcc_pclk2
 | ||||||
|             // corresponds to a division by 1, 2 or 4, else it is equal to 4 x Frcc_pclk1 or 4 x Frcc_pclk2
 |         // this makes NO SENSE and is different than in the H7. Mistake in the RM??
 | ||||||
|             // this makes NO SENSE and is different than in the H7. Mistake in the RM??
 |         (TimerPrescaler::DefaultX4, APBPrescaler::DIV1) => clk * 2u32, | ||||||
|             (TimerPrescaler::DefaultX4, Self::NotDivided) => clk * 2u32, |         (TimerPrescaler::DefaultX4, APBPrescaler::DIV2) => clk, | ||||||
|             (TimerPrescaler::DefaultX4, Self::Div2) => clk, |         (TimerPrescaler::DefaultX4, APBPrescaler::DIV4) => clk / 2u32, | ||||||
|             (TimerPrescaler::DefaultX4, Self::Div4) => clk / 2u32, |         (TimerPrescaler::DefaultX4, APBPrescaler::DIV8) => clk / 2u32, | ||||||
|             (TimerPrescaler::DefaultX4, Self::Div8) => clk / 2u32, |         (TimerPrescaler::DefaultX4, APBPrescaler::DIV16) => clk / 4u32, | ||||||
|             (TimerPrescaler::DefaultX4, Self::Div16) => clk / 4u32, | 
 | ||||||
|         } |         _ => unreachable!(), | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -165,10 +165,10 @@ impl Default for Config { | |||||||
|             #[cfg(rcc_h5)] |             #[cfg(rcc_h5)] | ||||||
|             pll3: None, |             pll3: None, | ||||||
| 
 | 
 | ||||||
|             ahb_pre: AHBPrescaler::NotDivided, |             ahb_pre: AHBPrescaler::DIV1, | ||||||
|             apb1_pre: APBPrescaler::NotDivided, |             apb1_pre: APBPrescaler::DIV1, | ||||||
|             apb2_pre: APBPrescaler::NotDivided, |             apb2_pre: APBPrescaler::DIV1, | ||||||
|             apb3_pre: APBPrescaler::NotDivided, |             apb3_pre: APBPrescaler::DIV1, | ||||||
|             timer_prescaler: TimerPrescaler::DefaultX2, |             timer_prescaler: TimerPrescaler::DefaultX2, | ||||||
| 
 | 
 | ||||||
|             voltage_scale: VoltageScale::Scale3, |             voltage_scale: VoltageScale::Scale3, | ||||||
| @ -317,9 +317,9 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     let hclk = sys / config.ahb_pre; |     let hclk = sys / config.ahb_pre; | ||||||
| 
 | 
 | ||||||
|     let apb1 = hclk / config.apb1_pre; |     let apb1 = hclk / config.apb1_pre; | ||||||
|     let apb1_tim = config.apb1_pre.div_tim(hclk, config.timer_prescaler); |     let apb1_tim = apb_div_tim(&config.apb1_pre, hclk, config.timer_prescaler); | ||||||
|     let apb2 = hclk / config.apb2_pre; |     let apb2 = hclk / config.apb2_pre; | ||||||
|     let apb2_tim = config.apb2_pre.div_tim(hclk, config.timer_prescaler); |     let apb2_tim = apb_div_tim(&config.apb2_pre, hclk, config.timer_prescaler); | ||||||
|     let apb3 = hclk / config.apb3_pre; |     let apb3 = hclk / config.apb3_pre; | ||||||
| 
 | 
 | ||||||
|     flash_setup(hclk, config.voltage_scale); |     flash_setup(hclk, config.voltage_scale); | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ use stm32_metapac::rcc::vals::{Mco1, Mco2}; | |||||||
| 
 | 
 | ||||||
| use crate::gpio::sealed::AFType; | use crate::gpio::sealed::AFType; | ||||||
| use crate::gpio::Speed; | use crate::gpio::Speed; | ||||||
| use crate::pac::rcc::vals::{Adcsel, Ckpersel, Dppre, Hpre, Hsidiv, Pllsrc, Sw, Timpre}; | use crate::pac::rcc::vals::{Adcsel, Ckpersel, Hpre, Hsidiv, Pllsrc, Ppre, Sw, Timpre}; | ||||||
| use crate::pac::{PWR, RCC, SYSCFG}; | use crate::pac::{PWR, RCC, SYSCFG}; | ||||||
| use crate::rcc::{set_freqs, Clocks}; | use crate::rcc::{set_freqs, Clocks}; | ||||||
| use crate::time::Hertz; | use crate::time::Hertz; | ||||||
| @ -631,7 +631,7 @@ pub(crate) unsafe fn init(mut config: Config) { | |||||||
|     // Core Prescaler / AHB Prescaler / APB3 Prescaler
 |     // Core Prescaler / AHB Prescaler / APB3 Prescaler
 | ||||||
|     RCC.d1cfgr().modify(|w| { |     RCC.d1cfgr().modify(|w| { | ||||||
|         w.set_d1cpre(Hpre::from_bits(d1cpre_bits)); |         w.set_d1cpre(Hpre::from_bits(d1cpre_bits)); | ||||||
|         w.set_d1ppre(Dppre::from_bits(ppre3_bits)); |         w.set_d1ppre(Ppre::from_bits(ppre3_bits)); | ||||||
|         w.set_hpre(hpre_bits) |         w.set_hpre(hpre_bits) | ||||||
|     }); |     }); | ||||||
|     // Ensure core prescaler value is valid before future lower
 |     // Ensure core prescaler value is valid before future lower
 | ||||||
| @ -642,12 +642,12 @@ pub(crate) unsafe fn init(mut config: Config) { | |||||||
| 
 | 
 | ||||||
|     // APB1 / APB2 Prescaler
 |     // APB1 / APB2 Prescaler
 | ||||||
|     RCC.d2cfgr().modify(|w| { |     RCC.d2cfgr().modify(|w| { | ||||||
|         w.set_d2ppre1(Dppre::from_bits(ppre1_bits)); |         w.set_d2ppre1(Ppre::from_bits(ppre1_bits)); | ||||||
|         w.set_d2ppre2(Dppre::from_bits(ppre2_bits)); |         w.set_d2ppre2(Ppre::from_bits(ppre2_bits)); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     // APB4 Prescaler
 |     // APB4 Prescaler
 | ||||||
|     RCC.d3cfgr().modify(|w| w.set_d3ppre(Dppre::from_bits(ppre4_bits))); |     RCC.d3cfgr().modify(|w| w.set_d3ppre(Ppre::from_bits(ppre4_bits))); | ||||||
| 
 | 
 | ||||||
|     // Peripheral Clock (per_ck)
 |     // Peripheral Clock (per_ck)
 | ||||||
|     RCC.d1ccipr().modify(|w| w.set_ckpersel(ckpersel)); |     RCC.d1ccipr().modify(|w| w.set_ckpersel(ckpersel)); | ||||||
|  | |||||||
| @ -145,9 +145,9 @@ impl Default for Config { | |||||||
|     fn default() -> Config { |     fn default() -> Config { | ||||||
|         Config { |         Config { | ||||||
|             mux: ClockSrc::MSI(MSIRange::default()), |             mux: ClockSrc::MSI(MSIRange::default()), | ||||||
|             ahb_pre: AHBPrescaler::NotDivided, |             ahb_pre: AHBPrescaler::DIV1, | ||||||
|             apb1_pre: APBPrescaler::NotDivided, |             apb1_pre: APBPrescaler::DIV1, | ||||||
|             apb2_pre: APBPrescaler::NotDivided, |             apb2_pre: APBPrescaler::DIV1, | ||||||
|             #[cfg(crs)] |             #[cfg(crs)] | ||||||
|             enable_hsi48: false, |             enable_hsi48: false, | ||||||
|             rtc: None, |             rtc: None, | ||||||
| @ -247,7 +247,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     let ahb_freq: u32 = match config.ahb_pre { |     let ahb_freq: u32 = match config.ahb_pre { | ||||||
|         AHBPrescaler::NotDivided => sys_clk, |         AHBPrescaler::DIV1 => sys_clk, | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: Hpre = pre.into(); |             let pre: Hpre = pre.into(); | ||||||
|             let pre = 1 << (pre.to_bits() as u32 - 7); |             let pre = 1 << (pre.to_bits() as u32 - 7); | ||||||
| @ -256,7 +256,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let (apb1_freq, apb1_tim_freq) = match config.apb1_pre { |     let (apb1_freq, apb1_tim_freq) = match config.apb1_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: Ppre = pre.into(); |             let pre: Ppre = pre.into(); | ||||||
|             let pre: u8 = 1 << (pre.to_bits() - 3); |             let pre: u8 = 1 << (pre.to_bits() - 3); | ||||||
| @ -266,7 +266,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let (apb2_freq, apb2_tim_freq) = match config.apb2_pre { |     let (apb2_freq, apb2_tim_freq) = match config.apb2_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: Ppre = pre.into(); |             let pre: Ppre = pre.into(); | ||||||
|             let pre: u8 = 1 << (pre.to_bits() - 3); |             let pre: u8 = 1 << (pre.to_bits() - 3); | ||||||
|  | |||||||
| @ -138,9 +138,9 @@ impl Default for Config { | |||||||
|     fn default() -> Config { |     fn default() -> Config { | ||||||
|         Config { |         Config { | ||||||
|             mux: ClockSrc::MSI(MSIRange::default()), |             mux: ClockSrc::MSI(MSIRange::default()), | ||||||
|             ahb_pre: AHBPrescaler::NotDivided, |             ahb_pre: AHBPrescaler::DIV1, | ||||||
|             apb1_pre: APBPrescaler::NotDivided, |             apb1_pre: APBPrescaler::DIV1, | ||||||
|             apb2_pre: APBPrescaler::NotDivided, |             apb2_pre: APBPrescaler::DIV1, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -240,7 +240,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     let ahb_freq: u32 = match config.ahb_pre { |     let ahb_freq: u32 = match config.ahb_pre { | ||||||
|         AHBPrescaler::NotDivided => sys_clk, |         AHBPrescaler::DIV1 => sys_clk, | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: Hpre = pre.into(); |             let pre: Hpre = pre.into(); | ||||||
|             let pre = 1 << (pre.to_bits() as u32 - 7); |             let pre = 1 << (pre.to_bits() as u32 - 7); | ||||||
| @ -249,7 +249,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let (apb1_freq, apb1_tim_freq) = match config.apb1_pre { |     let (apb1_freq, apb1_tim_freq) = match config.apb1_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: Ppre = pre.into(); |             let pre: Ppre = pre.into(); | ||||||
|             let pre: u8 = 1 << (pre.to_bits() - 3); |             let pre: u8 = 1 << (pre.to_bits() - 3); | ||||||
| @ -259,7 +259,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let (apb2_freq, apb2_tim_freq) = match config.apb2_pre { |     let (apb2_freq, apb2_tim_freq) = match config.apb2_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: Ppre = pre.into(); |             let pre: Ppre = pre.into(); | ||||||
|             let pre: u8 = 1 << (pre.to_bits() - 3); |             let pre: u8 = 1 << (pre.to_bits() - 3); | ||||||
|  | |||||||
| @ -248,9 +248,9 @@ impl Default for Config { | |||||||
|     fn default() -> Config { |     fn default() -> Config { | ||||||
|         Config { |         Config { | ||||||
|             mux: ClockSrc::MSI(MSIRange::Range6), |             mux: ClockSrc::MSI(MSIRange::Range6), | ||||||
|             ahb_pre: AHBPrescaler::NotDivided, |             ahb_pre: AHBPrescaler::DIV1, | ||||||
|             apb1_pre: APBPrescaler::NotDivided, |             apb1_pre: APBPrescaler::DIV1, | ||||||
|             apb2_pre: APBPrescaler::NotDivided, |             apb2_pre: APBPrescaler::DIV1, | ||||||
|             pllsai1: None, |             pllsai1: None, | ||||||
|             #[cfg(not(any(stm32l471, stm32l475, stm32l476, stm32l486)))] |             #[cfg(not(any(stm32l471, stm32l475, stm32l476, stm32l486)))] | ||||||
|             hsi48: false, |             hsi48: false, | ||||||
| @ -576,7 +576,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     let ahb_freq: u32 = match config.ahb_pre { |     let ahb_freq: u32 = match config.ahb_pre { | ||||||
|         AHBPrescaler::NotDivided => sys_clk, |         AHBPrescaler::DIV1 => sys_clk, | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: Hpre = pre.into(); |             let pre: Hpre = pre.into(); | ||||||
|             let pre = 1 << (pre.to_bits() as u32 - 7); |             let pre = 1 << (pre.to_bits() as u32 - 7); | ||||||
| @ -585,7 +585,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let (apb1_freq, apb1_tim_freq) = match config.apb1_pre { |     let (apb1_freq, apb1_tim_freq) = match config.apb1_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: Ppre = pre.into(); |             let pre: Ppre = pre.into(); | ||||||
|             let pre: u8 = 1 << (pre.to_bits() - 3); |             let pre: u8 = 1 << (pre.to_bits() - 3); | ||||||
| @ -595,7 +595,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let (apb2_freq, apb2_tim_freq) = match config.apb2_pre { |     let (apb2_freq, apb2_tim_freq) = match config.apb2_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: Ppre = pre.into(); |             let pre: Ppre = pre.into(); | ||||||
|             let pre: u8 = 1 << (pre.to_bits() - 3); |             let pre: u8 = 1 << (pre.to_bits() - 3); | ||||||
|  | |||||||
| @ -238,9 +238,9 @@ impl Default for Config { | |||||||
|     fn default() -> Config { |     fn default() -> Config { | ||||||
|         Config { |         Config { | ||||||
|             mux: ClockSrc::MSI(MSIRange::Range6), |             mux: ClockSrc::MSI(MSIRange::Range6), | ||||||
|             ahb_pre: AHBPrescaler::NotDivided, |             ahb_pre: AHBPrescaler::DIV1, | ||||||
|             apb1_pre: APBPrescaler::NotDivided, |             apb1_pre: APBPrescaler::DIV1, | ||||||
|             apb2_pre: APBPrescaler::NotDivided, |             apb2_pre: APBPrescaler::DIV1, | ||||||
|             pllsai1: None, |             pllsai1: None, | ||||||
|             hsi48: false, |             hsi48: false, | ||||||
|         } |         } | ||||||
| @ -407,7 +407,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     let ahb_freq: u32 = match config.ahb_pre { |     let ahb_freq: u32 = match config.ahb_pre { | ||||||
|         AHBPrescaler::NotDivided => sys_clk, |         AHBPrescaler::DIV1 => sys_clk, | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: Hpre = pre.into(); |             let pre: Hpre = pre.into(); | ||||||
|             let pre = 1 << (pre.to_bits() as u32 - 7); |             let pre = 1 << (pre.to_bits() as u32 - 7); | ||||||
| @ -416,7 +416,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let (apb1_freq, apb1_tim_freq) = match config.apb1_pre { |     let (apb1_freq, apb1_tim_freq) = match config.apb1_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: Ppre = pre.into(); |             let pre: Ppre = pre.into(); | ||||||
|             let pre: u8 = 1 << (pre.to_bits() - 3); |             let pre: u8 = 1 << (pre.to_bits() - 3); | ||||||
| @ -426,7 +426,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let (apb2_freq, apb2_tim_freq) = match config.apb2_pre { |     let (apb2_freq, apb2_tim_freq) = match config.apb2_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: Ppre = pre.into(); |             let pre: Ppre = pre.into(); | ||||||
|             let pre: u8 = 1 << (pre.to_bits() - 3); |             let pre: u8 = 1 << (pre.to_bits() - 3); | ||||||
|  | |||||||
| @ -119,46 +119,6 @@ impl Into<Pllm> for PllM { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Into<u8> for AHBPrescaler { |  | ||||||
|     fn into(self) -> u8 { |  | ||||||
|         match self { |  | ||||||
|             AHBPrescaler::NotDivided => 1, |  | ||||||
|             AHBPrescaler::Div2 => 0x08, |  | ||||||
|             AHBPrescaler::Div4 => 0x09, |  | ||||||
|             AHBPrescaler::Div8 => 0x0a, |  | ||||||
|             AHBPrescaler::Div16 => 0x0b, |  | ||||||
|             AHBPrescaler::Div64 => 0x0c, |  | ||||||
|             AHBPrescaler::Div128 => 0x0d, |  | ||||||
|             AHBPrescaler::Div256 => 0x0e, |  | ||||||
|             AHBPrescaler::Div512 => 0x0f, |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl Default for AHBPrescaler { |  | ||||||
|     fn default() -> Self { |  | ||||||
|         AHBPrescaler::NotDivided |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl Default for APBPrescaler { |  | ||||||
|     fn default() -> Self { |  | ||||||
|         APBPrescaler::NotDivided |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl Into<u8> for APBPrescaler { |  | ||||||
|     fn into(self) -> u8 { |  | ||||||
|         match self { |  | ||||||
|             APBPrescaler::NotDivided => 1, |  | ||||||
|             APBPrescaler::Div2 => 0x04, |  | ||||||
|             APBPrescaler::Div4 => 0x05, |  | ||||||
|             APBPrescaler::Div8 => 0x06, |  | ||||||
|             APBPrescaler::Div16 => 0x07, |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl Into<Sw> for ClockSrc { | impl Into<Sw> for ClockSrc { | ||||||
|     fn into(self) -> Sw { |     fn into(self) -> Sw { | ||||||
|         match self { |         match self { | ||||||
| @ -239,10 +199,10 @@ impl Default for Config { | |||||||
|     fn default() -> Self { |     fn default() -> Self { | ||||||
|         Self { |         Self { | ||||||
|             mux: ClockSrc::MSI(MSIRange::default()), |             mux: ClockSrc::MSI(MSIRange::default()), | ||||||
|             ahb_pre: Default::default(), |             ahb_pre: AHBPrescaler::DIV1, | ||||||
|             apb1_pre: Default::default(), |             apb1_pre: APBPrescaler::DIV1, | ||||||
|             apb2_pre: Default::default(), |             apb2_pre: APBPrescaler::DIV1, | ||||||
|             apb3_pre: Default::default(), |             apb3_pre: APBPrescaler::DIV1, | ||||||
|             hsi48: false, |             hsi48: false, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -395,7 +355,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     let ahb_freq: u32 = match config.ahb_pre { |     let ahb_freq: u32 = match config.ahb_pre { | ||||||
|         AHBPrescaler::NotDivided => sys_clk, |         AHBPrescaler::DIV1 => sys_clk, | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: u8 = pre.into(); |             let pre: u8 = pre.into(); | ||||||
|             let pre = 1 << (pre as u32 - 7); |             let pre = 1 << (pre as u32 - 7); | ||||||
| @ -404,7 +364,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let (apb1_freq, apb1_tim_freq) = match config.apb1_pre { |     let (apb1_freq, apb1_tim_freq) = match config.apb1_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: u8 = pre.into(); |             let pre: u8 = pre.into(); | ||||||
|             let pre: u8 = 1 << (pre - 3); |             let pre: u8 = 1 << (pre - 3); | ||||||
| @ -414,7 +374,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let (apb2_freq, apb2_tim_freq) = match config.apb2_pre { |     let (apb2_freq, apb2_tim_freq) = match config.apb2_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: u8 = pre.into(); |             let pre: u8 = pre.into(); | ||||||
|             let pre: u8 = 1 << (pre - 3); |             let pre: u8 = 1 << (pre - 3); | ||||||
| @ -424,7 +384,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let (apb3_freq, _apb3_tim_freq) = match config.apb3_pre { |     let (apb3_freq, _apb3_tim_freq) = match config.apb3_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: u8 = pre.into(); |             let pre: u8 = pre.into(); | ||||||
|             let pre: u8 = 1 << (pre - 3); |             let pre: u8 = 1 << (pre - 3); | ||||||
|  | |||||||
| @ -145,11 +145,11 @@ pub const WPAN_DEFAULT: Config = Config { | |||||||
|     }), |     }), | ||||||
|     pllsai: None, |     pllsai: None, | ||||||
| 
 | 
 | ||||||
|     ahb1_pre: AHBPrescaler::NotDivided, |     ahb1_pre: AHBPrescaler::DIV1, | ||||||
|     ahb2_pre: AHBPrescaler::Div2, |     ahb2_pre: AHBPrescaler::DIV2, | ||||||
|     ahb3_pre: AHBPrescaler::NotDivided, |     ahb3_pre: AHBPrescaler::DIV1, | ||||||
|     apb1_pre: APBPrescaler::NotDivided, |     apb1_pre: APBPrescaler::DIV1, | ||||||
|     apb2_pre: APBPrescaler::NotDivided, |     apb2_pre: APBPrescaler::DIV1, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| impl Default for Config { | impl Default for Config { | ||||||
| @ -165,11 +165,11 @@ impl Default for Config { | |||||||
|             pllsai: None, |             pllsai: None, | ||||||
|             rtc: None, |             rtc: None, | ||||||
| 
 | 
 | ||||||
|             ahb1_pre: AHBPrescaler::NotDivided, |             ahb1_pre: AHBPrescaler::DIV1, | ||||||
|             ahb2_pre: AHBPrescaler::NotDivided, |             ahb2_pre: AHBPrescaler::DIV1, | ||||||
|             ahb3_pre: AHBPrescaler::NotDivided, |             ahb3_pre: AHBPrescaler::DIV1, | ||||||
|             apb1_pre: APBPrescaler::NotDivided, |             apb1_pre: APBPrescaler::DIV1, | ||||||
|             apb2_pre: APBPrescaler::NotDivided, |             apb2_pre: APBPrescaler::DIV1, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -209,7 +209,7 @@ pub(crate) fn compute_clocks(config: &Config) -> Clocks { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let ahb1_clk = match config.ahb1_pre { |     let ahb1_clk = match config.ahb1_pre { | ||||||
|         AHBPrescaler::NotDivided => sys_clk, |         AHBPrescaler::DIV1 => sys_clk, | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: u8 = pre.into(); |             let pre: u8 = pre.into(); | ||||||
|             let pre = 1u32 << (pre as u32 - 7); |             let pre = 1u32 << (pre as u32 - 7); | ||||||
| @ -218,7 +218,7 @@ pub(crate) fn compute_clocks(config: &Config) -> Clocks { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let ahb2_clk = match config.ahb2_pre { |     let ahb2_clk = match config.ahb2_pre { | ||||||
|         AHBPrescaler::NotDivided => sys_clk, |         AHBPrescaler::DIV1 => sys_clk, | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: u8 = pre.into(); |             let pre: u8 = pre.into(); | ||||||
|             let pre = 1u32 << (pre as u32 - 7); |             let pre = 1u32 << (pre as u32 - 7); | ||||||
| @ -227,7 +227,7 @@ pub(crate) fn compute_clocks(config: &Config) -> Clocks { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let ahb3_clk = match config.ahb3_pre { |     let ahb3_clk = match config.ahb3_pre { | ||||||
|         AHBPrescaler::NotDivided => sys_clk, |         AHBPrescaler::DIV1 => sys_clk, | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: u8 = pre.into(); |             let pre: u8 = pre.into(); | ||||||
|             let pre = 1u32 << (pre as u32 - 7); |             let pre = 1u32 << (pre as u32 - 7); | ||||||
| @ -236,7 +236,7 @@ pub(crate) fn compute_clocks(config: &Config) -> Clocks { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let (apb1_clk, apb1_tim_clk) = match config.apb1_pre { |     let (apb1_clk, apb1_tim_clk) = match config.apb1_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb1_clk, ahb1_clk), |         APBPrescaler::DIV1 => (ahb1_clk, ahb1_clk), | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: u8 = pre.into(); |             let pre: u8 = pre.into(); | ||||||
|             let pre: u8 = 1 << (pre - 3); |             let pre: u8 = 1 << (pre - 3); | ||||||
| @ -246,7 +246,7 @@ pub(crate) fn compute_clocks(config: &Config) -> Clocks { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let (apb2_clk, apb2_tim_clk) = match config.apb2_pre { |     let (apb2_clk, apb2_tim_clk) = match config.apb2_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb1_clk, ahb1_clk), |         APBPrescaler::DIV1 => (ahb1_clk, ahb1_clk), | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: u8 = pre.into(); |             let pre: u8 = pre.into(); | ||||||
|             let pre: u8 = 1 << (pre - 3); |             let pre: u8 = 1 << (pre - 3); | ||||||
|  | |||||||
| @ -146,10 +146,10 @@ impl Default for Config { | |||||||
|     fn default() -> Config { |     fn default() -> Config { | ||||||
|         Config { |         Config { | ||||||
|             mux: ClockSrc::MSI(MSIRange::default()), |             mux: ClockSrc::MSI(MSIRange::default()), | ||||||
|             ahb_pre: AHBPrescaler::NotDivided, |             ahb_pre: AHBPrescaler::DIV1, | ||||||
|             shd_ahb_pre: AHBPrescaler::NotDivided, |             shd_ahb_pre: AHBPrescaler::DIV1, | ||||||
|             apb1_pre: APBPrescaler::NotDivided, |             apb1_pre: APBPrescaler::DIV1, | ||||||
|             apb2_pre: APBPrescaler::NotDivided, |             apb2_pre: APBPrescaler::DIV1, | ||||||
|             rtc_mux: RtcClockSource::LSI, |             rtc_mux: RtcClockSource::LSI, | ||||||
|             adc_clock_source: AdcClockSource::default(), |             adc_clock_source: AdcClockSource::default(), | ||||||
|         } |         } | ||||||
| @ -172,7 +172,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let ahb_freq: u32 = match config.ahb_pre { |     let ahb_freq: u32 = match config.ahb_pre { | ||||||
|         AHBPrescaler::NotDivided => sys_clk, |         AHBPrescaler::DIV1 => sys_clk, | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: u8 = pre.into(); |             let pre: u8 = pre.into(); | ||||||
|             let pre = 1 << (pre as u32 - 7); |             let pre = 1 << (pre as u32 - 7); | ||||||
| @ -181,7 +181,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let shd_ahb_freq: u32 = match config.shd_ahb_pre { |     let shd_ahb_freq: u32 = match config.shd_ahb_pre { | ||||||
|         AHBPrescaler::NotDivided => sys_clk, |         AHBPrescaler::DIV1 => sys_clk, | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: u8 = pre.into(); |             let pre: u8 = pre.into(); | ||||||
|             let pre = 1 << (pre as u32 - 7); |             let pre = 1 << (pre as u32 - 7); | ||||||
| @ -190,7 +190,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let (apb1_freq, apb1_tim_freq) = match config.apb1_pre { |     let (apb1_freq, apb1_tim_freq) = match config.apb1_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: u8 = pre.into(); |             let pre: u8 = pre.into(); | ||||||
|             let pre: u8 = 1 << (pre - 3); |             let pre: u8 = 1 << (pre - 3); | ||||||
| @ -200,7 +200,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     let (apb2_freq, apb2_tim_freq) = match config.apb2_pre { |     let (apb2_freq, apb2_tim_freq) = match config.apb2_pre { | ||||||
|         APBPrescaler::NotDivided => (ahb_freq, ahb_freq), |         APBPrescaler::DIV1 => (ahb_freq, ahb_freq), | ||||||
|         pre => { |         pre => { | ||||||
|             let pre: u8 = pre.into(); |             let pre: u8 = pre.into(); | ||||||
|             let pre: u8 = 1 << (pre - 3); |             let pre: u8 = 1 << (pre - 3); | ||||||
| @ -267,7 +267,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     RCC.extcfgr().modify(|w| { |     RCC.extcfgr().modify(|w| { | ||||||
|         if config.shd_ahb_pre == AHBPrescaler::NotDivided { |         if config.shd_ahb_pre == AHBPrescaler::DIV1 { | ||||||
|             w.set_shdhpre(0); |             w.set_shdhpre(0); | ||||||
|         } else { |         } else { | ||||||
|             w.set_shdhpre(config.shd_ahb_pre.into()); |             w.set_shdhpre(config.shd_ahb_pre.into()); | ||||||
| @ -276,11 +276,7 @@ pub(crate) unsafe fn init(config: Config) { | |||||||
| 
 | 
 | ||||||
|     RCC.cfgr().modify(|w| { |     RCC.cfgr().modify(|w| { | ||||||
|         w.set_sw(sw.into()); |         w.set_sw(sw.into()); | ||||||
|         if config.ahb_pre == AHBPrescaler::NotDivided { |         w.set_hpre(config.ahb_pre); | ||||||
|             w.set_hpre(0); |  | ||||||
|         } else { |  | ||||||
|             w.set_hpre(config.ahb_pre.into()); |  | ||||||
|         } |  | ||||||
|         w.set_ppre1(config.apb1_pre.into()); |         w.set_ppre1(config.apb1_pre.into()); | ||||||
|         w.set_ppre2(config.apb2_pre.into()); |         w.set_ppre2(config.apb2_pre.into()); | ||||||
|     }); |     }); | ||||||
|  | |||||||
| @ -39,9 +39,9 @@ async fn main(_spawner: Spawner) { | |||||||
|     // System clock comes from PLL (= the 120 MHz main PLL output)
 |     // System clock comes from PLL (= the 120 MHz main PLL output)
 | ||||||
|     config.rcc.mux = ClockSrc::PLL; |     config.rcc.mux = ClockSrc::PLL; | ||||||
|     // 120 MHz / 4 = 30 MHz APB1 frequency
 |     // 120 MHz / 4 = 30 MHz APB1 frequency
 | ||||||
|     config.rcc.apb1_pre = APBPrescaler::Div4; |     config.rcc.apb1_pre = APBPrescaler::DIV4; | ||||||
|     // 120 MHz / 2 = 60 MHz APB2 frequency
 |     // 120 MHz / 2 = 60 MHz APB2 frequency
 | ||||||
|     config.rcc.apb2_pre = APBPrescaler::Div2; |     config.rcc.apb2_pre = APBPrescaler::DIV2; | ||||||
| 
 | 
 | ||||||
|     let _p = embassy_stm32::init(config); |     let _p = embassy_stm32::init(config); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -48,10 +48,10 @@ async fn main(spawner: Spawner) -> ! { | |||||||
|         divq: Some(2), |         divq: Some(2), | ||||||
|         divr: None, |         divr: None, | ||||||
|     }); |     }); | ||||||
|     config.rcc.ahb_pre = AHBPrescaler::NotDivided; |     config.rcc.ahb_pre = AHBPrescaler::DIV1; | ||||||
|     config.rcc.apb1_pre = APBPrescaler::NotDivided; |     config.rcc.apb1_pre = APBPrescaler::DIV1; | ||||||
|     config.rcc.apb2_pre = APBPrescaler::NotDivided; |     config.rcc.apb2_pre = APBPrescaler::DIV1; | ||||||
|     config.rcc.apb3_pre = APBPrescaler::NotDivided; |     config.rcc.apb3_pre = APBPrescaler::DIV1; | ||||||
|     config.rcc.sys = Sysclk::Pll1P; |     config.rcc.sys = Sysclk::Pll1P; | ||||||
|     config.rcc.voltage_scale = VoltageScale::Scale0; |     config.rcc.voltage_scale = VoltageScale::Scale0; | ||||||
|     let p = embassy_stm32::init(config); |     let p = embassy_stm32::init(config); | ||||||
|  | |||||||
| @ -35,10 +35,10 @@ async fn main(_spawner: Spawner) { | |||||||
|         divq: None, |         divq: None, | ||||||
|         divr: None, |         divr: None, | ||||||
|     }); |     }); | ||||||
|     config.rcc.ahb_pre = AHBPrescaler::Div2; |     config.rcc.ahb_pre = AHBPrescaler::DIV2; | ||||||
|     config.rcc.apb1_pre = APBPrescaler::Div4; |     config.rcc.apb1_pre = APBPrescaler::DIV4; | ||||||
|     config.rcc.apb2_pre = APBPrescaler::Div2; |     config.rcc.apb2_pre = APBPrescaler::DIV2; | ||||||
|     config.rcc.apb3_pre = APBPrescaler::Div4; |     config.rcc.apb3_pre = APBPrescaler::DIV4; | ||||||
|     config.rcc.sys = Sysclk::Pll1P; |     config.rcc.sys = Sysclk::Pll1P; | ||||||
|     config.rcc.voltage_scale = VoltageScale::Scale0; |     config.rcc.voltage_scale = VoltageScale::Scale0; | ||||||
|     let p = embassy_stm32::init(config); |     let p = embassy_stm32::init(config); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user