aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxoviat <[email protected]>2023-10-14 23:33:57 -0500
committerxoviat <[email protected]>2023-10-14 23:33:57 -0500
commit4a156df7a1e3ed9513cc61cb063d7af86b5cc2fb (patch)
tree61d84d989df3f7b4b142e745cbd3d4c2a6a989bb
parentc46e758e2c897d24f56b5225fde4a0bfe1778cd9 (diff)
stm32: expand rcc mux to g4 and h7
-rw-r--r--embassy-stm32/Cargo.toml4
-rw-r--r--embassy-stm32/build.rs43
-rw-r--r--embassy-stm32/src/rcc/g4.rs17
-rw-r--r--embassy-stm32/src/rcc/h.rs33
-rw-r--r--embassy-stm32/src/rcc/mod.rs47
-rw-r--r--examples/stm32g4/src/bin/adc.rs2
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"
58sdio-host = "0.5.0" 58sdio-host = "0.5.0"
59embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true } 59embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true }
60critical-section = "1.1" 60critical-section = "1.1"
61stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-e6e51db6cdd7d533e52ca7a3237f7816a0486cd4" } 61stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-7dafe9d8bbc739be48199185f0caa1582b1da3f7" }
62vcell = "0.1.3" 62vcell = "0.1.3"
63bxcan = "0.7.0" 63bxcan = "0.7.0"
64nb = "1.0.0" 64nb = "1.0.0"
@@ -76,7 +76,7 @@ critical-section = { version = "1.1", features = ["std"] }
76[build-dependencies] 76[build-dependencies]
77proc-macro2 = "1.0.36" 77proc-macro2 = "1.0.36"
78quote = "1.0.15" 78quote = "1.0.15"
79stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-e6e51db6cdd7d533e52ca7a3237f7816a0486cd4", default-features = false, features = ["metadata"]} 79stm32-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);