aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/Cargo.toml4
-rw-r--r--embassy-stm32/build.rs85
-rw-r--r--examples/stm32u0/src/bin/spi.rs2
-rw-r--r--examples/stm32u5/src/bin/blinky.rs3
4 files changed, 48 insertions, 46 deletions
diff --git a/embassy-stm32/Cargo.toml b/embassy-stm32/Cargo.toml
index d66d3bc1d..cf336e4d0 100644
--- a/embassy-stm32/Cargo.toml
+++ b/embassy-stm32/Cargo.toml
@@ -73,7 +73,7 @@ rand_core = "0.6.3"
73sdio-host = "0.5.0" 73sdio-host = "0.5.0"
74critical-section = "1.1" 74critical-section = "1.1"
75#stm32-metapac = { version = "15" } 75#stm32-metapac = { version = "15" }
76stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-fad4bc0f2baac29ecebb5153d2997b649b71025f" } 76stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-db71f6aa03b7db26548b461d3844fc404d40c98c" }
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 = "15", default-features = false, features = ["metadata"]} 104#stm32-metapac = { version = "15", default-features = false, features = ["metadata"]}
105stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-fad4bc0f2baac29ecebb5153d2997b649b71025f", default-features = false, features = ["metadata"] } 105stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-db71f6aa03b7db26548b461d3844fc404d40c98c", 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 43bbef7e4..09f940d29 100644
--- a/embassy-stm32/build.rs
+++ b/embassy-stm32/build.rs
@@ -53,6 +53,13 @@ fn main() {
53 // Generate singletons 53 // Generate singletons
54 54
55 let mut singletons: Vec<String> = Vec::new(); 55 let mut singletons: Vec<String> = Vec::new();
56
57 // Generate one singleton per pin
58 for p in METADATA.pins {
59 singletons.push(p.name.to_string());
60 }
61
62 // generate one singleton per peripheral (with many exceptions...)
56 for p in METADATA.peripherals { 63 for p in METADATA.peripherals {
57 if let Some(r) = &p.registers { 64 if let Some(r) = &p.registers {
58 if r.kind == "adccommon" || r.kind == "sai" || r.kind == "ucpd" || r.kind == "otg" || r.kind == "octospi" { 65 if r.kind == "adccommon" || r.kind == "sai" || r.kind == "ucpd" || r.kind == "otg" || r.kind == "octospi" {
@@ -63,13 +70,8 @@ fn main() {
63 } 70 }
64 71
65 match r.kind { 72 match r.kind {
66 // Generate singletons per pin, not per port 73 // handled above
67 "gpio" => { 74 "gpio" => {}
68 let port_letter = p.name.strip_prefix("GPIO").unwrap();
69 for pin_num in 0..16 {
70 singletons.push(format!("P{}{}", port_letter, pin_num));
71 }
72 }
73 75
74 // No singleton for these, the HAL handles them specially. 76 // No singleton for these, the HAL handles them specially.
75 "exti" => {} 77 "exti" => {}
@@ -1478,43 +1480,42 @@ fn main() {
1478 let gpio_base = METADATA.peripherals.iter().find(|p| p.name == "GPIOA").unwrap().address as u32; 1480 let gpio_base = METADATA.peripherals.iter().find(|p| p.name == "GPIOA").unwrap().address as u32;
1479 let gpio_stride = 0x400; 1481 let gpio_stride = 0x400;
1480 1482
1481 for p in METADATA.peripherals { 1483 for pin in METADATA.pins {
1482 if let Some(regs) = &p.registers { 1484 let port_letter = pin.name.chars().nth(1).unwrap();
1483 if regs.kind == "gpio" { 1485 let pname = format!("GPIO{}", port_letter);
1484 let port_letter = p.name.chars().nth(4).unwrap(); 1486 let p = METADATA.peripherals.iter().find(|p| p.name == pname).unwrap();
1485 assert_eq!(0, (p.address as u32 - gpio_base) % gpio_stride); 1487 assert_eq!(0, (p.address as u32 - gpio_base) % gpio_stride);
1486 let port_num = (p.address as u32 - gpio_base) / gpio_stride; 1488 let port_num = (p.address as u32 - gpio_base) / gpio_stride;
1487 1489 let pin_num: u32 = pin.name[2..].parse().unwrap();
1488 for pin_num in 0u32..16 { 1490
1489 let pin_name = format!("P{}{}", port_letter, pin_num); 1491 pins_table.push(vec![
1490 1492 pin.name.to_string(),
1491 pins_table.push(vec![ 1493 p.name.to_string(),
1492 pin_name.clone(), 1494 port_num.to_string(),
1493 p.name.to_string(), 1495 pin_num.to_string(),
1494 port_num.to_string(), 1496 format!("EXTI{}", pin_num),
1495 pin_num.to_string(), 1497 ]);
1496 format!("EXTI{}", pin_num), 1498
1497 ]); 1499 // If we have the split pins, we need to do a little extra work:
1498 1500 // Add the "_C" variant to the table. The solution is not optimal, though.
1499 // If we have the split pins, we need to do a little extra work: 1501 // Adding them only when the corresponding GPIOx also appears.
1500 // Add the "_C" variant to the table. The solution is not optimal, though. 1502 // This should avoid unintended side-effects as much as possible.
1501 // Adding them only when the corresponding GPIOx also appears. 1503 #[cfg(feature = "_split-pins-enabled")]
1502 // This should avoid unintended side-effects as much as possible. 1504 for split_feature in &split_features {
1503 #[cfg(feature = "_split-pins-enabled")] 1505 if split_feature.pin_name_without_c == pin_name {
1504 for split_feature in &split_features { 1506 pins_table.push(vec![
1505 if split_feature.pin_name_without_c == pin_name { 1507 split_feature.pin_name_with_c.to_string(),
1506 pins_table.push(vec![ 1508 p.name.to_string(),
1507 split_feature.pin_name_with_c.to_string(), 1509 port_num.to_string(),
1508 p.name.to_string(), 1510 pin_num.to_string(),
1509 port_num.to_string(), 1511 format!("EXTI{}", pin_num),
1510 pin_num.to_string(), 1512 ]);
1511 format!("EXTI{}", pin_num),
1512 ]);
1513 }
1514 }
1515 }
1516 } 1513 }
1514 }
1515 }
1517 1516
1517 for p in METADATA.peripherals {
1518 if let Some(regs) = &p.registers {
1518 if regs.kind == "adc" { 1519 if regs.kind == "adc" {
1519 let adc_num = p.name.strip_prefix("ADC").unwrap(); 1520 let adc_num = p.name.strip_prefix("ADC").unwrap();
1520 let mut adc_common = None; 1521 let mut adc_common = None;
diff --git a/examples/stm32u0/src/bin/spi.rs b/examples/stm32u0/src/bin/spi.rs
index 5693a3765..e03591daf 100644
--- a/examples/stm32u0/src/bin/spi.rs
+++ b/examples/stm32u0/src/bin/spi.rs
@@ -18,7 +18,7 @@ fn main() -> ! {
18 18
19 let mut spi = Spi::new_blocking(p.SPI3, p.PC10, p.PC12, p.PC11, spi_config); 19 let mut spi = Spi::new_blocking(p.SPI3, p.PC10, p.PC12, p.PC11, spi_config);
20 20
21 let mut cs = Output::new(p.PE0, Level::High, Speed::VeryHigh); 21 let mut cs = Output::new(p.PC13, Level::High, Speed::VeryHigh);
22 22
23 loop { 23 loop {
24 let mut buf = [0x0Au8; 4]; 24 let mut buf = [0x0Au8; 4];
diff --git a/examples/stm32u5/src/bin/blinky.rs b/examples/stm32u5/src/bin/blinky.rs
index 7fe88c183..1fdfc7679 100644
--- a/examples/stm32u5/src/bin/blinky.rs
+++ b/examples/stm32u5/src/bin/blinky.rs
@@ -12,7 +12,8 @@ async fn main(_spawner: Spawner) -> ! {
12 let p = embassy_stm32::init(Default::default()); 12 let p = embassy_stm32::init(Default::default());
13 info!("Hello World!"); 13 info!("Hello World!");
14 14
15 let mut led = Output::new(p.PH7, Level::Low, Speed::Medium); 15 // replace PC13 with the right pin for your board.
16 let mut led = Output::new(p.PC13, Level::Low, Speed::Medium);
16 17
17 loop { 18 loop {
18 defmt::info!("on!"); 19 defmt::info!("on!");