aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/src/exti.rs55
-rw-r--r--stm32-metapac/build.rs7
2 files changed, 48 insertions, 14 deletions
diff --git a/embassy-stm32/src/exti.rs b/embassy-stm32/src/exti.rs
index a8875fb5d..0ee93bede 100644
--- a/embassy-stm32/src/exti.rs
+++ b/embassy-stm32/src/exti.rs
@@ -237,22 +237,63 @@ macro_rules! impl_exti_irq {
237} 237}
238 */ 238 */
239 239
240macro_rules! foreach_exti_irq {
241 ($action:ident) => {
242 crate::pac::interrupts!(
243 (EXTI0) => { $action!(EXTI0); };
244 (EXTI1) => { $action!(EXTI1); };
245 (EXTI2) => { $action!(EXTI2); };
246 (EXTI3) => { $action!(EXTI3); };
247 (EXTI4) => { $action!(EXTI4); };
248 (EXTI5) => { $action!(EXTI5); };
249 (EXTI6) => { $action!(EXTI6); };
250 (EXTI7) => { $action!(EXTI7); };
251 (EXTI8) => { $action!(EXTI8); };
252 (EXTI9) => { $action!(EXTI9); };
253 (EXTI10) => { $action!(EXTI10); };
254 (EXTI11) => { $action!(EXTI11); };
255 (EXTI12) => { $action!(EXTI12); };
256 (EXTI13) => { $action!(EXTI13); };
257 (EXTI14) => { $action!(EXTI14); };
258 (EXTI15) => { $action!(EXTI15); };
259
260 // plus the weird ones
261 (EXTI0_1) => { $action!( EXTI0_1 ); };
262 (EXTI15_10) => { $action!(EXTI15_10); };
263 (EXTI15_4) => { $action!(EXTI15_4); };
264 (EXTI1_0) => { $action!(EXTI1_0); };
265 (EXTI2_3) => { $action!(EXTI2_3); };
266 (EXTI2_TSC) => { $action!(EXTI2_TSC); };
267 (EXTI3_2) => { $action!(EXTI3_2); };
268 (EXTI4_15) => { $action!(EXTI4_15); };
269 (EXTI9_5) => { $action!(EXTI9_5); };
270 );
271 };
272}
273
274macro_rules! enable_irq {
275 ($e:ident) => {
276 crate::interrupt::$e::steal().enable();
277 };
278}
279
240/// safety: must be called only once 280/// safety: must be called only once
241pub(crate) unsafe fn init_exti() { 281pub(crate) unsafe fn init_exti() {
242 use embassy::interrupt::Interrupt; 282 use embassy::interrupt::Interrupt;
243 use embassy::interrupt::InterruptExt; 283 use embassy::interrupt::InterruptExt;
244 284
245 crate::pac::exti_interrupts!( 285 foreach_exti_irq!(enable_irq);
246 ($e:ident) => {
247 crate::interrupt::$e::steal().enable();
248 };
249 );
250} 286}
251 287
252crate::pac::exti_interrupts!( 288use crate::interrupt;
289
290macro_rules! impl_irq {
253 ($e:ident) => { 291 ($e:ident) => {
292 #[interrupt]
254 unsafe fn $e() { 293 unsafe fn $e() {
255 on_irq() 294 on_irq()
256 } 295 }
257 }; 296 };
258); 297}
298
299foreach_exti_irq!(impl_irq);
diff --git a/stm32-metapac/build.rs b/stm32-metapac/build.rs
index b19906ea8..ef95f3313 100644
--- a/stm32-metapac/build.rs
+++ b/stm32-metapac/build.rs
@@ -255,15 +255,8 @@ fn main() {
255 .map(|(kind, version)| vec![kind.clone(), version.clone()]) 255 .map(|(kind, version)| vec![kind.clone(), version.clone()])
256 .collect(); 256 .collect();
257 257
258 let exti_interrupt_table = &interrupt_table
259 .iter()
260 .filter(|row| row[0].contains("EXTI"))
261 .map(|row| row.clone())
262 .collect();
263
264 make_table(&mut extra, "pins", &pin_table); 258 make_table(&mut extra, "pins", &pin_table);
265 make_table(&mut extra, "interrupts", &interrupt_table); 259 make_table(&mut extra, "interrupts", &interrupt_table);
266 make_table(&mut extra, "exti_interrupts", &exti_interrupt_table);
267 make_table(&mut extra, "peripherals", &peripherals_table); 260 make_table(&mut extra, "peripherals", &peripherals_table);
268 make_table(&mut extra, "peripheral_versions", &peripheral_version_table); 261 make_table(&mut extra, "peripheral_versions", &peripheral_version_table);
269 make_table(&mut extra, "peripheral_pins", &peripheral_pins_table); 262 make_table(&mut extra, "peripheral_pins", &peripheral_pins_table);