diff options
| author | Ben Gamari <[email protected]> | 2021-07-30 16:48:13 -0400 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2021-08-20 00:15:11 +0200 |
| commit | e2f71ffbbdeac4f64b0468fc7e93452388c16eee (patch) | |
| tree | c88ac34d8a25021a0257966bf8aa3b918c8ac374 /embassy-stm32/src/exti.rs | |
| parent | 174c51f09707b8a475382071f99e0d9c44f93ab7 (diff) | |
Add support for STM32G0
Diffstat (limited to 'embassy-stm32/src/exti.rs')
| -rw-r--r-- | embassy-stm32/src/exti.rs | 44 |
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; | |||
| 11 | use crate::gpio::{AnyPin, Input, Pin as GpioPin}; | 11 | use crate::gpio::{AnyPin, Input, Pin as GpioPin}; |
| 12 | use crate::interrupt; | 12 | use crate::interrupt; |
| 13 | use crate::pac; | 13 | use crate::pac; |
| 14 | use crate::pac::{EXTI, SYSCFG}; | 14 | use crate::pac::exti::regs::Lines; |
| 15 | use crate::pac::EXTI; | ||
| 15 | use crate::peripherals; | 16 | use crate::peripherals; |
| 16 | 17 | ||
| 17 | const EXTI_COUNT: usize = 16; | 18 | const 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)))] | ||
| 33 | fn exticr_regs() -> pac::syscfg::Syscfg { | ||
| 34 | pac::SYSCFG | ||
| 35 | } | ||
| 36 | #[cfg(any(exti_g0, exti_l5))] | ||
| 37 | fn exticr_regs() -> pac::exti::Exti { | ||
| 38 | EXTI | ||
| 39 | } | ||
| 40 | |||
| 31 | pub unsafe fn on_irq() { | 41 | pub 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 | ||
| 46 | struct BitIter(u32); | 65 | struct 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 | ||
