aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/exti.rs
diff options
context:
space:
mode:
authorBen Gamari <[email protected]>2021-07-30 16:48:13 -0400
committerDario Nieuwenhuis <[email protected]>2021-08-20 00:15:11 +0200
commite2f71ffbbdeac4f64b0468fc7e93452388c16eee (patch)
treec88ac34d8a25021a0257966bf8aa3b918c8ac374 /embassy-stm32/src/exti.rs
parent174c51f09707b8a475382071f99e0d9c44f93ab7 (diff)
Add support for STM32G0
Diffstat (limited to 'embassy-stm32/src/exti.rs')
-rw-r--r--embassy-stm32/src/exti.rs44
1 files changed, 37 insertions, 7 deletions
diff --git a/embassy-stm32/src/exti.rs b/embassy-stm32/src/exti.rs
index 659daa377..8e4989a3e 100644
--- a/embassy-stm32/src/exti.rs
+++ b/embassy-stm32/src/exti.rs
@@ -11,7 +11,8 @@ use embedded_hal::digital::v2::InputPin;
11use crate::gpio::{AnyPin, Input, Pin as GpioPin}; 11use crate::gpio::{AnyPin, Input, Pin as GpioPin};
12use crate::interrupt; 12use crate::interrupt;
13use crate::pac; 13use crate::pac;
14use crate::pac::{EXTI, SYSCFG}; 14use crate::pac::exti::regs::Lines;
15use crate::pac::EXTI;
15use crate::peripherals; 16use crate::peripherals;
16 17
17const EXTI_COUNT: usize = 16; 18const EXTI_COUNT: usize = 16;
@@ -28,19 +29,37 @@ fn cpu_regs() -> pac::exti::Exti {
28 EXTI 29 EXTI
29} 30}
30 31
32#[cfg(not(any(exti_g0, exti_l5)))]
33fn exticr_regs() -> pac::syscfg::Syscfg {
34 pac::SYSCFG
35}
36#[cfg(any(exti_g0, exti_l5))]
37fn exticr_regs() -> pac::exti::Exti {
38 EXTI
39}
40
31pub unsafe fn on_irq() { 41pub unsafe fn on_irq() {
32 let bits = EXTI.pr(0).read(); 42 #[cfg(not(any(exti_g0, exti_l5)))]
43 let bits = EXTI.pr(0).read().0;
44 #[cfg(any(exti_g0, exti_l5))]
45 let bits = EXTI.rpr(0).read().0 | EXTI.fpr(0).read().0;
33 46
34 // Mask all the channels that fired. 47 // Mask all the channels that fired.
35 cpu_regs().imr(0).modify(|w| w.0 &= !bits.0); 48 cpu_regs().imr(0).modify(|w| w.0 &= !bits);
36 49
37 // Wake the tasks 50 // Wake the tasks
38 for pin in BitIter(bits.0) { 51 for pin in BitIter(bits) {
39 EXTI_WAKERS[pin as usize].wake(); 52 EXTI_WAKERS[pin as usize].wake();
40 } 53 }
41 54
42 // Clear pending 55 // Clear pending
43 EXTI.pr(0).write_value(bits); 56 #[cfg(not(any(exti_g0, exti_l5)))]
57 EXTI.pr(0).write_value(Lines(bits));
58 #[cfg(any(exti_g0, exti_l5))]
59 {
60 EXTI.rpr(0).write_value(Lines(bits));
61 EXTI.fpr(0).write_value(Lines(bits));
62 }
44} 63}
45 64
46struct BitIter(u32); 65struct BitIter(u32);
@@ -117,10 +136,21 @@ impl<'a> ExtiInputFuture<'a> {
117 fn new(pin: u8, port: u8, rising: bool, falling: bool) -> Self { 136 fn new(pin: u8, port: u8, rising: bool, falling: bool) -> Self {
118 cortex_m::interrupt::free(|_| unsafe { 137 cortex_m::interrupt::free(|_| unsafe {
119 let pin = pin as usize; 138 let pin = pin as usize;
120 SYSCFG.exticr(pin / 4).modify(|w| w.set_exti(pin % 4, port)); 139 exticr_regs()
140 .exticr(pin / 4)
141 .modify(|w| w.set_exti(pin % 4, port));
121 EXTI.rtsr(0).modify(|w| w.set_line(pin, rising)); 142 EXTI.rtsr(0).modify(|w| w.set_line(pin, rising));
122 EXTI.ftsr(0).modify(|w| w.set_line(pin, falling)); 143 EXTI.ftsr(0).modify(|w| w.set_line(pin, falling));
123 EXTI.pr(0).write(|w| w.set_line(pin, true)); // clear pending bit 144
145 // clear pending bit
146 #[cfg(not(any(exti_g0, exti_l5)))]
147 EXTI.pr(0).write(|w| w.set_line(pin, true));
148 #[cfg(any(exti_g0, exti_l5))]
149 {
150 EXTI.rpr(0).write(|w| w.set_line(pin, true));
151 EXTI.fpr(0).write(|w| w.set_line(pin, true));
152 }
153
124 cpu_regs().imr(0).modify(|w| w.set_line(pin, true)); 154 cpu_regs().imr(0).modify(|w| w.set_line(pin, true));
125 }); 155 });
126 156