From 7743c8305b9270889b5cc9c5a2f9edb8b7d8ed1f Mon Sep 17 00:00:00 2001 From: xoviat Date: Wed, 17 Mar 2021 20:13:34 -0500 Subject: [PATCH 1/6] stm32l0: cleanup exti --- embassy-stm32l0/src/exti.rs | 201 ++++++++++++++++++------------------ 1 file changed, 102 insertions(+), 99 deletions(-) diff --git a/embassy-stm32l0/src/exti.rs b/embassy-stm32l0/src/exti.rs index c93d213ef..e5650d3dd 100644 --- a/embassy-stm32l0/src/exti.rs +++ b/embassy-stm32l0/src/exti.rs @@ -105,11 +105,13 @@ pub trait PinWithInterrupt: private::Sealed { } macro_rules! exti { - ($($PER:ident => ($set:ident, $pin:ident),)+) => { + ($set:ident, [ + $($INT:ident => $pin:ident,)+ + ]) => { $( impl private::Sealed for gpio::$set::$pin {} impl PinWithInterrupt for gpio::$set::$pin { - type Interrupt = interrupt::$PER; + type Interrupt = interrupt::$INT; fn port(&self) -> gpio::Port { self.port() } @@ -118,107 +120,108 @@ macro_rules! exti { } } )+ - } + + }; } -exti! { - EXTI0_1 => (gpioa, PA0), - EXTI0_1 => (gpioa, PA1), - EXTI2_3 => (gpioa, PA2), - EXTI2_3 => (gpioa, PA3), - EXTI4_15 => (gpioa, PA4), - EXTI4_15 => (gpioa, PA5), - EXTI4_15 => (gpioa, PA6), - EXTI4_15 => (gpioa, PA7), - EXTI4_15 => (gpioa, PA8), - EXTI4_15 => (gpioa, PA9), - EXTI4_15 => (gpioa, PA10), - EXTI4_15 => (gpioa, PA11), - EXTI4_15 => (gpioa, PA12), - EXTI4_15 => (gpioa, PA13), - EXTI4_15 => (gpioa, PA14), - EXTI4_15 => (gpioa, PA15), -} +exti!(gpioa, [ + EXTI0_1 => PA0, + EXTI0_1 => PA1, + EXTI2_3 => PA2, + EXTI2_3 => PA3, + EXTI4_15 => PA4, + EXTI4_15 => PA5, + EXTI4_15 => PA6, + EXTI4_15 => PA7, + EXTI4_15 => PA8, + EXTI4_15 => PA9, + EXTI4_15 => PA10, + EXTI4_15 => PA11, + EXTI4_15 => PA12, + EXTI4_15 => PA13, + EXTI4_15 => PA14, + EXTI4_15 => PA15, +]); -exti! { - EXTI0_1 => (gpiob, PB0), - EXTI0_1 => (gpiob, PB1), - EXTI2_3 => (gpiob, PB2), - EXTI2_3 => (gpiob, PB3), - EXTI4_15 => (gpiob, PB4), - EXTI4_15 => (gpiob, PB5), - EXTI4_15 => (gpiob, PB6), - EXTI4_15 => (gpiob, PB7), - EXTI4_15 => (gpiob, PB8), - EXTI4_15 => (gpiob, PB9), - EXTI4_15 => (gpiob, PB10), - EXTI4_15 => (gpiob, PB11), - EXTI4_15 => (gpiob, PB12), - EXTI4_15 => (gpiob, PB13), - EXTI4_15 => (gpiob, PB14), - EXTI4_15 => (gpiob, PB15), -} +exti!(gpiob, [ + EXTI0_1 => PB0, + EXTI0_1 => PB1, + EXTI2_3 => PB2, + EXTI2_3 => PB3, + EXTI4_15 => PB4, + EXTI4_15 => PB5, + EXTI4_15 => PB6, + EXTI4_15 => PB7, + EXTI4_15 => PB8, + EXTI4_15 => PB9, + EXTI4_15 => PB10, + EXTI4_15 => PB11, + EXTI4_15 => PB12, + EXTI4_15 => PB13, + EXTI4_15 => PB14, + EXTI4_15 => PB15, +]); -exti! { - EXTI0_1 => (gpioc, PC0), - EXTI0_1 => (gpioc, PC1), - EXTI2_3 => (gpioc, PC2), - EXTI2_3 => (gpioc, PC3), - EXTI4_15 => (gpioc, PC4), - EXTI4_15 => (gpioc, PC5), - EXTI4_15 => (gpioc, PC6), - EXTI4_15 => (gpioc, PC7), - EXTI4_15 => (gpioc, PC8), - EXTI4_15 => (gpioc, PC9), - EXTI4_15 => (gpioc, PC10), - EXTI4_15 => (gpioc, PC11), - EXTI4_15 => (gpioc, PC12), - EXTI4_15 => (gpioc, PC13), - EXTI4_15 => (gpioc, PC14), - EXTI4_15 => (gpioc, PC15), -} +exti!(gpioc, [ + EXTI0_1 => PC0, + EXTI0_1 => PC1, + EXTI2_3 => PC2, + EXTI2_3 => PC3, + EXTI4_15 => PC4, + EXTI4_15 => PC5, + EXTI4_15 => PC6, + EXTI4_15 => PC7, + EXTI4_15 => PC8, + EXTI4_15 => PC9, + EXTI4_15 => PC10, + EXTI4_15 => PC11, + EXTI4_15 => PC12, + EXTI4_15 => PC13, + EXTI4_15 => PC14, + EXTI4_15 => PC15, +]); -exti! { - EXTI0_1 => (gpiod, PD0), - EXTI0_1 => (gpiod, PD1), - EXTI2_3 => (gpiod, PD2), - EXTI2_3 => (gpiod, PD3), - EXTI4_15 => (gpiod, PD4), - EXTI4_15 => (gpiod, PD5), - EXTI4_15 => (gpiod, PD6), - EXTI4_15 => (gpiod, PD7), - EXTI4_15 => (gpiod, PD8), - EXTI4_15 => (gpiod, PD9), - EXTI4_15 => (gpiod, PD10), - EXTI4_15 => (gpiod, PD11), - EXTI4_15 => (gpiod, PD12), - EXTI4_15 => (gpiod, PD13), - EXTI4_15 => (gpiod, PD14), - EXTI4_15 => (gpiod, PD15), -} +exti!(gpiod, [ + EXTI0_1 => PD0, + EXTI0_1 => PD1, + EXTI2_3 => PD2, + EXTI2_3 => PD3, + EXTI4_15 => PD4, + EXTI4_15 => PD5, + EXTI4_15 => PD6, + EXTI4_15 => PD7, + EXTI4_15 => PD8, + EXTI4_15 => PD9, + EXTI4_15 => PD10, + EXTI4_15 => PD11, + EXTI4_15 => PD12, + EXTI4_15 => PD13, + EXTI4_15 => PD14, + EXTI4_15 => PD15, +]); -exti! { - EXTI0_1 => (gpioe, PE0), - EXTI0_1 => (gpioe, PE1), - EXTI2_3 => (gpioe, PE2), - EXTI2_3 => (gpioe, PE3), - EXTI4_15 => (gpioe, PE4), - EXTI4_15 => (gpioe, PE5), - EXTI4_15 => (gpioe, PE6), - EXTI4_15 => (gpioe, PE7), - EXTI4_15 => (gpioe, PE8), - EXTI4_15 => (gpioe, PE9), - EXTI4_15 => (gpioe, PE10), - EXTI4_15 => (gpioe, PE11), - EXTI4_15 => (gpioe, PE12), - EXTI4_15 => (gpioe, PE13), - EXTI4_15 => (gpioe, PE14), - EXTI4_15 => (gpioe, PE15), -} +exti!(gpioe, [ + EXTI0_1 => PE0, + EXTI0_1 => PE1, + EXTI2_3 => PE2, + EXTI2_3 => PE3, + EXTI4_15 => PE4, + EXTI4_15 => PE5, + EXTI4_15 => PE6, + EXTI4_15 => PE7, + EXTI4_15 => PE8, + EXTI4_15 => PE9, + EXTI4_15 => PE10, + EXTI4_15 => PE11, + EXTI4_15 => PE12, + EXTI4_15 => PE13, + EXTI4_15 => PE14, + EXTI4_15 => PE15, +]); -exti! { - EXTI0_1 => (gpioh, PH0), - EXTI0_1 => (gpioh, PH1), - EXTI4_15 => (gpioh, PH9), - EXTI4_15 => (gpioh, PH10), -} +exti!(gpioh, [ + EXTI0_1 => PH0, + EXTI0_1 => PH1, + EXTI4_15 => PH9, + EXTI4_15 => PH10, +]); From 739c47cc33ce650087a48fb5ef3ac85560b54658 Mon Sep 17 00:00:00 2001 From: xoviat Date: Wed, 17 Mar 2021 20:14:29 -0500 Subject: [PATCH 2/6] stm32: exti: remove static mut --- embassy-stm32f4/src/exti.rs | 2 +- embassy-stm32l0/src/exti.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/embassy-stm32f4/src/exti.rs b/embassy-stm32f4/src/exti.rs index 90f3ade39..bf1dd3a71 100644 --- a/embassy-stm32f4/src/exti.rs +++ b/embassy-stm32f4/src/exti.rs @@ -23,7 +23,7 @@ impl<'a> ExtiManager { Self { syscfg } } - pub fn new_pin(&'static mut self, mut pin: T, interrupt: T::Interrupt) -> ExtiPin + pub fn new_pin(&'static self, mut pin: T, interrupt: T::Interrupt) -> ExtiPin where T: HalExtiPin + WithInterrupt, { diff --git a/embassy-stm32l0/src/exti.rs b/embassy-stm32l0/src/exti.rs index e5650d3dd..831fcb2ae 100644 --- a/embassy-stm32l0/src/exti.rs +++ b/embassy-stm32l0/src/exti.rs @@ -22,7 +22,7 @@ impl<'a> ExtiManager { Self { syscfg } } - pub fn new_pin(&'static mut self, pin: T, interrupt: T::Interrupt) -> ExtiPin + pub fn new_pin(&'static self, pin: T, interrupt: T::Interrupt) -> ExtiPin where T: PinWithInterrupt, { From 3d103acdde478bc95580ad0cb9a6e028e43bbde7 Mon Sep 17 00:00:00 2001 From: xoviat Date: Wed, 17 Mar 2021 20:46:40 -0500 Subject: [PATCH 3/6] stm32f4: exti: update api --- embassy-stm32f4/src/exti.rs | 70 +++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 38 deletions(-) diff --git a/embassy-stm32f4/src/exti.rs b/embassy-stm32f4/src/exti.rs index bf1dd3a71..11704e6d1 100644 --- a/embassy-stm32f4/src/exti.rs +++ b/embassy-stm32f4/src/exti.rs @@ -1,49 +1,39 @@ +use core::cell::UnsafeCell; use core::future::Future; use core::mem; use core::pin::Pin; +use cortex_m; use embassy::interrupt::Interrupt; use embassy::traits::gpio::{WaitForFallingEdge, WaitForRisingEdge}; use embassy::util::InterruptFuture; use crate::hal::gpio; -use crate::hal::gpio::{Edge, ExtiPin as HalExtiPin}; +use crate::hal::gpio::Edge; use crate::hal::syscfg::SysCfg; use crate::pac::EXTI; use embedded_hal::digital::v2 as digital; use crate::interrupt; -pub struct ExtiManager { - syscfg: SysCfg, -} - -impl<'a> ExtiManager { - pub fn new(_exti: EXTI, syscfg: SysCfg) -> Self { - Self { syscfg } - } - - pub fn new_pin(&'static self, mut pin: T, interrupt: T::Interrupt) -> ExtiPin - where - T: HalExtiPin + WithInterrupt, - { - pin.make_interrupt_source(&mut self.syscfg); - - ExtiPin { - pin, - interrupt, - _mgr: self, - } - } -} - -pub struct ExtiPin { +pub struct ExtiPin { pin: T, interrupt: T::Interrupt, - _mgr: &'static ExtiManager, } -impl digital::OutputPin for ExtiPin { +impl ExtiPin { + fn new(mut pin: T, interrupt: T::Interrupt) -> Self { + let mut syscfg: SysCfg = unsafe { mem::transmute(()) }; + + cortex_m::interrupt::free(|_| { + pin.make_interrupt_source(&mut syscfg); + }); + + Self { pin, interrupt } + } +} + +impl digital::OutputPin for ExtiPin { type Error = T::Error; fn set_low(&mut self) -> Result<(), Self::Error> { @@ -55,7 +45,7 @@ impl digital::OutputPin for } } -impl digital::StatefulOutputPin +impl digital::StatefulOutputPin for ExtiPin { fn is_set_low(&self) -> Result { @@ -67,7 +57,7 @@ impl digital::Statef } } -impl digital::ToggleableOutputPin +impl digital::ToggleableOutputPin for ExtiPin { type Error = T::Error; @@ -77,7 +67,7 @@ impl digital::Togg } } -impl digital::InputPin for ExtiPin { +impl digital::InputPin for ExtiPin { type Error = T::Error; fn is_high(&self) -> Result { @@ -100,7 +90,7 @@ impl digital::InputPin for Ex EXTI15_10_IRQn EXTI15_10_IRQHandler Handler for pins connected to line 10 to 15 */ -impl WaitForRisingEdge for ExtiPin { +impl WaitForRisingEdge for ExtiPin { type Future<'a> = impl Future + 'a; fn wait_for_rising_edge<'a>(self: Pin<&'a mut Self>) -> Self::Future<'a> { @@ -109,10 +99,12 @@ impl WaitForRisingEdge for ExtiPin { s.pin.clear_interrupt_pending_bit(); async move { let fut = InterruptFuture::new(&mut s.interrupt); - let mut exti: EXTI = unsafe { mem::transmute(()) }; + cortex_m::interrupt::free(|_| { + let mut exti: EXTI = unsafe { mem::transmute(()) }; - s.pin.trigger_on_edge(&mut exti, Edge::RISING); - s.pin.enable_interrupt(&mut exti); + s.pin.trigger_on_edge(&mut exti, Edge::RISING); + s.pin.enable_interrupt(&mut exti); + }); fut.await; s.pin.clear_interrupt_pending_bit(); @@ -120,7 +112,7 @@ impl WaitForRisingEdge for ExtiPin { } } -impl WaitForFallingEdge for ExtiPin { +impl WaitForFallingEdge for ExtiPin { type Future<'a> = impl Future + 'a; fn wait_for_falling_edge<'a>(self: Pin<&'a mut Self>) -> Self::Future<'a> { @@ -129,10 +121,12 @@ impl WaitForFallingEdge for ExtiPin s.pin.clear_interrupt_pending_bit(); async move { let fut = InterruptFuture::new(&mut s.interrupt); - let mut exti: EXTI = unsafe { mem::transmute(()) }; + cortex_m::interrupt::free(|_| { + let mut exti: EXTI = unsafe { mem::transmute(()) }; - s.pin.trigger_on_edge(&mut exti, Edge::FALLING); - s.pin.enable_interrupt(&mut exti); + s.pin.trigger_on_edge(&mut exti, Edge::FALLING); + s.pin.enable_interrupt(&mut exti); + }); fut.await; s.pin.clear_interrupt_pending_bit(); From ccf2ea77f08f5ec16bb26aed821a297475b9ae3f Mon Sep 17 00:00:00 2001 From: xoviat Date: Wed, 17 Mar 2021 20:52:45 -0500 Subject: [PATCH 4/6] fix borrow checker --- embassy-stm32f4/src/exti.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/embassy-stm32f4/src/exti.rs b/embassy-stm32f4/src/exti.rs index 11704e6d1..140b6330c 100644 --- a/embassy-stm32f4/src/exti.rs +++ b/embassy-stm32f4/src/exti.rs @@ -99,11 +99,12 @@ impl WaitForRisingEdge for ExtiPin WaitForFallingEdge for ExtiPin< s.pin.clear_interrupt_pending_bit(); async move { let fut = InterruptFuture::new(&mut s.interrupt); + let pin = &mut s.pin; cortex_m::interrupt::free(|_| { let mut exti: EXTI = unsafe { mem::transmute(()) }; - s.pin.trigger_on_edge(&mut exti, Edge::FALLING); - s.pin.enable_interrupt(&mut exti); + pin.trigger_on_edge(&mut exti, Edge::FALLING); + pin.enable_interrupt(&mut exti); }); fut.await; From 81d99ff1a0ccf8a8f22c93429c6ac30b8de43fe8 Mon Sep 17 00:00:00 2001 From: xoviat Date: Wed, 17 Mar 2021 20:56:48 -0500 Subject: [PATCH 5/6] stm32: exti: update api --- embassy-stm32f4/src/exti.rs | 2 +- embassy-stm32l0/src/exti.rs | 31 ++++++------------------------- 2 files changed, 7 insertions(+), 26 deletions(-) diff --git a/embassy-stm32f4/src/exti.rs b/embassy-stm32f4/src/exti.rs index 140b6330c..5c1a89f7b 100644 --- a/embassy-stm32f4/src/exti.rs +++ b/embassy-stm32f4/src/exti.rs @@ -22,7 +22,7 @@ pub struct ExtiPin { } impl ExtiPin { - fn new(mut pin: T, interrupt: T::Interrupt) -> Self { + pub fn new(mut pin: T, interrupt: T::Interrupt) -> Self { let mut syscfg: SysCfg = unsafe { mem::transmute(()) }; cortex_m::interrupt::free(|_| { diff --git a/embassy-stm32l0/src/exti.rs b/embassy-stm32l0/src/exti.rs index 831fcb2ae..32c56c490 100644 --- a/embassy-stm32l0/src/exti.rs +++ b/embassy-stm32l0/src/exti.rs @@ -13,34 +13,16 @@ use crate::hal::{ use crate::interrupt; use crate::pac::EXTI; -pub struct ExtiManager { - syscfg: SYSCFG, -} - -impl<'a> ExtiManager { - pub fn new(_exti: Exti, syscfg: SYSCFG) -> Self { - Self { syscfg } - } - - pub fn new_pin(&'static self, pin: T, interrupt: T::Interrupt) -> ExtiPin - where - T: PinWithInterrupt, - { - ExtiPin { - pin, - interrupt, - mgr: self, - } - } -} - pub struct ExtiPin { pin: T, interrupt: T::Interrupt, - mgr: &'static ExtiManager, } impl ExtiPin { + pub fn new(pin: T, interrupt: T::Interrupt) -> ExtiPin { + ExtiPin { pin, interrupt } + } + fn wait_for_edge<'a>( self: Pin<&'a mut Self>, edge: TriggerEdge, @@ -57,10 +39,9 @@ impl ExtiPin { let fut = InterruptFuture::new(&mut s.interrupt); let port = s.pin.port(); - let syscfg = &s.mgr.syscfg as *const _ as *mut SYSCFG; cortex_m::interrupt::free(|_| { - let syscfg = unsafe { &mut *syscfg }; - exti.listen_gpio(syscfg, port, line, edge); + let mut syscfg: SYSCFG = unsafe { mem::transmute(()) }; + exti.listen_gpio(&mut syscfg, port, line, edge); }); fut.await; From 1908141c867e72c19bddad13388e455bfb2f03bd Mon Sep 17 00:00:00 2001 From: xoviat Date: Wed, 17 Mar 2021 21:11:34 -0500 Subject: [PATCH 6/6] fix extipin --- embassy-stm32f4-examples/src/bin/exti.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/embassy-stm32f4-examples/src/bin/exti.rs b/embassy-stm32f4-examples/src/bin/exti.rs index 0c6561cda..2201189eb 100644 --- a/embassy-stm32f4-examples/src/bin/exti.rs +++ b/embassy-stm32f4-examples/src/bin/exti.rs @@ -13,22 +13,19 @@ use cortex_m_rt::entry; use embassy::executor::{task, Executor}; use embassy::traits::gpio::*; use embassy::util::Forever; -use embassy_stm32f4::exti; +use embassy_stm32f4::exti::ExtiPin; use embassy_stm32f4::interrupt; use futures::pin_mut; use stm32f4xx_hal::prelude::*; use stm32f4xx_hal::stm32; -static EXTI: Forever = Forever::new(); - #[task] async fn run(dp: stm32::Peripherals, _cp: cortex_m::Peripherals) { let gpioa = dp.GPIOA.split(); let button = gpioa.pa0.into_pull_up_input(); - let exti = EXTI.put(exti::ExtiManager::new(dp.EXTI, dp.SYSCFG.constrain())); - let pin = exti.new_pin(button, interrupt::take!(EXTI0)); + let pin = ExtiPin::new(button, interrupt::take!(EXTI0)); pin_mut!(pin); info!("Starting loop");