diff options
| author | xoviat <[email protected]> | 2023-10-14 23:33:57 -0500 |
|---|---|---|
| committer | xoviat <[email protected]> | 2023-10-14 23:33:57 -0500 |
| commit | 4a156df7a1e3ed9513cc61cb063d7af86b5cc2fb (patch) | |
| tree | 61d84d989df3f7b4b142e745cbd3d4c2a6a989bb | |
| parent | c46e758e2c897d24f56b5225fde4a0bfe1778cd9 (diff) | |
stm32: expand rcc mux to g4 and h7
| -rw-r--r-- | embassy-stm32/Cargo.toml | 4 | ||||
| -rw-r--r-- | embassy-stm32/build.rs | 43 | ||||
| -rw-r--r-- | embassy-stm32/src/rcc/g4.rs | 17 | ||||
| -rw-r--r-- | embassy-stm32/src/rcc/h.rs | 33 | ||||
| -rw-r--r-- | embassy-stm32/src/rcc/mod.rs | 47 | ||||
| -rw-r--r-- | examples/stm32g4/src/bin/adc.rs | 2 |
6 files changed, 72 insertions, 74 deletions
diff --git a/embassy-stm32/Cargo.toml b/embassy-stm32/Cargo.toml index b18cafb8b..0629bc095 100644 --- a/embassy-stm32/Cargo.toml +++ b/embassy-stm32/Cargo.toml | |||
| @@ -58,7 +58,7 @@ rand_core = "0.6.3" | |||
| 58 | sdio-host = "0.5.0" | 58 | sdio-host = "0.5.0" |
| 59 | embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true } | 59 | embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true } |
| 60 | critical-section = "1.1" | 60 | critical-section = "1.1" |
| 61 | stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-e6e51db6cdd7d533e52ca7a3237f7816a0486cd4" } | 61 | stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-7dafe9d8bbc739be48199185f0caa1582b1da3f7" } |
| 62 | vcell = "0.1.3" | 62 | vcell = "0.1.3" |
| 63 | bxcan = "0.7.0" | 63 | bxcan = "0.7.0" |
| 64 | nb = "1.0.0" | 64 | nb = "1.0.0" |
| @@ -76,7 +76,7 @@ critical-section = { version = "1.1", features = ["std"] } | |||
| 76 | [build-dependencies] | 76 | [build-dependencies] |
| 77 | proc-macro2 = "1.0.36" | 77 | proc-macro2 = "1.0.36" |
| 78 | quote = "1.0.15" | 78 | quote = "1.0.15" |
| 79 | stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-e6e51db6cdd7d533e52ca7a3237f7816a0486cd4", default-features = false, features = ["metadata"]} | 79 | stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-7dafe9d8bbc739be48199185f0caa1582b1da3f7", default-features = false, features = ["metadata"]} |
| 80 | 80 | ||
| 81 | 81 | ||
| 82 | [features] | 82 | [features] |
diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs index 3e1c76f36..45aad027d 100644 --- a/embassy-stm32/build.rs +++ b/embassy-stm32/build.rs | |||
| @@ -389,19 +389,20 @@ fn main() { | |||
| 389 | } | 389 | } |
| 390 | 390 | ||
| 391 | // ======== | 391 | // ======== |
| 392 | // Extract the rcc registers | ||
| 393 | let rcc_registers = METADATA | ||
| 394 | .peripherals | ||
| 395 | .iter() | ||
| 396 | .filter_map(|p| p.registers.as_ref()) | ||
| 397 | .find(|r| r.kind == "rcc") | ||
| 398 | .unwrap(); | ||
| 399 | |||
| 400 | // ======== | ||
| 392 | // Generate rcc fieldset and enum maps | 401 | // Generate rcc fieldset and enum maps |
| 393 | let rcc_enum_map: HashMap<&str, HashMap<&str, &Enum>> = { | 402 | let rcc_enum_map: HashMap<&str, HashMap<&str, &Enum>> = { |
| 394 | let rcc_registers = METADATA | 403 | let rcc_blocks = rcc_registers.ir.blocks.iter().find(|b| b.name == "Rcc").unwrap().items; |
| 395 | .peripherals | 404 | let rcc_fieldsets: HashMap<&str, &FieldSet> = rcc_registers.ir.fieldsets.iter().map(|f| (f.name, f)).collect(); |
| 396 | .iter() | 405 | let rcc_enums: HashMap<&str, &Enum> = rcc_registers.ir.enums.iter().map(|e| (e.name, e)).collect(); |
| 397 | .filter_map(|p| p.registers.as_ref()) | ||
| 398 | .find(|r| r.kind == "rcc") | ||
| 399 | .unwrap() | ||
| 400 | .ir; | ||
| 401 | |||
| 402 | let rcc_blocks = rcc_registers.blocks.iter().find(|b| b.name == "Rcc").unwrap().items; | ||
| 403 | let rcc_fieldsets: HashMap<&str, &FieldSet> = rcc_registers.fieldsets.iter().map(|f| (f.name, f)).collect(); | ||
| 404 | let rcc_enums: HashMap<&str, &Enum> = rcc_registers.enums.iter().map(|e| (e.name, e)).collect(); | ||
| 405 | 406 | ||
| 406 | rcc_blocks | 407 | rcc_blocks |
| 407 | .iter() | 408 | .iter() |
| @@ -494,8 +495,10 @@ fn main() { | |||
| 494 | }; | 495 | }; |
| 495 | 496 | ||
| 496 | let mux_for = |mux: Option<&'static PeripheralRccRegister>| { | 497 | let mux_for = |mux: Option<&'static PeripheralRccRegister>| { |
| 497 | // temporary hack to restrict the scope of the implementation to h5 | 498 | let checked_rccs = HashSet::from(["h5", "h50", "h7", "h7ab", "h7rm0433", "g4"]); |
| 498 | if !&chip_name.starts_with("stm32h5") { | 499 | |
| 500 | // restrict mux implementation to supported versions | ||
| 501 | if !checked_rccs.contains(rcc_registers.version) { | ||
| 499 | return None; | 502 | return None; |
| 500 | } | 503 | } |
| 501 | 504 | ||
| @@ -518,11 +521,9 @@ fn main() { | |||
| 518 | .filter(|v| v.name != "DISABLE") | 521 | .filter(|v| v.name != "DISABLE") |
| 519 | .map(|v| { | 522 | .map(|v| { |
| 520 | let variant_name = format_ident!("{}", v.name); | 523 | let variant_name = format_ident!("{}", v.name); |
| 521 | |||
| 522 | // temporary hack to restrict the scope of the implementation until clock names can be stabilized | ||
| 523 | let clock_name = format_ident!("{}", v.name.to_ascii_lowercase()); | 524 | let clock_name = format_ident!("{}", v.name.to_ascii_lowercase()); |
| 524 | 525 | ||
| 525 | if v.name.starts_with("AHB") || v.name.starts_with("APB") { | 526 | if v.name.starts_with("AHB") || v.name.starts_with("APB") || v.name == "SYS" { |
| 526 | quote! { | 527 | quote! { |
| 527 | #enum_name::#variant_name => unsafe { crate::rcc::get_freqs().#clock_name }, | 528 | #enum_name::#variant_name => unsafe { crate::rcc::get_freqs().#clock_name }, |
| 528 | } | 529 | } |
| @@ -1013,15 +1014,7 @@ fn main() { | |||
| 1013 | 1014 | ||
| 1014 | // ======== | 1015 | // ======== |
| 1015 | // Generate Div/Mul impls for RCC prescalers/dividers/multipliers. | 1016 | // Generate Div/Mul impls for RCC prescalers/dividers/multipliers. |
| 1016 | let rcc_registers = METADATA | 1017 | for e in rcc_registers.ir.enums { |
| 1017 | .peripherals | ||
| 1018 | .iter() | ||
| 1019 | .filter_map(|p| p.registers.as_ref()) | ||
| 1020 | .find(|r| r.kind == "rcc") | ||
| 1021 | .unwrap() | ||
| 1022 | .ir; | ||
| 1023 | |||
| 1024 | for e in rcc_registers.enums { | ||
| 1025 | fn is_rcc_name(e: &str) -> bool { | 1018 | fn is_rcc_name(e: &str) -> bool { |
| 1026 | match e { | 1019 | match e { |
| 1027 | "Pllp" | "Pllq" | "Pllr" | "Pllm" | "Plln" => true, | 1020 | "Pllp" | "Pllq" | "Pllr" | "Pllm" | "Plln" => true, |
diff --git a/embassy-stm32/src/rcc/g4.rs b/embassy-stm32/src/rcc/g4.rs index afdf5cc73..581bf9e0e 100644 --- a/embassy-stm32/src/rcc/g4.rs +++ b/embassy-stm32/src/rcc/g4.rs | |||
| @@ -119,8 +119,8 @@ impl Default for Config { | |||
| 119 | low_power_run: false, | 119 | low_power_run: false, |
| 120 | pll: None, | 120 | pll: None, |
| 121 | clock_48mhz_src: None, | 121 | clock_48mhz_src: None, |
| 122 | adc12_clock_source: Adcsel::NOCLK, | 122 | adc12_clock_source: Adcsel::DISABLE, |
| 123 | adc345_clock_source: Adcsel::NOCLK, | 123 | adc345_clock_source: Adcsel::DISABLE, |
| 124 | ls: Default::default(), | 124 | ls: Default::default(), |
| 125 | } | 125 | } |
| 126 | } | 126 | } |
| @@ -326,16 +326,16 @@ pub(crate) unsafe fn init(config: Config) { | |||
| 326 | RCC.ccipr().modify(|w| w.set_adc345sel(config.adc345_clock_source)); | 326 | RCC.ccipr().modify(|w| w.set_adc345sel(config.adc345_clock_source)); |
| 327 | 327 | ||
| 328 | let adc12_ck = match config.adc12_clock_source { | 328 | let adc12_ck = match config.adc12_clock_source { |
| 329 | AdcClockSource::NOCLK => None, | 329 | AdcClockSource::DISABLE => None, |
| 330 | AdcClockSource::PLLP => pll_freq.as_ref().unwrap().pll_p, | 330 | AdcClockSource::PLL1_P => pll_freq.as_ref().unwrap().pll_p, |
| 331 | AdcClockSource::SYSCLK => Some(sys_clk), | 331 | AdcClockSource::SYS => Some(sys_clk), |
| 332 | _ => unreachable!(), | 332 | _ => unreachable!(), |
| 333 | }; | 333 | }; |
| 334 | 334 | ||
| 335 | let adc345_ck = match config.adc345_clock_source { | 335 | let adc345_ck = match config.adc345_clock_source { |
| 336 | AdcClockSource::NOCLK => None, | 336 | AdcClockSource::DISABLE => None, |
| 337 | AdcClockSource::PLLP => pll_freq.as_ref().unwrap().pll_p, | 337 | AdcClockSource::PLL1_P => pll_freq.as_ref().unwrap().pll_p, |
| 338 | AdcClockSource::SYSCLK => Some(sys_clk), | 338 | AdcClockSource::SYS => Some(sys_clk), |
| 339 | _ => unreachable!(), | 339 | _ => unreachable!(), |
| 340 | }; | 340 | }; |
| 341 | 341 | ||
| @@ -356,6 +356,7 @@ pub(crate) unsafe fn init(config: Config) { | |||
| 356 | apb2_tim: apb2_tim_freq, | 356 | apb2_tim: apb2_tim_freq, |
| 357 | adc: adc12_ck, | 357 | adc: adc12_ck, |
| 358 | adc34: adc345_ck, | 358 | adc34: adc345_ck, |
| 359 | pll1_p: None, | ||
| 359 | rtc, | 360 | rtc, |
| 360 | }); | 361 | }); |
| 361 | } | 362 | } |
diff --git a/embassy-stm32/src/rcc/h.rs b/embassy-stm32/src/rcc/h.rs index 9132df7eb..bbbbc9c1c 100644 --- a/embassy-stm32/src/rcc/h.rs +++ b/embassy-stm32/src/rcc/h.rs | |||
| @@ -446,7 +446,7 @@ pub(crate) unsafe fn init(config: Config) { | |||
| 446 | #[cfg(stm32h5)] | 446 | #[cfg(stm32h5)] |
| 447 | let adc = match config.adc_clock_source { | 447 | let adc = match config.adc_clock_source { |
| 448 | AdcClockSource::HCLK => Some(hclk), | 448 | AdcClockSource::HCLK => Some(hclk), |
| 449 | AdcClockSource::SYSCLK => Some(sys), | 449 | AdcClockSource::SYS => Some(sys), |
| 450 | AdcClockSource::PLL2_R => pll2.r, | 450 | AdcClockSource::PLL2_R => pll2.r, |
| 451 | AdcClockSource::HSE => hse, | 451 | AdcClockSource::HSE => hse, |
| 452 | AdcClockSource::HSI => hsi, | 452 | AdcClockSource::HSI => hsi, |
| @@ -540,36 +540,34 @@ pub(crate) unsafe fn init(config: Config) { | |||
| 540 | adc, | 540 | adc, |
| 541 | rtc, | 541 | rtc, |
| 542 | 542 | ||
| 543 | #[cfg(stm32h5)] | 543 | #[cfg(any(stm32h5, stm32h7))] |
| 544 | hsi: None, | 544 | hsi: None, |
| 545 | #[cfg(stm32h5)] | 545 | #[cfg(stm32h5)] |
| 546 | hsi48: None, | 546 | hsi48: None, |
| 547 | #[cfg(stm32h5)] | 547 | #[cfg(stm32h5)] |
| 548 | lsi: None, | 548 | lsi: None, |
| 549 | #[cfg(stm32h5)] | 549 | #[cfg(any(stm32h5, stm32h7))] |
| 550 | csi: None, | 550 | csi: None, |
| 551 | 551 | ||
| 552 | #[cfg(stm32h5)] | 552 | #[cfg(any(stm32h5, stm32h7))] |
| 553 | lse: None, | 553 | lse: None, |
| 554 | #[cfg(stm32h5)] | 554 | #[cfg(any(stm32h5, stm32h7))] |
| 555 | hse: None, | 555 | hse: None, |
| 556 | 556 | ||
| 557 | #[cfg(stm32h5)] | 557 | #[cfg(any(stm32h5, stm32h7))] |
| 558 | pll1_q: pll1.q, | 558 | pll1_q: pll1.q, |
| 559 | #[cfg(stm32h5)] | 559 | #[cfg(any(stm32h5, stm32h7))] |
| 560 | pll2_q: pll2.q, | ||
| 561 | #[cfg(stm32h5)] | ||
| 562 | pll2_p: pll2.p, | 560 | pll2_p: pll2.p, |
| 563 | #[cfg(stm32h5)] | 561 | #[cfg(any(stm32h5, stm32h7))] |
| 562 | pll2_q: pll2.q, | ||
| 563 | #[cfg(any(stm32h5, stm32h7))] | ||
| 564 | pll2_r: pll2.r, | 564 | pll2_r: pll2.r, |
| 565 | #[cfg(rcc_h5)] | 565 | #[cfg(any(rcc_h5, stm32h7))] |
| 566 | pll3_p: pll3.p, | 566 | pll3_p: pll3.p, |
| 567 | #[cfg(rcc_h5)] | 567 | #[cfg(any(rcc_h5, stm32h7))] |
| 568 | pll3_q: pll3.q, | 568 | pll3_q: pll3.q, |
| 569 | #[cfg(rcc_h5)] | 569 | #[cfg(any(rcc_h5, stm32h7))] |
| 570 | pll3_r: pll3.r, | 570 | pll3_r: pll3.r, |
| 571 | #[cfg(stm32h5)] | ||
| 572 | pll3_1: None, | ||
| 573 | 571 | ||
| 574 | #[cfg(rcc_h50)] | 572 | #[cfg(rcc_h50)] |
| 575 | pll3_p: None, | 573 | pll3_p: None, |
| @@ -580,8 +578,11 @@ pub(crate) unsafe fn init(config: Config) { | |||
| 580 | 578 | ||
| 581 | #[cfg(stm32h5)] | 579 | #[cfg(stm32h5)] |
| 582 | audioclk: None, | 580 | audioclk: None, |
| 583 | #[cfg(stm32h5)] | 581 | #[cfg(any(stm32h5, stm32h7))] |
| 584 | per: None, | 582 | per: None, |
| 583 | |||
| 584 | #[cfg(stm32h7)] | ||
| 585 | rcc_pclk_d3: None, | ||
| 585 | }); | 586 | }); |
| 586 | } | 587 | } |
| 587 | 588 | ||
diff --git a/embassy-stm32/src/rcc/mod.rs b/embassy-stm32/src/rcc/mod.rs index 0904ddbd8..1603a2c36 100644 --- a/embassy-stm32/src/rcc/mod.rs +++ b/embassy-stm32/src/rcc/mod.rs | |||
| @@ -113,6 +113,23 @@ pub struct Clocks { | |||
| 113 | #[cfg(any(stm32f427, stm32f429, stm32f437, stm32f439, stm32f446, stm32f469, stm32f479))] | 113 | #[cfg(any(stm32f427, stm32f429, stm32f437, stm32f439, stm32f446, stm32f469, stm32f479))] |
| 114 | pub pllsai: Option<Hertz>, | 114 | pub pllsai: Option<Hertz>, |
| 115 | 115 | ||
| 116 | #[cfg(stm32g4)] | ||
| 117 | pub pll1_p: Option<Hertz>, | ||
| 118 | #[cfg(any(stm32h5, stm32h7))] | ||
| 119 | pub pll1_q: Option<Hertz>, | ||
| 120 | #[cfg(any(stm32h5, stm32h7))] | ||
| 121 | pub pll2_q: Option<Hertz>, | ||
| 122 | #[cfg(any(stm32h5, stm32h7))] | ||
| 123 | pub pll2_p: Option<Hertz>, | ||
| 124 | #[cfg(any(stm32h5, stm32h7))] | ||
| 125 | pub pll2_r: Option<Hertz>, | ||
| 126 | #[cfg(any(stm32h5, stm32h7))] | ||
| 127 | pub pll3_p: Option<Hertz>, | ||
| 128 | #[cfg(any(stm32h5, stm32h7))] | ||
| 129 | pub pll3_q: Option<Hertz>, | ||
| 130 | #[cfg(any(stm32h5, stm32h7))] | ||
| 131 | pub pll3_r: Option<Hertz>, | ||
| 132 | |||
| 116 | #[cfg(any( | 133 | #[cfg(any( |
| 117 | rcc_f1, | 134 | rcc_f1, |
| 118 | rcc_f100, | 135 | rcc_f100, |
| @@ -135,41 +152,27 @@ pub struct Clocks { | |||
| 135 | 152 | ||
| 136 | pub rtc: Option<Hertz>, | 153 | pub rtc: Option<Hertz>, |
| 137 | 154 | ||
| 138 | #[cfg(stm32h5)] | 155 | #[cfg(any(stm32h5, stm32h7))] |
| 139 | pub hsi: Option<Hertz>, | 156 | pub hsi: Option<Hertz>, |
| 140 | #[cfg(stm32h5)] | 157 | #[cfg(stm32h5)] |
| 141 | pub hsi48: Option<Hertz>, | 158 | pub hsi48: Option<Hertz>, |
| 142 | #[cfg(stm32h5)] | 159 | #[cfg(stm32h5)] |
| 143 | pub lsi: Option<Hertz>, | 160 | pub lsi: Option<Hertz>, |
| 144 | #[cfg(stm32h5)] | 161 | #[cfg(any(stm32h5, stm32h7))] |
| 145 | pub csi: Option<Hertz>, | 162 | pub csi: Option<Hertz>, |
| 146 | 163 | ||
| 147 | #[cfg(stm32h5)] | 164 | #[cfg(any(stm32h5, stm32h7))] |
| 148 | pub lse: Option<Hertz>, | 165 | pub lse: Option<Hertz>, |
| 149 | #[cfg(stm32h5)] | 166 | #[cfg(any(stm32h5, stm32h7))] |
| 150 | pub hse: Option<Hertz>, | 167 | pub hse: Option<Hertz>, |
| 151 | 168 | ||
| 152 | #[cfg(stm32h5)] | 169 | #[cfg(stm32h5)] |
| 153 | pub pll1_q: Option<Hertz>, | ||
| 154 | #[cfg(stm32h5)] | ||
| 155 | pub pll2_q: Option<Hertz>, | ||
| 156 | #[cfg(stm32h5)] | ||
| 157 | pub pll2_p: Option<Hertz>, | ||
| 158 | #[cfg(stm32h5)] | ||
| 159 | pub pll2_r: Option<Hertz>, | ||
| 160 | #[cfg(stm32h5)] | ||
| 161 | pub pll3_p: Option<Hertz>, | ||
| 162 | #[cfg(stm32h5)] | ||
| 163 | pub pll3_q: Option<Hertz>, | ||
| 164 | #[cfg(stm32h5)] | ||
| 165 | pub pll3_r: Option<Hertz>, | ||
| 166 | #[cfg(stm32h5)] | ||
| 167 | pub pll3_1: Option<Hertz>, | ||
| 168 | |||
| 169 | #[cfg(stm32h5)] | ||
| 170 | pub audioclk: Option<Hertz>, | 170 | pub audioclk: Option<Hertz>, |
| 171 | #[cfg(stm32h5)] | 171 | #[cfg(any(stm32h5, stm32h7))] |
| 172 | pub per: Option<Hertz>, | 172 | pub per: Option<Hertz>, |
| 173 | |||
| 174 | #[cfg(stm32h7)] | ||
| 175 | pub rcc_pclk_d3: Option<Hertz>, | ||
| 173 | } | 176 | } |
| 174 | 177 | ||
| 175 | #[cfg(feature = "low-power")] | 178 | #[cfg(feature = "low-power")] |
diff --git a/examples/stm32g4/src/bin/adc.rs b/examples/stm32g4/src/bin/adc.rs index 9daf4e4cb..db7f6ecb5 100644 --- a/examples/stm32g4/src/bin/adc.rs +++ b/examples/stm32g4/src/bin/adc.rs | |||
| @@ -24,7 +24,7 @@ async fn main(_spawner: Spawner) { | |||
| 24 | div_r: Some(PllR::DIV2), | 24 | div_r: Some(PllR::DIV2), |
| 25 | }); | 25 | }); |
| 26 | 26 | ||
| 27 | config.rcc.adc12_clock_source = AdcClockSource::SYSCLK; | 27 | config.rcc.adc12_clock_source = AdcClockSource::SYS; |
| 28 | config.rcc.mux = ClockSrc::PLL; | 28 | config.rcc.mux = ClockSrc::PLL; |
| 29 | 29 | ||
| 30 | let mut p = embassy_stm32::init(config); | 30 | let mut p = embassy_stm32::init(config); |
