aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2025-04-18 18:47:55 +0000
committerGitHub <[email protected]>2025-04-18 18:47:55 +0000
commit9d62fba7d2e6b5d3bcb54770ffd031c1f3dafc84 (patch)
treec67297584c724948e71dc7cf61979c2bba62b6e5
parent4c6311a1e306d031fd9ff413bbd42baba646384e (diff)
parent7512c5f14ed90b264fa7b617bba8be6fc5ae53b4 (diff)
Merge pull request #4112 from embassy-rs/update-metapac-4929
stm32: update metapac, cleanup clocks a bit.
-rw-r--r--embassy-stm32/Cargo.toml4
-rw-r--r--embassy-stm32/build.rs81
-rw-r--r--embassy-stm32/src/rcc/f013.rs6
-rw-r--r--embassy-stm32/src/rcc/f247.rs1
-rw-r--r--embassy-stm32/src/rcc/g0.rs2
-rw-r--r--embassy-stm32/src/rcc/g4.rs2
-rw-r--r--embassy-stm32/src/rcc/h.rs5
-rw-r--r--embassy-stm32/src/rcc/l.rs2
-rw-r--r--embassy-stm32/src/rcc/u5.rs4
9 files changed, 63 insertions, 44 deletions
diff --git a/embassy-stm32/Cargo.toml b/embassy-stm32/Cargo.toml
index d15ac4823..82bc76883 100644
--- a/embassy-stm32/Cargo.toml
+++ b/embassy-stm32/Cargo.toml
@@ -73,7 +73,7 @@ rand_core = "0.6.3"
73sdio-host = "0.9.0" 73sdio-host = "0.9.0"
74critical-section = "1.1" 74critical-section = "1.1"
75#stm32-metapac = { version = "16" } 75#stm32-metapac = { version = "16" }
76stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-a7a30c9d54e7415709c463a537501691784672db" } 76stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-380f03cb71f43a242adc45e83607a380ffe0447b" }
77 77
78vcell = "0.1.3" 78vcell = "0.1.3"
79nb = "1.0.0" 79nb = "1.0.0"
@@ -102,7 +102,7 @@ proc-macro2 = "1.0.36"
102quote = "1.0.15" 102quote = "1.0.15"
103 103
104#stm32-metapac = { version = "16", default-features = false, features = ["metadata"]} 104#stm32-metapac = { version = "16", default-features = false, features = ["metadata"]}
105stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-a7a30c9d54e7415709c463a537501691784672db", default-features = false, features = ["metadata"] } 105stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-380f03cb71f43a242adc45e83607a380ffe0447b", default-features = false, features = ["metadata"] }
106 106
107[features] 107[features]
108default = ["rt"] 108default = ["rt"]
diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs
index d982d9010..f9f03c51b 100644
--- a/embassy-stm32/build.rs
+++ b/embassy-stm32/build.rs
@@ -489,9 +489,39 @@ fn main() {
489 } 489 }
490 490
491 impl<'a> ClockGen<'a> { 491 impl<'a> ClockGen<'a> {
492 fn parse_mul_div(name: &str) -> (&str, Frac) {
493 if name == "hse_div_rtcpre" {
494 return (name, Frac { num: 1, denom: 1 });
495 }
496
497 if let Some(i) = name.find("_div_") {
498 let n = &name[..i];
499 let val: u32 = name[i + 5..].parse().unwrap();
500 (n, Frac { num: 1, denom: val })
501 } else if let Some(i) = name.find("_mul_") {
502 let n = &name[..i];
503 let val: u32 = name[i + 5..].parse().unwrap();
504 (n, Frac { num: val, denom: 1 })
505 } else {
506 (name, Frac { num: 1, denom: 1 })
507 }
508 }
509
492 fn gen_clock(&mut self, peripheral: &str, name: &str) -> TokenStream { 510 fn gen_clock(&mut self, peripheral: &str, name: &str) -> TokenStream {
493 let clock_name = format_ident!("{}", name.to_ascii_lowercase()); 511 let name = name.to_ascii_lowercase();
494 self.clock_names.insert(name.to_ascii_lowercase()); 512 let (name, frac) = Self::parse_mul_div(&name);
513 let clock_name = format_ident!("{}", name);
514 self.clock_names.insert(name.to_string());
515
516 let mut muldiv = quote!();
517 if frac.num != 1 {
518 let val = frac.num;
519 muldiv.extend(quote!(* #val));
520 }
521 if frac.denom != 1 {
522 let val = frac.denom;
523 muldiv.extend(quote!(/ #val));
524 }
495 quote!(unsafe { 525 quote!(unsafe {
496 unwrap!( 526 unwrap!(
497 crate::rcc::get_freqs().#clock_name.to_hertz(), 527 crate::rcc::get_freqs().#clock_name.to_hertz(),
@@ -500,6 +530,7 @@ fn main() {
500 #peripheral, 530 #peripheral,
501 #name 531 #name
502 ) 532 )
533 #muldiv
503 }) 534 })
504 } 535 }
505 536
@@ -1503,29 +1534,6 @@ fn main() {
1503 } 1534 }
1504 } 1535 }
1505 1536
1506 #[derive(Copy, Clone, Debug)]
1507 struct Frac {
1508 num: u32,
1509 denom: u32,
1510 }
1511
1512 impl Frac {
1513 fn simplify(self) -> Self {
1514 let d = gcd(self.num, self.denom);
1515 Self {
1516 num: self.num / d,
1517 denom: self.denom / d,
1518 }
1519 }
1520 }
1521
1522 fn gcd(a: u32, b: u32) -> u32 {
1523 if b == 0 {
1524 return a;
1525 }
1526 gcd(b, a % b)
1527 }
1528
1529 fn parse_num(n: &str) -> Result<Frac, ()> { 1537 fn parse_num(n: &str) -> Result<Frac, ()> {
1530 for prefix in ["DIV", "MUL"] { 1538 for prefix in ["DIV", "MUL"] {
1531 if let Some(n) = n.strip_prefix(prefix) { 1539 if let Some(n) = n.strip_prefix(prefix) {
@@ -2136,3 +2144,26 @@ fn mem_filter(chip: &str, region: &str) -> bool {
2136 2144
2137 true 2145 true
2138} 2146}
2147
2148#[derive(Copy, Clone, Debug)]
2149struct Frac {
2150 num: u32,
2151 denom: u32,
2152}
2153
2154impl Frac {
2155 fn simplify(self) -> Self {
2156 let d = gcd(self.num, self.denom);
2157 Self {
2158 num: self.num / d,
2159 denom: self.denom / d,
2160 }
2161 }
2162}
2163
2164fn gcd(a: u32, b: u32) -> u32 {
2165 if b == 0 {
2166 return a;
2167 }
2168 gcd(b, a % b)
2169}
diff --git a/embassy-stm32/src/rcc/f013.rs b/embassy-stm32/src/rcc/f013.rs
index 13b0ae38e..cfa223d1f 100644
--- a/embassy-stm32/src/rcc/f013.rs
+++ b/embassy-stm32/src/rcc/f013.rs
@@ -289,9 +289,6 @@ pub(crate) unsafe fn init(config: Config) {
289 out_freq 289 out_freq
290 }); 290 });
291 291
292 #[cfg(stm32f3)]
293 let pll_mul_2 = pll.map(|pll| pll * 2u32);
294
295 #[cfg(any(rcc_f1, rcc_f1cl, stm32f3, stm32f107))] 292 #[cfg(any(rcc_f1, rcc_f1cl, stm32f3, stm32f107))]
296 let usb = match pll { 293 let usb = match pll {
297 Some(Hertz(72_000_000)) => Some(crate::pac::rcc::vals::Usbpre::DIV1_5), 294 Some(Hertz(72_000_000)) => Some(crate::pac::rcc::vals::Usbpre::DIV1_5),
@@ -483,9 +480,6 @@ pub(crate) unsafe fn init(config: Config) {
483 hsi: hsi, 480 hsi: hsi,
484 hse: hse, 481 hse: hse,
485 pll1_p: pll, 482 pll1_p: pll,
486 #[cfg(stm32f3)]
487 pll1_p_mul_2: pll_mul_2,
488 hsi_div_244: hsi.map(|h| h / 244u32),
489 sys: Some(sys), 483 sys: Some(sys),
490 pclk1: Some(pclk1), 484 pclk1: Some(pclk1),
491 pclk2: Some(pclk2), 485 pclk2: Some(pclk2),
diff --git a/embassy-stm32/src/rcc/f247.rs b/embassy-stm32/src/rcc/f247.rs
index 8ce9d5f5b..ee67f1cc0 100644
--- a/embassy-stm32/src/rcc/f247.rs
+++ b/embassy-stm32/src/rcc/f247.rs
@@ -316,7 +316,6 @@ pub(crate) unsafe fn init(config: Config) {
316 #[cfg(dsihost)] 316 #[cfg(dsihost)]
317 dsi_phy: None, // DSI PLL clock not supported, don't call `RccPeripheral::frequency()` in the drivers 317 dsi_phy: None, // DSI PLL clock not supported, don't call `RccPeripheral::frequency()` in the drivers
318 318
319 hsi_div488: hsi.map(|hsi| hsi/488u32),
320 hsi_hse: None, 319 hsi_hse: None,
321 afif: None, 320 afif: None,
322 ); 321 );
diff --git a/embassy-stm32/src/rcc/g0.rs b/embassy-stm32/src/rcc/g0.rs
index 2dbf62a9f..e391b1210 100644
--- a/embassy-stm32/src/rcc/g0.rs
+++ b/embassy-stm32/src/rcc/g0.rs
@@ -309,8 +309,6 @@ pub(crate) unsafe fn init(config: Config) {
309 #[cfg(crs)] 309 #[cfg(crs)]
310 hsi48: hsi48, 310 hsi48: hsi48,
311 rtc: rtc, 311 rtc: rtc,
312 hsi_div_8: hsi.map(|h| h / 8u32),
313 hsi_div_488: hsi.map(|h| h / 488u32),
314 312
315 // TODO 313 // TODO
316 lsi: None, 314 lsi: None,
diff --git a/embassy-stm32/src/rcc/g4.rs b/embassy-stm32/src/rcc/g4.rs
index 6b34aa306..d7d5c7388 100644
--- a/embassy-stm32/src/rcc/g4.rs
+++ b/embassy-stm32/src/rcc/g4.rs
@@ -320,6 +320,8 @@ pub(crate) unsafe fn init(config: Config) {
320 hse: hse, 320 hse: hse,
321 hsi48: hsi48, 321 hsi48: hsi48,
322 rtc: rtc, 322 rtc: rtc,
323 lsi: None,
324 lse: None,
323 ); 325 );
324} 326}
325 327
diff --git a/embassy-stm32/src/rcc/h.rs b/embassy-stm32/src/rcc/h.rs
index 33d698861..eaba8cefb 100644
--- a/embassy-stm32/src/rcc/h.rs
+++ b/embassy-stm32/src/rcc/h.rs
@@ -687,7 +687,6 @@ pub(crate) unsafe fn init(config: Config) {
687 hsi: hsi, 687 hsi: hsi,
688 hsi48: hsi48, 688 hsi48: hsi48,
689 csi: csi, 689 csi: csi,
690 csi_div_122: csi.map(|c| c / 122u32),
691 hse: hse, 690 hse: hse,
692 691
693 lse: None, 692 lse: None,
@@ -726,9 +725,9 @@ pub(crate) unsafe fn init(config: Config) {
726 #[cfg(stm32h7rs)] 725 #[cfg(stm32h7rs)]
727 clk48mohci: None, // TODO 726 clk48mohci: None, // TODO
728 #[cfg(stm32h7rs)] 727 #[cfg(stm32h7rs)]
729 hse_div_2: hse.map(|clk| clk / 2u32),
730 #[cfg(stm32h7rs)]
731 usb: Some(Hertz(48_000_000)), 728 usb: Some(Hertz(48_000_000)),
729 #[cfg(stm32h5)]
730 hse_div_rtcpre: None, // TODO
732 ); 731 );
733} 732}
734 733
diff --git a/embassy-stm32/src/rcc/l.rs b/embassy-stm32/src/rcc/l.rs
index 8223a657b..863942f1a 100644
--- a/embassy-stm32/src/rcc/l.rs
+++ b/embassy-stm32/src/rcc/l.rs
@@ -396,7 +396,7 @@ pub(crate) unsafe fn init(config: Config) {
396 hsi48: hsi48, 396 hsi48: hsi48,
397 397
398 #[cfg(any(stm32l0, stm32l1))] 398 #[cfg(any(stm32l0, stm32l1))]
399 pll1_vco_div_2: pll.vco.map(|c| c/2u32), 399 pll1_vco: pll.vco,
400 400
401 #[cfg(not(any(stm32l0, stm32l1)))] 401 #[cfg(not(any(stm32l0, stm32l1)))]
402 pll1_p: pll.p, 402 pll1_p: pll.p,
diff --git a/embassy-stm32/src/rcc/u5.rs b/embassy-stm32/src/rcc/u5.rs
index d15eb53f8..93a327be7 100644
--- a/embassy-stm32/src/rcc/u5.rs
+++ b/embassy-stm32/src/rcc/u5.rs
@@ -345,10 +345,8 @@ pub(crate) unsafe fn init(config: Config) {
345 lse: lse, 345 lse: lse,
346 lsi: lsi, 346 lsi: lsi,
347 hse: hse, 347 hse: hse,
348 hse_div_2: hse.map(|clk| clk / 2u32),
349 hsi: hsi, 348 hsi: hsi,
350 pll1_p: pll1.p, 349 pll1_p: pll1.p,
351 pll1_p_div_2: pll1.p.map(|clk| clk / 2u32),
352 pll1_q: pll1.q, 350 pll1_q: pll1.q,
353 pll1_r: pll1.r, 351 pll1_r: pll1.r,
354 pll2_p: pll2.p, 352 pll2_p: pll2.p,
@@ -363,9 +361,7 @@ pub(crate) unsafe fn init(config: Config) {
363 361
364 // TODO 362 // TODO
365 audioclk: None, 363 audioclk: None,
366 hsi48_div_2: None,
367 shsi: None, 364 shsi: None,
368 shsi_div_2: None,
369 ); 365 );
370} 366}
371 367