diff --git a/embassy-stm32/src/gpio.rs b/embassy-stm32/src/gpio.rs index bf8400ca..09f241fa 100644 --- a/embassy-stm32/src/gpio.rs +++ b/embassy-stm32/src/gpio.rs @@ -449,3 +449,13 @@ crate::pac::pins!( } }; ); + +pub(crate) unsafe fn init() { + crate::pac::gpio_rcc! { + ($name:ident, $clock:ident, $en_reg:ident, $rst_reg:ident, $en_fn:ident, $rst_fn:ident) => { + crate::pac::RCC.$en_reg().modify(|reg| { + reg.$en_fn(true); + }); + }; + } +} diff --git a/embassy-stm32/src/lib.rs b/embassy-stm32/src/lib.rs index 07f8b9f3..89fd8644 100644 --- a/embassy-stm32/src/lib.rs +++ b/embassy-stm32/src/lib.rs @@ -89,6 +89,7 @@ pub fn init(config: Config) -> Peripherals { let p = Peripherals::take(); unsafe { + gpio::init(); dma::init(); #[cfg(exti)] exti::init(); diff --git a/examples/stm32h7/src/bin/usart_dma.rs b/examples/stm32h7/src/bin/usart_dma.rs index 097466ce..90735650 100644 --- a/examples/stm32h7/src/bin/usart_dma.rs +++ b/examples/stm32h7/src/bin/usart_dma.rs @@ -71,22 +71,10 @@ fn main() -> ! { .pll1_q_ck(48.mhz()) .freeze(pwrcfg, &pp.SYSCFG); - let pp = unsafe { pac::Peripherals::steal() }; - unsafe { Dbgmcu::enable_all(); } - pp.RCC.ahb4enr.modify(|_, w| { - w.gpioaen().set_bit(); - w.gpioben().set_bit(); - w.gpiocen().set_bit(); - w.gpioden().set_bit(); - w.gpioeen().set_bit(); - w.gpiofen().set_bit(); - w - }); - unsafe { embassy::time::set_clock(&ZeroClock) }; let executor = EXECUTOR.put(Executor::new()); diff --git a/stm32-metapac-gen/src/lib.rs b/stm32-metapac-gen/src/lib.rs index bfc2384c..1c7ac38e 100644 --- a/stm32-metapac-gen/src/lib.rs +++ b/stm32-metapac-gen/src/lib.rs @@ -287,6 +287,7 @@ pub fn gen(options: Options) { let mut peripheral_counts: HashMap = HashMap::new(); let mut dma_channel_counts: HashMap = HashMap::new(); let mut dbgmcu_table: Vec> = Vec::new(); + let mut gpio_rcc_table: Vec> = Vec::new(); let gpio_base = core.peripherals.get(&"GPIOA".to_string()).unwrap().address; let gpio_stride = 0x400; @@ -465,29 +466,32 @@ pub fn gen(options: Options) { clock.to_ascii_lowercase() }; - if !name.starts_with("GPIO") { - let mut row = Vec::with_capacity(6); - row.push(name.clone()); - row.push(clock); - row.push(enable_reg.to_ascii_lowercase()); + let mut row = Vec::with_capacity(6); + row.push(name.clone()); + row.push(clock); + row.push(enable_reg.to_ascii_lowercase()); - if let Some((reset_reg, reset_field)) = reset_reg_field { - row.push(reset_reg.to_ascii_lowercase()); - row.push(format!( - "set_{}", - enable_field.to_ascii_lowercase() - )); - row.push(format!( - "set_{}", - reset_field.to_ascii_lowercase() - )); - } else { - row.push(format!( - "set_{}", - enable_field.to_ascii_lowercase() - )); - } + if let Some((reset_reg, reset_field)) = reset_reg_field { + row.push(reset_reg.to_ascii_lowercase()); + row.push(format!( + "set_{}", + enable_field.to_ascii_lowercase() + )); + row.push(format!( + "set_{}", + reset_field.to_ascii_lowercase() + )); + } else { + row.push(format!( + "set_{}", + enable_field.to_ascii_lowercase() + )); + } + + if !name.starts_with("GPIO") { peripheral_rcc_table.push(row); + } else { + gpio_rcc_table.push(row); } } (None, Some(_)) => { @@ -586,6 +590,7 @@ pub fn gen(options: Options) { &peripheral_dma_channels_table, ); make_table(&mut extra, "peripheral_rcc", &peripheral_rcc_table); + make_table(&mut extra, "gpio_rcc", &gpio_rcc_table); make_table(&mut extra, "dma_channels", &dma_channels_table); make_table(&mut extra, "dbgmcu", &dbgmcu_table); make_peripheral_counts(&mut extra, &peripheral_counts);