stm32l1xx_hal/
exti.rs

1//! External interrupt controller
2use crate::bb;
3use crate::stm32::EXTI;
4
5pub enum TriggerEdge {
6    Rising,
7    Falling,
8    All,
9}
10
11pub trait ExtiExt {
12    fn listen(&self, line: u8, edge: TriggerEdge);
13    fn unlisten(&self, line: u8);
14    fn pend_interrupt(&self, line: u8);
15    fn clear_irq(&self, line: u8);
16}
17
18impl ExtiExt for EXTI {
19    fn listen(&self, line: u8, edge: TriggerEdge) {
20        assert!(line < 24);
21        match edge {
22            TriggerEdge::Rising => bb::set(&self.rtsr, line),
23            TriggerEdge::Falling => bb::set(&self.ftsr, line),
24            TriggerEdge::All => {
25                bb::set(&self.rtsr, line);
26                bb::set(&self.ftsr, line);
27            }
28        }
29        bb::set(&self.imr, line);
30    }
31
32    fn unlisten(&self, line: u8) {
33        assert!(line < 24);
34        bb::clear(&self.rtsr, line);
35        bb::clear(&self.ftsr, line);
36        bb::clear(&self.imr, line);
37    }
38
39    fn pend_interrupt(&self, line: u8) {
40        assert!(line < 24);
41        bb::set(&self.swier, line);
42    }
43
44    fn clear_irq(&self, line: u8) {
45        assert!(line < 24);
46        bb::set(&self.pr, line);
47    }
48}