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.

Discrete GPIO Pin Interrupts

System Details:

  • OS -  Microsoft Windows 7 Professional Version 6.1.7601 Service Pack 1 Build 7601

  • Processor - Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz, 3401 Mhz, 4 Core(s), 8 Logical Processor(s)

  • BIOS Version/Date - Dell Inc. A13, 3/27/2013

CCS Details:

  • Version: 6.1.1.00022
  • TivaWare_C_Series-2.1.0.12573
  • Launchpad: EK-TM4C1294XL

Hello all,

I am attempting to generate individual interrupts on PortP using the discrete interrupt characteristics of the PortP pins. However, I am struggling to get them to work. Here is the code I have for the peripheral initializations.

Note* ALL_BUTTONS is defined as (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5)

#define GPIO_PORTP_INT_ALL (INT_GPIOP0 | INT_GPIOP1 | INT_GPIOP2 | INT_GPIOP3 | INT_GPIOP4 | INT_GPIOP5)


void periph_init(void)
{
	// should we enable all, or only the ones used?
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
	SysCtlDelay(10); // delay for peripheral to enable
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
	SysCtlDelay(10); // delay for peripheral to enable
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
	SysCtlDelay(10); // delay for peripheral to enable
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
	SysCtlDelay(10); // delay for peripheral to enable
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
	SysCtlDelay(10); // delay for peripheral to enable
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
	SysCtlDelay(10); // delay for peripheral to enable
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
	SysCtlDelay(10); // delay for peripheral to enable
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
	SysCtlDelay(10); // delay for peripheral to enable
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);
	SysCtlDelay(10); // delay for peripheral to enable
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);
	SysCtlDelay(10); // delay for peripheral to enable
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL);
	SysCtlDelay(10); // delay for peripheral to enable
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM);
	SysCtlDelay(10); // delay for peripheral to enable
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
	SysCtlDelay(10); // delay for peripheral to enable
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP);
	SysCtlDelay(10); // delay for peripheral to enable
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ);
	SysCtlDelay(10); // delay for peripheral to enable
	SysCtlPeripheralReset(SYSCTL_PERIPH_GPIOQ);
	SysCtlDelay(10);

//	 GPIODirModeSet(GPIO_PORTQ_BASE, GPIO_PIN_2, GPIO_DIR_MODE_OUT);
//	 SysCtlDelay(10);
//	 GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_2, GPIO_PIN_2);
//	 GPIOPadConfigSet(GPIO_PORTQ_BASE, GPIO_PIN_2, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);

	/**********************************************
	 * 		Init GPIO inputs
	 *RESET_WAKE  = PP5
	 *START_PAUSE = PP4
	 *WHT_UP      = PP0
	 *WHT_DN      = PP1
	 *RED_UP      = PP3
	 *RED_DN      = PP2
	 * Configure inputs with weak pull-up resistors (changed within GPIOPinTypeGPIOInput() )
	 *********************************************/
	 GPIOPinTypeGPIOInput(GPIO_PORTP_BASE, (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5));
	 SysCtlDelay(10); // delay for peripheral to enable
	    //
	    // Initialize the debounced button state with the current state read from
	    // the GPIO bank.
	    //
	    //g_ui8ButtonStates = GPIOPinRead(BUTTONS_GPIO_BASE, ALL_BUTTONS);


	    //
	    // Set up to interrupt on low level for all PortP buttons
	    //
	    //IntPrioritySet(GPIO_PORTP_INT_ALL, 0xE0);	//Set to lowest priority
	    GPIOIntTypeSet(GPIO_PORTP_BASE, ALL_BUTTONS , (GPIO_LOW_LEVEL | GPIO_DISCRETE_INT));	// Trigger on LOW level
	    GPIOIntEnable(GPIO_PORTP_BASE, ALL_BUTTONS);	// Enable the ints
	    //IntEnable(GPIO_PORTP_INT_ALL);

And this the vector table

