Merge pull request #3738 from embassy-rs/stm32-filter-pins

stm32: generate singletons only for pins that actually exist.
This commit is contained in:
Dario Nieuwenhuis 2025-01-07 21:07:40 +01:00 committed by GitHub
commit 33d6f65453
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 48 additions and 46 deletions

View File

@ -73,7 +73,7 @@ rand_core = "0.6.3"
sdio-host = "0.5.0" sdio-host = "0.5.0"
critical-section = "1.1" critical-section = "1.1"
#stm32-metapac = { version = "15" } #stm32-metapac = { version = "15" }
stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-fad4bc0f2baac29ecebb5153d2997b649b71025f" } stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-db71f6aa03b7db26548b461d3844fc404d40c98c" }
vcell = "0.1.3" vcell = "0.1.3"
nb = "1.0.0" nb = "1.0.0"
@ -102,7 +102,7 @@ proc-macro2 = "1.0.36"
quote = "1.0.15" quote = "1.0.15"
#stm32-metapac = { version = "15", default-features = false, features = ["metadata"]} #stm32-metapac = { version = "15", default-features = false, features = ["metadata"]}
stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-fad4bc0f2baac29ecebb5153d2997b649b71025f", default-features = false, features = ["metadata"] } stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-db71f6aa03b7db26548b461d3844fc404d40c98c", default-features = false, features = ["metadata"] }
[features] [features]
default = ["rt"] default = ["rt"]

View File

@ -53,6 +53,13 @@ fn main() {
// Generate singletons // Generate singletons
let mut singletons: Vec<String> = Vec::new(); let mut singletons: Vec<String> = Vec::new();
// Generate one singleton per pin
for p in METADATA.pins {
singletons.push(p.name.to_string());
}
// generate one singleton per peripheral (with many exceptions...)
for p in METADATA.peripherals { for p in METADATA.peripherals {
if let Some(r) = &p.registers { if let Some(r) = &p.registers {
if r.kind == "adccommon" || r.kind == "sai" || r.kind == "ucpd" || r.kind == "otg" || r.kind == "octospi" { if r.kind == "adccommon" || r.kind == "sai" || r.kind == "ucpd" || r.kind == "otg" || r.kind == "octospi" {
@ -63,13 +70,8 @@ fn main() {
} }
match r.kind { match r.kind {
// Generate singletons per pin, not per port // handled above
"gpio" => { "gpio" => {}
let port_letter = p.name.strip_prefix("GPIO").unwrap();
for pin_num in 0..16 {
singletons.push(format!("P{}{}", port_letter, pin_num));
}
}
// No singleton for these, the HAL handles them specially. // No singleton for these, the HAL handles them specially.
"exti" => {} "exti" => {}
@ -1478,18 +1480,16 @@ fn main() {
let gpio_base = METADATA.peripherals.iter().find(|p| p.name == "GPIOA").unwrap().address as u32; let gpio_base = METADATA.peripherals.iter().find(|p| p.name == "GPIOA").unwrap().address as u32;
let gpio_stride = 0x400; let gpio_stride = 0x400;
for p in METADATA.peripherals { for pin in METADATA.pins {
if let Some(regs) = &p.registers { let port_letter = pin.name.chars().nth(1).unwrap();
if regs.kind == "gpio" { let pname = format!("GPIO{}", port_letter);
let port_letter = p.name.chars().nth(4).unwrap(); let p = METADATA.peripherals.iter().find(|p| p.name == pname).unwrap();
assert_eq!(0, (p.address as u32 - gpio_base) % gpio_stride); assert_eq!(0, (p.address as u32 - gpio_base) % gpio_stride);
let port_num = (p.address as u32 - gpio_base) / gpio_stride; let port_num = (p.address as u32 - gpio_base) / gpio_stride;
let pin_num: u32 = pin.name[2..].parse().unwrap();
for pin_num in 0u32..16 {
let pin_name = format!("P{}{}", port_letter, pin_num);
pins_table.push(vec![ pins_table.push(vec![
pin_name.clone(), pin.name.to_string(),
p.name.to_string(), p.name.to_string(),
port_num.to_string(), port_num.to_string(),
pin_num.to_string(), pin_num.to_string(),
@ -1513,8 +1513,9 @@ fn main() {
} }
} }
} }
}
for p in METADATA.peripherals {
if let Some(regs) = &p.registers {
if regs.kind == "adc" { if regs.kind == "adc" {
let adc_num = p.name.strip_prefix("ADC").unwrap(); let adc_num = p.name.strip_prefix("ADC").unwrap();
let mut adc_common = None; let mut adc_common = None;

View File

@ -18,7 +18,7 @@ fn main() -> ! {
let mut spi = Spi::new_blocking(p.SPI3, p.PC10, p.PC12, p.PC11, spi_config); let mut spi = Spi::new_blocking(p.SPI3, p.PC10, p.PC12, p.PC11, spi_config);
let mut cs = Output::new(p.PE0, Level::High, Speed::VeryHigh); let mut cs = Output::new(p.PC13, Level::High, Speed::VeryHigh);
loop { loop {
let mut buf = [0x0Au8; 4]; let mut buf = [0x0Au8; 4];

View File

@ -12,7 +12,8 @@ async fn main(_spawner: Spawner) -> ! {
let p = embassy_stm32::init(Default::default()); let p = embassy_stm32::init(Default::default());
info!("Hello World!"); info!("Hello World!");
let mut led = Output::new(p.PH7, Level::Low, Speed::Medium); // replace PC13 with the right pin for your board.
let mut led = Output::new(p.PC13, Level::Low, Speed::Medium);
loop { loop {
defmt::info!("on!"); defmt::info!("on!");