diff options
author | Damien George <damien@micropython.org> | 2024-09-02 13:06:30 +1000 |
---|---|---|
committer | Damien George <damien@micropython.org> | 2024-12-18 00:22:21 +1100 |
commit | 23bfa95d34e9b6f836ee67a1564e04f7b86eaa36 (patch) | |
tree | 514be47f8e3b2e4b5c79a43a283bf2eec2913262 | |
parent | a2efafcce3a03e2fd972e2521cae2c2bec2e88ff (diff) | |
download | micropython-23bfa95d34e9b6f836ee67a1564e04f7b86eaa36.tar.gz micropython-23bfa95d34e9b6f836ee67a1564e04f7b86eaa36.zip |
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 <damien@micropython.org>
-rw-r--r-- | ports/stm32/extint.c | 91 | ||||
-rw-r--r-- | ports/stm32/stm32_it.c | 78 |
2 files changed, 91 insertions, 78 deletions
diff --git a/ports/stm32/extint.c b/ports/stm32/extint.c index 2a08810125..5b5658809b 100644 --- a/ports/stm32/extint.c +++ b/ports/stm32/extint.c @@ -241,6 +241,97 @@ static const uint8_t nvic_irq_channel[EXTI_NUM_VECTORS] = { #endif }; +#define DEFINE_EXTI_IRQ_HANDLER(line) \ + void EXTI##line##_IRQHandler(void) { \ + MP_STATIC_ASSERT(EXTI##line##_IRQn > 0); \ + IRQ_ENTER(EXTI##line##_IRQn); \ + Handle_EXTI_Irq(line); \ + IRQ_EXIT(EXTI##line##_IRQn); \ + } + +#if defined(STM32F0) || defined(STM32L0) || defined(STM32G0) + +void EXTI0_1_IRQHandler(void) { + MP_STATIC_ASSERT(EXTI0_1_IRQn > 0); + IRQ_ENTER(EXTI0_1_IRQn); + Handle_EXTI_Irq(0); + Handle_EXTI_Irq(1); + IRQ_EXIT(EXTI0_1_IRQn); +} + +void EXTI2_3_IRQHandler(void) { + MP_STATIC_ASSERT(EXTI2_3_IRQn > 0); + IRQ_ENTER(EXTI2_3_IRQn); + Handle_EXTI_Irq(2); + Handle_EXTI_Irq(3); + IRQ_EXIT(EXTI2_3_IRQn); +} + +void EXTI4_15_IRQHandler(void) { + MP_STATIC_ASSERT(EXTI4_15_IRQn > 0); + IRQ_ENTER(EXTI4_15_IRQn); + for (int i = 4; i <= 15; ++i) { + Handle_EXTI_Irq(i); + } + IRQ_EXIT(EXTI4_15_IRQn); +} + +#elif defined(STM32F4) || defined(STM32F7) || defined(STM32G4) || defined(STM32H7) || defined(STM32L1) || defined(STM32L4) || defined(STM32WB) || defined(STM32WL) + +DEFINE_EXTI_IRQ_HANDLER(0) +DEFINE_EXTI_IRQ_HANDLER(1) +DEFINE_EXTI_IRQ_HANDLER(2) +DEFINE_EXTI_IRQ_HANDLER(3) +DEFINE_EXTI_IRQ_HANDLER(4) + +void EXTI9_5_IRQHandler(void) { + MP_STATIC_ASSERT(EXTI9_5_IRQn > 0); + IRQ_ENTER(EXTI9_5_IRQn); + Handle_EXTI_Irq(5); + Handle_EXTI_Irq(6); + Handle_EXTI_Irq(7); + Handle_EXTI_Irq(8); + Handle_EXTI_Irq(9); + IRQ_EXIT(EXTI9_5_IRQn); +} + +void EXTI15_10_IRQHandler(void) { + MP_STATIC_ASSERT(EXTI15_10_IRQn > 0); + IRQ_ENTER(EXTI15_10_IRQn); + Handle_EXTI_Irq(10); + Handle_EXTI_Irq(11); + Handle_EXTI_Irq(12); + Handle_EXTI_Irq(13); + Handle_EXTI_Irq(14); + Handle_EXTI_Irq(15); + IRQ_EXIT(EXTI15_10_IRQn); +} + +#elif defined(STM32H5) + +DEFINE_EXTI_IRQ_HANDLER(0) +DEFINE_EXTI_IRQ_HANDLER(1) +DEFINE_EXTI_IRQ_HANDLER(2) +DEFINE_EXTI_IRQ_HANDLER(3) +DEFINE_EXTI_IRQ_HANDLER(4) +DEFINE_EXTI_IRQ_HANDLER(5) +DEFINE_EXTI_IRQ_HANDLER(6) +DEFINE_EXTI_IRQ_HANDLER(7) +DEFINE_EXTI_IRQ_HANDLER(8) +DEFINE_EXTI_IRQ_HANDLER(9) +DEFINE_EXTI_IRQ_HANDLER(10) +DEFINE_EXTI_IRQ_HANDLER(11) +DEFINE_EXTI_IRQ_HANDLER(12) +DEFINE_EXTI_IRQ_HANDLER(13) +DEFINE_EXTI_IRQ_HANDLER(14) +DEFINE_EXTI_IRQ_HANDLER(15) + +#else + +#error Unsupported processor + +#endif + // Set override_callback_obj to true if you want to unconditionally set the // callback function. uint extint_register(mp_obj_t pin_obj, uint32_t mode, uint32_t pull, mp_obj_t callback_obj, bool override_callback_obj) { diff --git a/ports/stm32/stm32_it.c b/ports/stm32/stm32_it.c index e05dbe91bc..2e625a5894 100644 --- a/ports/stm32/stm32_it.c +++ b/ports/stm32/stm32_it.c @@ -452,62 +452,6 @@ void OTG_HS_WKUP_IRQHandler(void) { { }*/ -/** - * @brief These functions handle the EXTI interrupt requests. - * @param None - * @retval None - */ -void EXTI0_IRQHandler(void) { - IRQ_ENTER(EXTI0_IRQn); - Handle_EXTI_Irq(0); - IRQ_EXIT(EXTI0_IRQn); -} - -void EXTI1_IRQHandler(void) { - IRQ_ENTER(EXTI1_IRQn); - Handle_EXTI_Irq(1); - IRQ_EXIT(EXTI1_IRQn); -} - -void EXTI2_IRQHandler(void) { - IRQ_ENTER(EXTI2_IRQn); - Handle_EXTI_Irq(2); - IRQ_EXIT(EXTI2_IRQn); -} - -void EXTI3_IRQHandler(void) { - IRQ_ENTER(EXTI3_IRQn); - Handle_EXTI_Irq(3); - IRQ_EXIT(EXTI3_IRQn); -} - -void EXTI4_IRQHandler(void) { - IRQ_ENTER(EXTI4_IRQn); - Handle_EXTI_Irq(4); - IRQ_EXIT(EXTI4_IRQn); -} - -void EXTI9_5_IRQHandler(void) { - IRQ_ENTER(EXTI9_5_IRQn); - Handle_EXTI_Irq(5); - Handle_EXTI_Irq(6); - Handle_EXTI_Irq(7); - Handle_EXTI_Irq(8); - Handle_EXTI_Irq(9); - IRQ_EXIT(EXTI9_5_IRQn); -} - -void EXTI15_10_IRQHandler(void) { - IRQ_ENTER(EXTI15_10_IRQn); - Handle_EXTI_Irq(10); - Handle_EXTI_Irq(11); - Handle_EXTI_Irq(12); - Handle_EXTI_Irq(13); - Handle_EXTI_Irq(14); - Handle_EXTI_Irq(15); - IRQ_EXIT(EXTI15_10_IRQn); -} - void PVD_IRQHandler(void) { IRQ_ENTER(PVD_IRQn); Handle_EXTI_Irq(EXTI_PVD_OUTPUT); @@ -605,28 +549,6 @@ void RTC_IRQHandler(void) { } #endif -void EXTI0_1_IRQHandler(void) { - IRQ_ENTER(EXTI0_1_IRQn); - Handle_EXTI_Irq(0); - Handle_EXTI_Irq(1); - IRQ_EXIT(EXTI0_1_IRQn); -} - -void EXTI2_3_IRQHandler(void) { - IRQ_ENTER(EXTI2_3_IRQn); - Handle_EXTI_Irq(2); - Handle_EXTI_Irq(3); - IRQ_EXIT(EXTI2_3_IRQn); -} - -void EXTI4_15_IRQHandler(void) { - IRQ_ENTER(EXTI4_15_IRQn); - for (int i = 4; i <= 15; ++i) { - Handle_EXTI_Irq(i); - } - IRQ_EXIT(EXTI4_15_IRQn); -} - void TIM1_BRK_UP_TRG_COM_IRQHandler(void) { IRQ_ENTER(TIM1_BRK_UP_TRG_COM_IRQn); timer_irq_handler(1); |