From f1b94b969cf863d1dbb0b270798a4bc592b933c1 Mon Sep 17 00:00:00 2001 From: MDin Date: Mon, 26 May 2025 18:18:51 +0530 Subject: [PATCH 1/2] cores/xmc/: Interrupt code changes for invalid pin/mode. Signed-off-by: MDin --- cores/xmc/WInterrupts.c | 236 ++++++++++++++++++++++------------------ 1 file changed, 129 insertions(+), 107 deletions(-) diff --git a/cores/xmc/WInterrupts.c b/cores/xmc/WInterrupts.c index e021c9b1..ea5d8c15 100644 --- a/cores/xmc/WInterrupts.c +++ b/cores/xmc/WInterrupts.c @@ -8,8 +8,8 @@ extern "C" { //**************************************************************************** // @Prototypes Of Local Functions //**************************************************************************** -static voidFuncPtr interrupt_0_cb = NULL; -static voidFuncPtr interrupt_1_cb = NULL; +static voidFuncPtr interrupt_0_cb = NULL; +static voidFuncPtr interrupt_1_cb = NULL; //**************************************************************************** // @Local Functions @@ -49,148 +49,170 @@ void CCU40_1_IRQHandler(void) { } #endif -void attachInterrupt(pin_size_t interrupt_num, voidFuncPtr callback, PinStatus mode) { - XMC_PIN_INTERRUPT_t pin_irq = mapping_interrupt[interrupt_num]; -#if defined(INTERRUPT_USE_ERU) - XMC_ERU_ETL_EDGE_DETECTION_t event_config = 0; - - switch (mode) { - case CHANGE: - event_config = XMC_ERU_ETL_EDGE_DETECTION_BOTH; - break; - - case RISING: - event_config = XMC_ERU_ETL_EDGE_DETECTION_RISING; +void attachInterrupt(pin_size_t interrupt_num, voidFuncPtr callback, PinStatus mode) { + if (interrupt_num >= NUM_INTERRUPT) { + return; + } + if (mode != CHANGE && mode != RISING && mode != FALLING) { + switch (interrupt_num) { + case 0: + NVIC_DisableIRQ(CCU40_0_IRQn); + interrupt_0_cb = NULL; break; - case FALLING: - event_config = XMC_ERU_ETL_EDGE_DETECTION_FALLING; + case 1: + NVIC_DisableIRQ(CCU40_1_IRQn); + interrupt_1_cb = NULL; break; - default: - event_config = XMC_CCU4_SLICE_EVENT_EDGE_SENSITIVITY_NONE; break; } + return; + } + XMC_PIN_INTERRUPT_t pin_irq = mapping_interrupt[interrupt_num]; +#if defined(INTERRUPT_USE_ERU) + XMC_ERU_ETL_EDGE_DETECTION_t event_config = 0; - XMC_ERU_Enable(pin_irq.eru); - XMC_ERU_ETL_SetInput(pin_irq.eru, pin_irq.etl, pin_irq.input_a, pin_irq.input_b); - XMC_ERU_ETL_SetEdgeDetection(pin_irq.eru, pin_irq.etl, event_config); - XMC_ERU_ETL_SetSource(pin_irq.eru, pin_irq.etl, XMC_ERU_ETL_SOURCE_B); - XMC_ERU_ETL_EnableOutputTrigger(pin_irq.eru, pin_irq.etl, pin_irq.ogu); - XMC_ERU_OGU_SetServiceRequestMode(pin_irq.eru, pin_irq.ogu, - XMC_ERU_OGU_SERVICE_REQUEST_ON_TRIGGER); - - if (pin_irq.irq_num == 0) { - NVIC_SetPriority(ERU0_3_IRQn, 3); - interrupt_0_cb = callback; - NVIC_EnableIRQ(ERU0_3_IRQn); - } else if (pin_irq.irq_num == 1) { + switch (mode) { + case CHANGE: + event_config = XMC_ERU_ETL_EDGE_DETECTION_BOTH; + break; + + case RISING: + event_config = XMC_ERU_ETL_EDGE_DETECTION_RISING; + break; + + case FALLING: + event_config = XMC_ERU_ETL_EDGE_DETECTION_FALLING; + break; + + default: + event_config = XMC_CCU4_SLICE_EVENT_EDGE_SENSITIVITY_NONE; + break; + } + + XMC_ERU_Enable(pin_irq.eru); + XMC_ERU_ETL_SetInput(pin_irq.eru, pin_irq.etl, pin_irq.input_a, pin_irq.input_b); + XMC_ERU_ETL_SetEdgeDetection(pin_irq.eru, pin_irq.etl, event_config); + XMC_ERU_ETL_SetSource(pin_irq.eru, pin_irq.etl, XMC_ERU_ETL_SOURCE_B); + XMC_ERU_ETL_EnableOutputTrigger(pin_irq.eru, pin_irq.etl, pin_irq.ogu); + XMC_ERU_OGU_SetServiceRequestMode(pin_irq.eru, pin_irq.ogu, + XMC_ERU_OGU_SERVICE_REQUEST_ON_TRIGGER); + + if (pin_irq.irq_num == 0) { + NVIC_SetPriority(ERU0_3_IRQn, 3); + interrupt_0_cb = callback; + NVIC_EnableIRQ(ERU0_3_IRQn); + } else if (pin_irq.irq_num == 1) { #if defined(XMC4200_Platform2GO) - NVIC_SetPriority(ERU0_0_IRQn, 3); - interrupt_1_cb = callback; - NVIC_EnableIRQ(ERU0_0_IRQn); + NVIC_SetPriority(ERU0_0_IRQn, 3); + interrupt_1_cb = callback; + NVIC_EnableIRQ(ERU0_0_IRQn); #else - NVIC_SetPriority(ERU1_0_IRQn, 3); - interrupt_1_cb = callback; - NVIC_EnableIRQ(ERU1_0_IRQn); + NVIC_SetPriority(ERU1_0_IRQn, 3); + interrupt_1_cb = callback; + NVIC_EnableIRQ(ERU1_0_IRQn); #endif - } + } #else - XMC_CCU4_SLICE_EVENT_CONFIG_t event_config = {0}; + XMC_CCU4_SLICE_EVENT_CONFIG_t event_config = {0}; - switch (mode) { - case CHANGE: - event_config.edge = XMC_CCU4_SLICE_EVENT_EDGE_SENSITIVITY_DUAL_EDGE; - break; + switch (mode) { + case CHANGE: + event_config.edge = XMC_CCU4_SLICE_EVENT_EDGE_SENSITIVITY_DUAL_EDGE; + break; - case RISING: - event_config.edge = XMC_CCU4_SLICE_EVENT_EDGE_SENSITIVITY_RISING_EDGE; - break; + case RISING: + event_config.edge = XMC_CCU4_SLICE_EVENT_EDGE_SENSITIVITY_RISING_EDGE; + break; - case FALLING: - event_config.edge = XMC_CCU4_SLICE_EVENT_EDGE_SENSITIVITY_FALLING_EDGE; - break; + case FALLING: + event_config.edge = XMC_CCU4_SLICE_EVENT_EDGE_SENSITIVITY_FALLING_EDGE; + break; - default: - event_config.edge = XMC_CCU4_SLICE_EVENT_EDGE_SENSITIVITY_NONE; - break; - } + default: + event_config.edge = XMC_CCU4_SLICE_EVENT_EDGE_SENSITIVITY_NONE; + break; + } - XMC_CCU4_Init(pin_irq.ccu, XMC_CCU4_SLICE_MCMS_ACTION_TRANSFER_PR_CR); - XMC_CCU4_EnableClock(pin_irq.ccu, pin_irq.slice_num); + XMC_CCU4_Init(pin_irq.ccu, XMC_CCU4_SLICE_MCMS_ACTION_TRANSFER_PR_CR); + XMC_CCU4_EnableClock(pin_irq.ccu, pin_irq.slice_num); - if (pin_irq.irq_num == 0) { + if (pin_irq.irq_num == 0) { #if defined(XMC1100_Boot_Kit) || defined(XMC1400_Arduino_Kit) || defined(XMC1400_XMC2GO) - /* P1_4 external interrupt goes through USIC to CCU4 */ - XMC_USIC_CH_Enable(XMC_USIC0_CH0); - XMC_USIC_CH_SetInputSource(XMC_USIC0_CH0, XMC_USIC_CH_INPUT_DX5, USIC0_C0_DX5_P1_4); - XMC_USIC_CH_SetInputSource(XMC_USIC0_CH0, XMC_USIC_CH_INPUT_DX2, USIC0_C0_DX2_DX5INS); + /* P1_4 external interrupt goes through USIC to CCU4 */ + XMC_USIC_CH_Enable(XMC_USIC0_CH0); + XMC_USIC_CH_SetInputSource(XMC_USIC0_CH0, XMC_USIC_CH_INPUT_DX5, USIC0_C0_DX5_P1_4); + XMC_USIC_CH_SetInputSource(XMC_USIC0_CH0, XMC_USIC_CH_INPUT_DX2, USIC0_C0_DX2_DX5INS); #endif - XMC_CCU4_SLICE_EnableMultipleEvents(pin_irq.slice, XMC_CCU4_SLICE_MULTI_IRQ_ID_EVENT0); - XMC_CCU4_SLICE_SetInterruptNode(pin_irq.slice, XMC_CCU4_SLICE_IRQ_ID_EVENT0, 0); - NVIC_SetPriority(CCU40_0_IRQn, 3); + XMC_CCU4_SLICE_EnableMultipleEvents(pin_irq.slice, XMC_CCU4_SLICE_MULTI_IRQ_ID_EVENT0); + XMC_CCU4_SLICE_SetInterruptNode(pin_irq.slice, XMC_CCU4_SLICE_IRQ_ID_EVENT0, 0); + NVIC_SetPriority(CCU40_0_IRQn, 3); - event_config.mapped_input = pin_irq.input; - XMC_CCU4_SLICE_ConfigureEvent(pin_irq.slice, XMC_CCU4_SLICE_EVENT_0, &event_config); + event_config.mapped_input = pin_irq.input; + XMC_CCU4_SLICE_ConfigureEvent(pin_irq.slice, XMC_CCU4_SLICE_EVENT_0, &event_config); - interrupt_0_cb = callback; - NVIC_EnableIRQ(CCU40_0_IRQn); - } else if (pin_irq.irq_num == 1) { + interrupt_0_cb = callback; + NVIC_EnableIRQ(CCU40_0_IRQn); + } else if (pin_irq.irq_num == 1) { #if defined(XMC1300_Boot_Kit) - /* P0_13 external interrupt goes through USIC to CCU4 */ - XMC_USIC_CH_Enable(XMC_USIC0_CH0); - XMC_USIC_CH_SetInputSource(XMC_USIC0_CH0, XMC_USIC_CH_INPUT_DX2, USIC0_C0_DX2_P0_13); + /* P0_13 external interrupt goes through USIC to CCU4 */ + XMC_USIC_CH_Enable(XMC_USIC0_CH0); + XMC_USIC_CH_SetInputSource(XMC_USIC0_CH0, XMC_USIC_CH_INPUT_DX2, USIC0_C0_DX2_P0_13); #endif #if defined(XMC1400_Arduino_Kit) - /* P1_1 external interrupt goes through USIC to CCU4 */ - XMC_USIC_CH_Enable(XMC_USIC0_CH1); - XMC_USIC_CH_SetInputSource(XMC_USIC0_CH1, XMC_USIC_CH_INPUT_DX2, USIC0_C1_DX2_P1_1); + /* P1_1 external interrupt goes through USIC to CCU4 */ + XMC_USIC_CH_Enable(XMC_USIC0_CH1); + XMC_USIC_CH_SetInputSource(XMC_USIC0_CH1, XMC_USIC_CH_INPUT_DX2, USIC0_C1_DX2_P1_1); #endif - XMC_CCU4_SLICE_EnableMultipleEvents(pin_irq.slice, XMC_CCU4_SLICE_MULTI_IRQ_ID_EVENT1); - XMC_CCU4_SLICE_SetInterruptNode(pin_irq.slice, XMC_CCU4_SLICE_IRQ_ID_EVENT1, 1); - NVIC_SetPriority(CCU40_1_IRQn, 3); + XMC_CCU4_SLICE_EnableMultipleEvents(pin_irq.slice, XMC_CCU4_SLICE_MULTI_IRQ_ID_EVENT1); + XMC_CCU4_SLICE_SetInterruptNode(pin_irq.slice, XMC_CCU4_SLICE_IRQ_ID_EVENT1, 1); + NVIC_SetPriority(CCU40_1_IRQn, 3); - event_config.mapped_input = pin_irq.input; - XMC_CCU4_SLICE_ConfigureEvent(pin_irq.slice, XMC_CCU4_SLICE_EVENT_1, &event_config); + event_config.mapped_input = pin_irq.input; + XMC_CCU4_SLICE_ConfigureEvent(pin_irq.slice, XMC_CCU4_SLICE_EVENT_1, &event_config); - interrupt_1_cb = callback; - NVIC_EnableIRQ(CCU40_1_IRQn); - } + interrupt_1_cb = callback; + NVIC_EnableIRQ(CCU40_1_IRQn); + } #endif } -void detachInterrupt(pin_size_t interrupt_num) { +void detachInterrupt(pin_size_t interrupt_num) { + + if (interrupt_num >= NUM_INTERRUPT) { + return; + } #if defined(INTERRUPT_USE_ERU) - XMC_PIN_INTERRUPT_t pin_irq = mapping_interrupt[interrupt_num]; - switch (pin_irq.irq_num) { - case 0: - NVIC_DisableIRQ(ERU0_3_IRQn); - break; + XMC_PIN_INTERRUPT_t pin_irq = mapping_interrupt[interrupt_num]; + switch (pin_irq.irq_num) { + case 0: + NVIC_DisableIRQ(ERU0_3_IRQn); + break; - case 1: + case 1: #if defined(XMC4200_Platform2GO) - NVIC_DisableIRQ(ERU0_0_IRQn); + NVIC_DisableIRQ(ERU0_0_IRQn); #else - NVIC_DisableIRQ(ERU1_0_IRQn); + NVIC_DisableIRQ(ERU1_0_IRQn); #endif - break; - default: - break; - } + break; + default: + break; + } #else - switch (interrupt_num) { - case 0: - NVIC_DisableIRQ(CCU40_0_IRQn); - break; - - case 1: - NVIC_DisableIRQ(CCU40_1_IRQn); - break; - default: - break; - } + switch (interrupt_num) { + case 0: + NVIC_DisableIRQ(CCU40_0_IRQn); + break; + + case 1: + NVIC_DisableIRQ(CCU40_1_IRQn); + break; + default: + break; + } #endif - } #ifdef __cplusplus } From 783945b91162542e7268b8bb274d06e5aa10c79e Mon Sep 17 00:00:00 2001 From: MDin Date: Mon, 26 May 2025 18:21:56 +0530 Subject: [PATCH 2/2] tests: Modifed the variable name. Signed-off-by: MDin --- tests/test_config.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_config.h b/tests/test_config.h index 8da513e5..070acc4f 100644 --- a/tests/test_config.h +++ b/tests/test_config.h @@ -13,7 +13,7 @@ #include // Test Pin Definitions -#define TEST_DIGITALIO_OUTPUT 2 // IO_4 -#define TEST_DIGITALIO_INPUT 3 // IO_3 -#define TEST_PIN_SYNC_IO 4 // IO_1 -#endif // TEST_CONFIG_H \ No newline at end of file +#define TEST_PIN_DIGITAL_IO_OUTPUT 2 // IO_4 +#define TEST_PIN_DIGITAL_IO_INPUT 3 // IO_3 +#define TEST_PIN_SYNC_IO 4 // IO_1 +#endif // TEST_CONFIG_H \ No newline at end of file