diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 00000000..3eff80f9 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + { + "associatedIndex": 4 +} + + + + { + "keyToString": { + "RunOnceActivity.OpenProjectViewOnStart": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "last_opened_file_path": "/home/pyth/rust/stm32f3xx-hal_pythcoiner", + "org.rust.cargo.project.model.PROJECT_DISCOVERY": "true" + } +} + + + + + + + + + + + + + 1708585327532 + + + + \ No newline at end of file diff --git a/src/serial.rs b/src/serial.rs index 7af493f4..5cf54f1c 100644 --- a/src/serial.rs +++ b/src/serial.rs @@ -137,6 +137,8 @@ pub enum Event { // /// [`Serial::set_wakeup_from_stopmode_reason()`] // #[doc(alias = "WUF")] // WakeupFromStopMode, + /// Any of the above events occurred + Any, } /// Serial error @@ -490,7 +492,8 @@ where self.configure_interrupt(event, Switch::Off); } - /// Enable or disable the interrupt for the specified [`Event`]. + /// Enable or disable the interrupt for the specified [`Event`], if passing [`Event::Any`] + /// , it will be apply to all events. #[inline] pub fn configure_interrupt(&mut self, event: Event, enable: impl Into) { // Do a round way trip to be convert Into -> bool @@ -513,7 +516,28 @@ where Event::ReceiverTimeout => self.usart.cr1.modify(|_, w| w.rtoie().bit(enable)), // Event::EndOfBlock => self.usart.cr1.modify(|_, w| w.eobie().bit(enable)), // Event::WakeupFromStopMode => self.usart.cr3.modify(|_, w| w.wufie().bit(enable)), + Event::Any => { + self.usart.cr1.modify(|_, w| { + w.txeie().bit(enable); + w.tcie().bit(enable); + w.rxneie().bit(enable); + w.peie().bit(enable); + w.idleie().bit(enable); + w.cmie().bit(enable); + w.rtoie().bit(enable) + // w.eobie().bit(enable); + }); + self.usart.cr2.modify(|_, w| { + w.lbdie().bit(enable) + }); + self.usart.cr3.modify(|_, w| { + w.ctsie().bit(enable); + w.eie().bit(enable) + // w.wufie().bit(enable); + }) + } }; + } /// Enable or disable interrupt for the specified [`Event`]s. @@ -550,6 +574,7 @@ where Event::ReceiverTimeout => self.usart.cr1.read().rtoie().is_enabled(), // Event::EndOfBlock => self.usart.cr1.read().eobie().is_enabled(), // Event::WakeupFromStopMode => self.usart.cr3.read().wufie().is_enabled(), + Event::Any => false, // FIXME: should handle if any of previous cases } } @@ -588,6 +613,8 @@ where Event::ReceiverTimeout => isr.rtof().bit(), // Event::EndOfBlock => isr.eobf().bit(), // Event::WakeupFromStopMode => isr.wuf().bit(), + Event::Any => isr.bits() != 0, // TODO: should we return true if any of ISR bit is 1? + } } @@ -640,6 +667,21 @@ where // Do nothing with this event (only useful for Smartcard, which is not // supported right now) Event::TransmitDataRegisterEmtpy => w, + Event::Any => { + w.ctscf().clear(); + w.tccf().clear(); + w.orecf().clear(); + w.idlecf().clear(); + w.pecf().clear(); + w.pecf().clear(); + w.lbdcf().clear(); + w.ncf().clear(); + w.fecf().clear(); + w.cmcf().clear(); + w.rtocf().clear(); + self.usart.rqr.write(|w| w.rxfrq().set_bit()); + w + } }); }