This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSPM0G3507: GPIO interrupt handler generation by sysconfig

Part Number: MSPM0G3507
Other Parts Discussed in Thread: SYSCONFIG,

Tool/software:

Hey there,

is there any interrupt handler generation by sysconfig or do I have to type the IRQ handler functions by myself?

Just asking because the sysconfig generates so many code snippets but i can't find any interrupt handler.

I could copy things like this from the example projects:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void GROUP1_IRQHandler(void)
{
switch (DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_1)) {
case GPIO_SWITCHES_INT_IIDX:
/* If SW is high, turn the LED off */
if (DL_GPIO_readPins(
GPIO_SWITCHES_PORT, GPIO_SWITCHES_USER_SWITCH_1_PIN)) {
DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
}
/* Otherwise, turn the LED on */
else {
DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
}
break;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

but i would prefer generated code that directly fits my needs.

And just another question:

Is it possible to have two interrupt handler functions for falling and rising edge interrupt?

Or do I have to check pin input level on interrupt event and decide whether it is high or low.

Thanks a lot in advance!

Matze

  • You have to create the handler yourself, though you can usually copy it from an example.

  • Too answer the next question, you only get one handler, but you can choose which or both edges. Here is what the example does:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void GROUP1_IRQHandler(void)
    {
    switch (DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_1)) {
    case GPIO_SWITCHES_INT_IIDX:
    /* If SW is high, turn the LED off */
    if (DL_GPIO_readPins(
    GPIO_SWITCHES_PORT, GPIO_SWITCHES_USER_SWITCH_1_PIN)) {
    DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
    }
    /* Otherwise, turn the LED on */
    else {
    DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
    }
    break;
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • Here is what the example does:

    Yes, I copied this into my sourcecode.

    When I flash and debug now, I always end up in the default handler, when my button is pressed:

    Do I need to add the blue line to my ti_msp_config.h?

    Unfortunately this line get's deleted once I build my project again.

    I also added NVIC_EnableIRQ(GPIO_GRP_0_INT_IRQN);  to my main function.

    And __WFI(); at the end of the main while(1).

    And this is my IRQHandler:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void GROUP0_IRQHandler(void)
    {
    switch (DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_0)) {
    case GPIO_GRP_0_DI_BUTTON_IIDX:
    /* If SW is high, turn the LED off */
    if( DL_GPIO_readPins(GPIO_GRP_0_PORT, GPIO_GRP_0_DI_BUTTON_PIN) ) // HIGH, also IRQ wg. steigender Flanke, also Tasterdruck beendet
    {
    flag_DI_BUTTON_state = UNPRESSED;
    }
    /* Otherwise, turn the LED on */
    else { // LOW, also IRQ wg. fallender Flanke, also Tasterdruck gestartet
    flag_DI_BUTTON_state = PRESSED;
    }
    break;
    default:
    break;
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    My watch expression of the button state always stays "0".

    Or is there anything else that I need to consider?

  • You need to use the sysconfig settings from the example to create a "group1" set of LED's, or put something equivalent in your program and change names accordingly.

  • I guess I should add, does the example run correctly?

  • You need to use the sysconfig settings from the example to create a "group1" set of LED's, or put something equivalent in your program and change names accordingly.

    Yes I did so.. or tried... but it does not work..

    Well.. I have a group 0 for my button and a group 2 for my LED.. but that should not be the problem, right?

    Or why do you write about group 1 and LEDs?

    I guess I should add, does the example run correctly?

    I tried the example on LaunchPad and on my custom PCB and it works.

    But in my sourcecode I always end up in the default handler, once I press my button.

  • "Or why do you write about group 1 and LEDs?"

    Because I was trying to remember the example by my bad memory. 8^)

    Clearly, your IRQ handler is misnamed.

  • Oh, and anytime you end up in the generic stub, you can add this code I got from Brandon Fisher for the MSPM0G3507:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /*
    * These are traps for debugging when you find that your code
    * ends up in the default handler for some unknown reason.
    * To keep the compiler from complaining, comment out the ones
    * below if you already have a working handler for that vector.
    *
    */
    void NMI_Handler(void){ __BKPT(0);}
    void HardFault_Handler(void){ __BKPT(0);}
    void SVC_Handler(void){ __BKPT(0);}
    void PendSV_Handler(void){ __BKPT(0);}
    void SysTick_Handler(void){ __BKPT(0);}
    void GROUP0_IRQHandler(void){ __BKPT(0);}
    void GROUP1_IRQHandler(void){ __BKPT(0);}
    void TIMG8_IRQHandler(void){ __BKPT(0);}
    void UART3_IRQHandler(void){ __BKPT(0);}
    void ADC0_IRQHandler(void){ __BKPT(0);}
    void ADC1_IRQHandler(void){ __BKPT(0);}
    void CANFD0_IRQHandler(void){ __BKPT(0);}
    void DAC0_IRQHandler(void){ __BKPT(0);}
    void SPI0_IRQHandler(void){ __BKPT(0);}
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    And you will know what to call your handler! As well as verify that the interrupt that interrupts is the interrupt that you expect to be interrupting.