Skip to content

Core api update interrupt changes #347

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
236 changes: 129 additions & 107 deletions cores/xmc/WInterrupts.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
}
Expand Down
8 changes: 4 additions & 4 deletions tests/test_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
#include <stdint.h>

// 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
#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
Loading