#pragma DATA_SECTION(g_pfnVectors, ".intvecs")
void (* const g_pfnVectors[])(void) =
{
    (void (*)(void))((uint32_t)&__STACK_TOP),
                                            // The initial stack pointer
    ResetISR,                               // The reset handler
    NmiSR,                                  // The NMI handler
    FaultISR,                               // The hard fault handler
    IntDefaultHandler,                      // The MPU fault handler
    IntDefaultHandler,                      // The bus fault handler
    IntDefaultHandler,                      // The usage fault handler
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    IntDefaultHandler,                      // SVCall handler
    IntDefaultHandler,                      // Debug monitor handler
    0,                                      // Reserved
    IntDefaultHandler,                      // The PendSV handler
	SysTickIntHandler,                      // The SysTick handler
	IntDefaultHandler,                      // GPIO Port A
    IntDefaultHandler,                      // GPIO Port B
    IntDefaultHandler,                      // GPIO Port C
    IntDefaultHandler,                      // GPIO Port D
    IntDefaultHandler,                      // GPIO Port E
	UARTintHandler,                      	// UART0 Rx and Tx
	IntDefaultHandler,                      // UART1 Rx and Tx
    IntDefaultHandler,                      // SSI0 Rx and Tx
    IntDefaultHandler,                      // I2C0 Master and Slave
    IntDefaultHandler,                      // PWM Fault
    IntDefaultHandler,                      // PWM Generator 0
    IntDefaultHandler,                      // PWM Generator 1
    IntDefaultHandler,                      // PWM Generator 2
    IntDefaultHandler,                      // Quadrature Encoder 0
    IntDefaultHandler,                      // ADC Sequence 0
    IntDefaultHandler,                      // ADC Sequence 1
    IntDefaultHandler,                      // ADC Sequence 2
    IntDefaultHandler,                      // ADC Sequence 3
	WatchdogIntHandler,                     // Watchdog timer
	IntDefaultHandler,                      // Timer 0 subtimer A
    IntDefaultHandler,                      // Timer 0 subtimer B
	Timer1IntHandler,                       // Timer 1 subtimer A
    IntDefaultHandler,                      // Timer 1 subtimer B
	Timer2IntHandler,                       // Timer 2 subtimer A
    IntDefaultHandler,                      // Timer 2 subtimer B
    IntDefaultHandler,                      // Analog Comparator 0
    IntDefaultHandler,                      // Analog Comparator 1
    IntDefaultHandler,                      // Analog Comparator 2
    IntDefaultHandler,                      // System Control (PLL, OSC, BO)
    IntDefaultHandler,                      // FLASH Control
    IntDefaultHandler,                      // GPIO Port F
    IntDefaultHandler,                      // GPIO Port G
    IntDefaultHandler,                      // GPIO Port H
    IntDefaultHandler,                      // UART2 Rx and Tx
    IntDefaultHandler,                      // SSI1 Rx and Tx
    IntDefaultHandler,                      // Timer 3 subtimer A
    IntDefaultHandler,                      // Timer 3 subtimer B
    IntDefaultHandler,                      // I2C1 Master and Slave
    IntDefaultHandler,                      // CAN0
    IntDefaultHandler,                      // CAN1
	lwIPEthernetIntHandler,                 // Ethernet
    IntDefaultHandler,                      // Hibernate
    IntDefaultHandler,                      // USB0
    IntDefaultHandler,                      // PWM Generator 3
    IntDefaultHandler,                      // uDMA Software Transfer
    IntDefaultHandler,                      // uDMA Error
    IntDefaultHandler,                      // ADC1 Sequence 0
    IntDefaultHandler,                      // ADC1 Sequence 1
    IntDefaultHandler,                      // ADC1 Sequence 2
    IntDefaultHandler,                      // ADC1 Sequence 3
    IntDefaultHandler,                      // External Bus Interface 0
    IntDefaultHandler,                      // GPIO Port J
    IntDefaultHandler,                      // GPIO Port K
    IntDefaultHandler,                      // GPIO Port L
    IntDefaultHandler,                      // SSI2 Rx and Tx
    IntDefaultHandler,                      // SSI3 Rx and Tx
	IntDefaultHandler,                      // UART3 Rx and Tx
	IntDefaultHandler,                     	// UART4 Rx and Tx
    IntDefaultHandler,                      // UART5 Rx and Tx
    IntDefaultHandler,                      // UART6 Rx and Tx
    IntDefaultHandler,                      // UART7 Rx and Tx
    IntDefaultHandler,                      // I2C2 Master and Slave
    IntDefaultHandler,                      // I2C3 Master and Slave
    IntDefaultHandler,                      // Timer 4 subtimer A
    IntDefaultHandler,                      // Timer 4 subtimer B
    IntDefaultHandler,                      // Timer 5 subtimer A
    IntDefaultHandler,                      // Timer 5 subtimer B
    IntDefaultHandler,                      // FPU
    0,                                      // Reserved
    0,                                      // Reserved
    IntDefaultHandler,                      // I2C4 Master and Slave
    IntDefaultHandler,                      // I2C5 Master and Slave
    IntDefaultHandler,                      // GPIO Port M
    IntDefaultHandler,                      // GPIO Port N
    0,                                      // Reserved
    IntDefaultHandler,                      // Tamper
	Int_P0_Handler,                      	// GPIO Port P (Summary or P0)
	Int_P1_Handler,                   	    // GPIO Port P1
	Int_P2_Handler,                      	// GPIO Port P2
	Int_P3_Handler,                      	// GPIO Port P3
	Int_P4_Handler,                      	// GPIO Port P4
	Int_P5_Handler,                      	// GPIO Port P5
    IntDefaultHandler,                      // GPIO Port P6
    IntDefaultHandler,                      // GPIO Port P7
    IntDefaultHandler,                      // GPIO Port Q (Summary or Q0)
    IntDefaultHandler,                      // GPIO Port Q1
    IntDefaultHandler,                      // GPIO Port Q2
    IntDefaultHandler,                      // GPIO Port Q3
    IntDefaultHandler,                      // GPIO Port Q4
    IntDefaultHandler,                      // GPIO Port Q5
	IntDefaultHandler,                      // GPIO Port Q6
	IntDefaultHandler,                      // GPIO Port Q7
    IntDefaultHandler,                      // GPIO Port R
    IntDefaultHandler,                      // GPIO Port S
    IntDefaultHandler,                      // SHA/MD5 0
    IntDefaultHandler,                      // AES 0
    IntDefaultHandler,                      // DES3DES 0
    IntDefaultHandler,                      // LCD Controller 0
    IntDefaultHandler,                      // Timer 6 subtimer A
    IntDefaultHandler,                      // Timer 6 subtimer B
    IntDefaultHandler,                      // Timer 7 subtimer A
    IntDefaultHandler,                      // Timer 7 subtimer B
    IntDefaultHandler,                      // I2C6 Master and Slave
    IntDefaultHandler,                      // I2C7 Master and Slave
    IntDefaultHandler,                      // HIM Scan Matrix Keyboard 0
    IntDefaultHandler,                      // One Wire 0
    IntDefaultHandler,                      // HIM PS/2 0
    IntDefaultHandler,                      // HIM LED Sequencer 0
    IntDefaultHandler,                      // HIM Consumer IR 0
    IntDefaultHandler,                      // I2C8 Master and Slave
    IntDefaultHandler,                      // I2C9 Master and Slave
    IntDefaultHandler,                      // GPIO Port T
    IntDefaultHandler,                      // Fan 1
    0,                                      // Reserved
};

And here is the actual function for handling the interrupts:

//*****************************************************************************
//
// The following functions are simple interrupt handlers for each individual
// button. They each then call the proces_buttons() function with the
// appropriate argument.
//
//*****************************************************************************

void Int_P0_Handler(void)
{
	GPIOIntClear(GPIO_PORTP_BASE, INT_GPIOP0);	// Seconf argument might be GPIO_INT_PIN_0
	// White_up button pressed
	process_button(B_WHT_UP);
}

void Int_P1_Handler(void)
{
	// White_down button pressed
	process_button(B_WHT_DN);
}

void Int_P2_Handler(void)
{
	// Red_down button pressed
	process_button(B_RED_UP);
}

void Int_P3_Handler(void)
{
	// Red_up button pressed
	process_button(B_RED_DN);
}

void Int_P4_Handler(void)
{
	// Start/Pause button pressed
	process_button(B_START_PAUSE);
}

void Int_P5_Handler(void)
{
	// Wake/Reset button pressed
	process_button(B_RESET_WAKE);
}

I have the hardware connected correctly. I just cant seem to get the interrupt handler function to enter. Any help is greatly appreciated!!

Thank you