aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/build.rs
diff options
context:
space:
mode:
authorxoviat <[email protected]>2025-11-11 17:19:26 +0000
committerGitHub <[email protected]>2025-11-11 17:19:26 +0000
commit0d1fc76a10863b85961a63db4a9e1e2807f35957 (patch)
tree1ffe8a8dddec7085876adb8bfcd86c3fed22ae74 /embassy-stm32/build.rs
parentf078c85454f09f28a85aa834a9496b37058695e0 (diff)
parent769941980442ada1524ee4f60f1d003735caff4b (diff)
Merge pull request #4866 from xoviat/adc
adc: impl. differential channels
Diffstat (limited to 'embassy-stm32/build.rs')
-rw-r--r--embassy-stm32/build.rs37
1 files changed, 30 insertions, 7 deletions
diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs
index 09a05ce68..48da475df 100644
--- a/embassy-stm32/build.rs
+++ b/embassy-stm32/build.rs
@@ -1353,6 +1353,8 @@ fn main() {
1353 1353
1354 for p in METADATA.peripherals { 1354 for p in METADATA.peripherals {
1355 if let Some(regs) = &p.registers { 1355 if let Some(regs) = &p.registers {
1356 let mut adc_pairs: BTreeMap<u8, (Option<Ident>, Option<Ident>)> = BTreeMap::new();
1357
1356 for pin in p.pins { 1358 for pin in p.pins {
1357 let key = (regs.kind, pin.signal); 1359 let key = (regs.kind, pin.signal);
1358 if let Some(tr) = signals.get(&key) { 1360 if let Some(tr) = signals.get(&key) {
@@ -1474,25 +1476,29 @@ fn main() {
1474 }; 1476 };
1475 1477
1476 // H7 has differential voltage measurements 1478 // H7 has differential voltage measurements
1477 let ch: Option<u8> = if pin.signal.starts_with("INP") { 1479 let ch: Option<(u8, bool)> = if pin.signal.starts_with("INP") {
1478 Some(pin.signal.strip_prefix("INP").unwrap().parse().unwrap()) 1480 Some((pin.signal.strip_prefix("INP").unwrap().parse().unwrap(), false))
1479 } else if pin.signal.starts_with("INN") { 1481 } else if pin.signal.starts_with("INN") {
1480 // TODO handle in the future when embassy supports differential measurements 1482 Some((pin.signal.strip_prefix("INN").unwrap().parse().unwrap(), true))
1481 None
1482 } else if pin.signal.starts_with("IN") && pin.signal.ends_with('b') { 1483 } else if pin.signal.starts_with("IN") && pin.signal.ends_with('b') {
1483 // we number STM32L1 ADC bank 1 as 0..=31, bank 2 as 32..=63 1484 // we number STM32L1 ADC bank 1 as 0..=31, bank 2 as 32..=63
1484 let signal = pin.signal.strip_prefix("IN").unwrap().strip_suffix('b').unwrap(); 1485 let signal = pin.signal.strip_prefix("IN").unwrap().strip_suffix('b').unwrap();
1485 Some(32u8 + signal.parse::<u8>().unwrap()) 1486 Some((32u8 + signal.parse::<u8>().unwrap(), false))
1486 } else if pin.signal.starts_with("IN") { 1487 } else if pin.signal.starts_with("IN") {
1487 Some(pin.signal.strip_prefix("IN").unwrap().parse().unwrap()) 1488 Some((pin.signal.strip_prefix("IN").unwrap().parse().unwrap(), false))
1488 } else { 1489 } else {
1489 None 1490 None
1490 }; 1491 };
1491 if let Some(ch) = ch { 1492 if let Some((ch, false)) = ch {
1493 adc_pairs.entry(ch).or_insert((None, None)).0.replace(pin_name.clone());
1494
1492 g.extend(quote! { 1495 g.extend(quote! {
1493 impl_adc_pin!( #peri, #pin_name, #ch); 1496 impl_adc_pin!( #peri, #pin_name, #ch);
1494 }) 1497 })
1495 } 1498 }
1499 if let Some((ch, true)) = ch {
1500 adc_pairs.entry(ch).or_insert((None, None)).1.replace(pin_name.clone());
1501 }
1496 } 1502 }
1497 1503
1498 if regs.kind == "opamp" { 1504 if regs.kind == "opamp" {
@@ -1531,6 +1537,23 @@ fn main() {
1531 }) 1537 })
1532 } 1538 }
1533 } 1539 }
1540
1541 {
1542 let peri = format_ident!("{}", p.name);
1543
1544 for (ch, (pin, npin)) in adc_pairs {
1545 let (pin_name, npin_name) = match (pin, npin) {
1546 (Some(pin), Some(npin)) => (pin, npin),
1547 _ => {
1548 continue;
1549 }
1550 };
1551
1552 g.extend(quote! {
1553 impl_adc_pair!( #peri, #pin_name, #npin_name, #ch);
1554 })
1555 }
1556 }
1534 } 1557 }
1535 } 1558 }
1536 1559