Skip to content

Commit 23bfa95

Browse files
committed
stm32/extint: Fix EXTI IRQ handlers for H5 MCUs.
The existing EXTI IRQ handlers are moved from `stm32_it.c` to `extint.c` to keep them with related code. A macro is defined to make it easier to define the handler function that handles one line, and correct handlers added for STM32H5xx MCUs. Also, to prevent errors in the future, `MP_STATIC_ASSERT(<irqn> > 0)` is added to each handler function to check that the correct `IRQn` constant is used, which corresponds to the handler function name. Signed-off-by: Damien George <[email protected]>
1 parent a2efafc commit 23bfa95

File tree

2 files changed

+91
-78
lines changed

2 files changed

+91
-78
lines changed

ports/stm32/extint.c

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,97 @@ static const uint8_t nvic_irq_channel[EXTI_NUM_VECTORS] = {
241241
#endif
242242
};
243243

244+
#define DEFINE_EXTI_IRQ_HANDLER(line) \
245+
void EXTI##line##_IRQHandler(void) { \
246+
MP_STATIC_ASSERT(EXTI##line##_IRQn > 0); \
247+
IRQ_ENTER(EXTI##line##_IRQn); \
248+
Handle_EXTI_Irq(line); \
249+
IRQ_EXIT(EXTI##line##_IRQn); \
250+
}
251+
252+
#if defined(STM32F0) || defined(STM32L0) || defined(STM32G0)
253+
254+
void EXTI0_1_IRQHandler(void) {
255+
MP_STATIC_ASSERT(EXTI0_1_IRQn > 0);
256+
IRQ_ENTER(EXTI0_1_IRQn);
257+
Handle_EXTI_Irq(0);
258+
Handle_EXTI_Irq(1);
259+
IRQ_EXIT(EXTI0_1_IRQn);
260+
}
261+
262+
void EXTI2_3_IRQHandler(void) {
263+
MP_STATIC_ASSERT(EXTI2_3_IRQn > 0);
264+
IRQ_ENTER(EXTI2_3_IRQn);
265+
Handle_EXTI_Irq(2);
266+
Handle_EXTI_Irq(3);
267+
IRQ_EXIT(EXTI2_3_IRQn);
268+
}
269+
270+
void EXTI4_15_IRQHandler(void) {
271+
MP_STATIC_ASSERT(EXTI4_15_IRQn > 0);
272+
IRQ_ENTER(EXTI4_15_IRQn);
273+
for (int i = 4; i <= 15; ++i) {
274+
Handle_EXTI_Irq(i);
275+
}
276+
IRQ_EXIT(EXTI4_15_IRQn);
277+
}
278+
279+
#elif defined(STM32F4) || defined(STM32F7) || defined(STM32G4) || defined(STM32H7) || defined(STM32L1) || defined(STM32L4) || defined(STM32WB) || defined(STM32WL)
280+
281+
DEFINE_EXTI_IRQ_HANDLER(0)
282+
DEFINE_EXTI_IRQ_HANDLER(1)
283+
DEFINE_EXTI_IRQ_HANDLER(2)
284+
DEFINE_EXTI_IRQ_HANDLER(3)
285+
DEFINE_EXTI_IRQ_HANDLER(4)
286+
287+
void EXTI9_5_IRQHandler(void) {
288+
MP_STATIC_ASSERT(EXTI9_5_IRQn > 0);
289+
IRQ_ENTER(EXTI9_5_IRQn);
290+
Handle_EXTI_Irq(5);
291+
Handle_EXTI_Irq(6);
292+
Handle_EXTI_Irq(7);
293+
Handle_EXTI_Irq(8);
294+
Handle_EXTI_Irq(9);
295+
IRQ_EXIT(EXTI9_5_IRQn);
296+
}
297+
298+
void EXTI15_10_IRQHandler(void) {
299+
MP_STATIC_ASSERT(EXTI15_10_IRQn > 0);
300+
IRQ_ENTER(EXTI15_10_IRQn);
301+
Handle_EXTI_Irq(10);
302+
Handle_EXTI_Irq(11);
303+
Handle_EXTI_Irq(12);
304+
Handle_EXTI_Irq(13);
305+
Handle_EXTI_Irq(14);
306+
Handle_EXTI_Irq(15);
307+
IRQ_EXIT(EXTI15_10_IRQn);
308+
}
309+
310+
#elif defined(STM32H5)
311+
312+
DEFINE_EXTI_IRQ_HANDLER(0)
313+
DEFINE_EXTI_IRQ_HANDLER(1)
314+
DEFINE_EXTI_IRQ_HANDLER(2)
315+
DEFINE_EXTI_IRQ_HANDLER(3)
316+
DEFINE_EXTI_IRQ_HANDLER(4)
317+
DEFINE_EXTI_IRQ_HANDLER(5)
318+
DEFINE_EXTI_IRQ_HANDLER(6)
319+
DEFINE_EXTI_IRQ_HANDLER(7)
320+
DEFINE_EXTI_IRQ_HANDLER(8)
321+
DEFINE_EXTI_IRQ_HANDLER(9)
322+
DEFINE_EXTI_IRQ_HANDLER(10)
323+
DEFINE_EXTI_IRQ_HANDLER(11)
324+
DEFINE_EXTI_IRQ_HANDLER(12)
325+
DEFINE_EXTI_IRQ_HANDLER(13)
326+
DEFINE_EXTI_IRQ_HANDLER(14)
327+
DEFINE_EXTI_IRQ_HANDLER(15)
328+
329+
#else
330+
331+
#error Unsupported processor
332+
333+
#endif
334+
244335
// Set override_callback_obj to true if you want to unconditionally set the
245336
// callback function.
246337
uint extint_register(mp_obj_t pin_obj, uint32_t mode, uint32_t pull, mp_obj_t callback_obj, bool override_callback_obj) {

ports/stm32/stm32_it.c

Lines changed: 0 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -452,62 +452,6 @@ void OTG_HS_WKUP_IRQHandler(void) {
452452
{
453453
}*/
454454

455-
/**
456-
* @brief These functions handle the EXTI interrupt requests.
457-
* @param None
458-
* @retval None
459-
*/
460-
void EXTI0_IRQHandler(void) {
461-
IRQ_ENTER(EXTI0_IRQn);
462-
Handle_EXTI_Irq(0);
463-
IRQ_EXIT(EXTI0_IRQn);
464-
}
465-
466-
void EXTI1_IRQHandler(void) {
467-
IRQ_ENTER(EXTI1_IRQn);
468-
Handle_EXTI_Irq(1);
469-
IRQ_EXIT(EXTI1_IRQn);
470-
}
471-
472-
void EXTI2_IRQHandler(void) {
473-
IRQ_ENTER(EXTI2_IRQn);
474-
Handle_EXTI_Irq(2);
475-
IRQ_EXIT(EXTI2_IRQn);
476-
}
477-
478-
void EXTI3_IRQHandler(void) {
479-
IRQ_ENTER(EXTI3_IRQn);
480-
Handle_EXTI_Irq(3);
481-
IRQ_EXIT(EXTI3_IRQn);
482-
}
483-
484-
void EXTI4_IRQHandler(void) {
485-
IRQ_ENTER(EXTI4_IRQn);
486-
Handle_EXTI_Irq(4);
487-
IRQ_EXIT(EXTI4_IRQn);
488-
}
489-
490-
void EXTI9_5_IRQHandler(void) {
491-
IRQ_ENTER(EXTI9_5_IRQn);
492-
Handle_EXTI_Irq(5);
493-
Handle_EXTI_Irq(6);
494-
Handle_EXTI_Irq(7);
495-
Handle_EXTI_Irq(8);
496-
Handle_EXTI_Irq(9);
497-
IRQ_EXIT(EXTI9_5_IRQn);
498-
}
499-
500-
void EXTI15_10_IRQHandler(void) {
501-
IRQ_ENTER(EXTI15_10_IRQn);
502-
Handle_EXTI_Irq(10);
503-
Handle_EXTI_Irq(11);
504-
Handle_EXTI_Irq(12);
505-
Handle_EXTI_Irq(13);
506-
Handle_EXTI_Irq(14);
507-
Handle_EXTI_Irq(15);
508-
IRQ_EXIT(EXTI15_10_IRQn);
509-
}
510-
511455
void PVD_IRQHandler(void) {
512456
IRQ_ENTER(PVD_IRQn);
513457
Handle_EXTI_Irq(EXTI_PVD_OUTPUT);
@@ -605,28 +549,6 @@ void RTC_IRQHandler(void) {
605549
}
606550
#endif
607551

608-
void EXTI0_1_IRQHandler(void) {
609-
IRQ_ENTER(EXTI0_1_IRQn);
610-
Handle_EXTI_Irq(0);
611-
Handle_EXTI_Irq(1);
612-
IRQ_EXIT(EXTI0_1_IRQn);
613-
}
614-
615-
void EXTI2_3_IRQHandler(void) {
616-
IRQ_ENTER(EXTI2_3_IRQn);
617-
Handle_EXTI_Irq(2);
618-
Handle_EXTI_Irq(3);
619-
IRQ_EXIT(EXTI2_3_IRQn);
620-
}
621-
622-
void EXTI4_15_IRQHandler(void) {
623-
IRQ_ENTER(EXTI4_15_IRQn);
624-
for (int i = 4; i <= 15; ++i) {
625-
Handle_EXTI_Irq(i);
626-
}
627-
IRQ_EXIT(EXTI4_15_IRQn);
628-
}
629-
630552
void TIM1_BRK_UP_TRG_COM_IRQHandler(void) {
631553
IRQ_ENTER(TIM1_BRK_UP_TRG_COM_IRQn);
632554
timer_irq_handler(1);

0 commit comments

Comments
 (0)