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.

EK-TM4C1294XL: No interrupt from GPIO?

Part Number: EK-TM4C1294XL

I have two incomming handshakes on Port Q pin 2 and 3.

These are currently still connected to pins on Port A by a couple of 0 ohm resistors. Before I remove them, I figured, I could use them to check my intterupt handler.

Unfortunately I get none of the interrupts through!

This is, what I have in my Setup():

void Setup(void)
{
    uint32_t ui32User0, ui32User1;
    uint8_t pui8MACArray[8];
    struct ip_addr addr;

//    SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120000000);
    g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
                                             SYSCTL_OSC_MAIN |
                                             SYSCTL_USE_PLL |
                                             SYSCTL_CFG_VCO_480), 120000000);

    MAP_SysCtlMOSCConfigSet(SYSCTL_MOSC_HIGHFREQ);

    RecRunning=false;

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ);

    //Enable using ports
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ);

    //Output ports
    GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, 0xFF); //All Port A as output
    GPIOPinTypeGPIOOutput(GPIO_PORTK_BASE, 0xFF); //All Port K as output
    GPIOPinTypeGPIOOutput(GPIO_PORTM_BASE, 0xFF); //All Port M as output

    ......

    //Input ports
    GPIOPinTypeGPIOInput(GPIO_PORTE_BASE, 0x3F); //Port E 0-5 as input
    GPIOPinTypeGPIOInput(GPIO_PORTG_BASE, 0x03); //Port G 0-1 as input
    GPIOPinTypeGPIOInput(GPIO_PORTH_BASE, 0x0F); //Port H 0-3 as input (Actual bidir, but..)

    GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, 0x30); //Port N 4-5 as input

    //Port Q, Handshake
     //Set Pins 0 and 1 as output
    GPIOPinTypeGPIOOutput(GPIO_PORTQ_BASE, GPIO_PIN_0); //CG DC
    GPIOPinTypeGPIOOutput(GPIO_PORTQ_BASE, GPIO_PIN_1); //TR DC

   //Set Pins 2 and 3 as input
    GPIOPinTypeGPIOInput(GPIO_PORTQ_BASE, GPIO_PIN_2); //CG DF
    GPIOPinTypeGPIOInput(GPIO_PORTQ_BASE, GPIO_PIN_3); //TR DF

    GPIOIntRegisterPin(GPIO_PORTQ_BASE, GPIO_PIN_2, CGsetupISR);
    GPIOIntTypeSet(GPIO_PORTQ_BASE, GPIO_PIN_2, GPIO_RISING_EDGE);
    GPIOIntEnable(GPIO_PORTQ_BASE, GPIO_PIN_2);

    GPIOIntRegisterPin(GPIO_PORTQ_BASE, GPIO_PIN_3, TRsetupISR);
    GPIOIntTypeSet(GPIO_PORTQ_BASE, GPIO_PIN_3, GPIO_RISING_EDGE);
    GPIOIntEnable(GPIO_PORTQ_BASE, GPIO_PIN_3);

    //Timer 3A
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER3);
    TimerConfigure(TIMER3_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_ONE_SHOT);
    TimerLoadSet(TIMER3_BASE, TIMER_A, 1200); //15 µs at 120 MHz

    //Timer 4B
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER4);
    TimerConfigure(TIMER4_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_ONE_SHOT);
    TimerLoadSet(TIMER4_BASE, TIMER_A, 1200); //15 µs at 120 MHz

    //Timer 5A
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER5);
    TimerConfigure(TIMER5_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_ONE_SHOT);

    TimerIntRegister(TIMER3_BASE, TIMER_A, Timer3AIntHandler);
    TimerIntRegister(TIMER4_BASE, TIMER_A, Timer4AIntHandler);
    TimerIntRegister(TIMER5_BASE, TIMER_A, Timer5AIntHandler);

    IntMasterEnable();

    TimerIntEnable(TIMER3_BASE, TIMER_TIMA_TIMEOUT);
    IntEnable(INT_TIMER3A);
    TimerIntEnable(TIMER4_BASE, TIMER_TIMA_TIMEOUT);
    IntEnable(INT_TIMER4A);
    TimerIntEnable(TIMER5_BASE, TIMER_TIMA_TIMEOUT);
    IntEnable(INT_TIMER5A);

    //LAN

Now, all three timers work, I do get interrups from them.

But so far nothing on the Q pins.

In my main loop I currently have a simple 1 sec. delay between outputting 0 and 0xFF to Port A, thus also toggling the state of Port Q pins 2 and 3.

I monitor pin 2 and show the state on one of the LEDS. Works fine. LED blinks at 0.5 Hz.

    a=0;

    while (1) {

        GPIOPinWrite(GPIO_PORTA_BASE,0xFF,a);

        a=a ^ 0xFF;

        Indicator=GPIOPinRead(GPIO_PORTQ_BASE,GPIO_PIN_2);
        if (Indicator==4)
            GPIOPinWrite(GPIO_PORTN_BASE,GPIO_PIN_1, 2);
        else
            GPIOPinWrite(GPIO_PORTN_BASE,GPIO_PIN_1, 0);

        ms_delay(1000);
    }

(ms_delay is a timer based wait routine)

I know Port Q is a litle special in that the pins have individual interrupt vectors.

But what do I need to do? What am I missing?

  • I don't see your calls to:

      IntEnable(INT_GPIOQ2);
      IntEnable(INT_GPIOQ3);
    
    

  • Well, adding those two lines to my Setup() did make a change!

    I now jump to IntDefaultHandler on the rising edge.

    This meaning, I have not initialized my link to the ISR correctly!

    But if..

    GPIOIntRegisterPin(GPIO_PORTQ_BASE, GPIO_PIN_2, CGsetupISR);

    and the similar for pin3 are not the correct way,

    Then what is?

    Aha!

    GPIOIntRegisterPin(GPIO_PORTQ_BASE, 2, CGsetupISR);

    seems to do the trick!

    I found a note deep down in this tread: