Skip to content

Commit 24149c6

Browse files
committed
Add interrupt configured check
1 parent 6ee06d1 commit 24149c6

File tree

3 files changed

+67
-3
lines changed

3 files changed

+67
-3
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
2323
- Make timer `InterruptTypes` fields public to be useful. ([#304])
2424
- Add support for the internal **signature** peripheral ([#281])
2525
- Add common derives to `Toggle`. ([#281])
26+
- Add `is_interrupt_configured` and `configured_interrupts` function to
27+
`serial::Serial` and `timer::Timer`. ([#281])
2628

2729
### Fixed
2830

src/serial.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,43 @@ where
674674
}
675675
}
676676

677+
/// Check if an interrupt is configured for the [`Event`]
678+
#[inline]
679+
pub fn is_interrupt_configured(&self, event: Event) -> bool {
680+
match event {
681+
Event::TransmitDataRegisterEmtpy => self.usart.cr1.read().txeie().is_enabled(),
682+
Event::CtsInterrupt => self.usart.cr3.read().ctsie().is_enabled(),
683+
Event::TransmissionComplete => self.usart.cr1.read().tcie().is_enabled(),
684+
Event::ReceiveDataRegisterNotEmpty => self.usart.cr1.read().rxneie().is_enabled(),
685+
Event::ParityError => self.usart.cr1.read().peie().is_enabled(),
686+
Event::LinBreak => self.usart.cr2.read().lbdie().is_enabled(),
687+
Event::NoiseError | Event::OverrunError | Event::FramingError => {
688+
self.usart.cr3.read().eie().is_enabled()
689+
}
690+
Event::Idle => self.usart.cr1.read().idleie().is_enabled(),
691+
Event::CharacterMatch => self.usart.cr1.read().cmie().is_enabled(),
692+
Event::ReceiverTimeout => self.usart.cr1.read().rtoie().is_enabled(),
693+
// Event::EndOfBlock => self.usart.cr1.read().eobie().is_enabled(),
694+
// Event::WakeupFromStopMode => self.usart.cr3.read().wufie().is_enabled(),
695+
}
696+
}
697+
698+
/// Check which interrupts are enabled for all [`Event`]s
699+
#[cfg(feature = "enumset")]
700+
#[cfg_attr(docsrs, doc(cfg(feature = "enumset")))]
701+
#[inline]
702+
pub fn configured_interrupts(&mut self) -> EnumSet<Event> {
703+
let mut events = EnumSet::new();
704+
705+
for event in EnumSet::<Event>::all().iter() {
706+
if self.is_interrupt_configured(event) {
707+
events |= event;
708+
}
709+
}
710+
711+
events
712+
}
713+
677714
/// Check if an interrupt event happend.
678715
#[inline]
679716
pub fn is_event_triggered(&self, event: Event) -> bool {

src/timer.rs

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,31 @@ where
177177
}
178178
}
179179

180+
/// Check if an interrupt is configured for the [`Event`]
181+
#[inline]
182+
pub fn is_interrupt_configured(&self, event: Event) -> bool {
183+
match event {
184+
Event::Update => self.tim.is_dier_uie_set(),
185+
}
186+
}
187+
188+
// TODO: Add to other implementations as well (Serial, ...)
189+
/// Check which interrupts are enabled for all [`Event`]s
190+
#[cfg(feature = "enumset")]
191+
#[cfg_attr(docsrs, doc(cfg(feature = "enumset")))]
192+
#[inline]
193+
pub fn configured_interrupts(&mut self) -> EnumSet<Event> {
194+
let mut events = EnumSet::new();
195+
196+
for event in EnumSet::<Event>::all().iter() {
197+
if self.is_interrupt_configured(event) {
198+
events |= event;
199+
}
200+
}
201+
202+
events
203+
}
204+
180205
/// Check if an interrupt event happend.
181206
pub fn is_event_triggered(&self, event: Event) -> bool {
182207
match event {
@@ -260,9 +285,9 @@ where
260285
self.tim.set_arr(arr);
261286

262287
// Ensure that the below procedure does not create an unexpected interrupt.
263-
let is_update_interrupt_active = self.tim.is_dier_uie_set();
288+
let is_update_interrupt_active = self.is_interrupt_configured(Event::Update);
264289
if is_update_interrupt_active {
265-
self.tim.set_dier_uie(false);
290+
self.configure_interrupt(Event::Update, false);
266291
}
267292

268293
// Trigger an update event to load the prescaler value to the clock The above line raises
@@ -272,7 +297,7 @@ where
272297
self.clear_event(Event::Update);
273298

274299
if is_update_interrupt_active {
275-
self.tim.set_dier_uie(true);
300+
self.configure_interrupt(Event::Update, true)
276301
}
277302

278303
// start counter

0 commit comments

Comments
 (0)