1use 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}