You are on page 1of 9

GPIO Interrupt

Example Code

1
2303ENG Embedded Systems(NA and GC)
External GPIO Interrupts : Basic method
1. Disable ALL interrupts

2. Configure GPIO subsystem: typically a regular I/O port

3. Set GPIO registers to allow interrupts of the desired sense

4. Set NVIC to enable interrupts for port using designated interrupt


number and set priority (NVIC->ENn, NVIC->PRIn)

5. Enable ALL interrupts

6. The interrupt service routine should:


Perform the algorithm to handle the event
Clear the interrupt using the Interrupt Clear register.
Set the bit corresponding to the pin to clear the IRQ.
( eg GPIOx->ICR)
GPIO Example
Interrupt on PF2 Low Level.
The interrupt will toggle the PF0 pin
Interrupt Vectors (TM4C1294)
Interrupt Vector Interrupt Interrupt Vector Interrupt
Description Description
Number Address Handlers Number Address Handlers
0x0000.0000 to 36 0x0000.00D0 16/32-Bit Timer 3B void TIMER3B_Handler();
– Processor exceptions
0x0000.003C 37 0x0000.00D4 I2C1 Master and Slave void I2C1_Handler();
0 0x0000.0040 GPIO Port A void GPIOA_Handler(); 38 0x0000.00D8 CAN0 void CAN0_Handler();
1 0x0000.0044 GPIO Port B void GPIOB_Handler(); 39 0x0000.00DC CAN1 void CAN1_Handler();
2 0x0000.0048 GPIO Port C void GPIOC_Handler(); 40 0x0000.00E0 Ethernet MAC void ETH_Handler();
3 0x0000.004C GPIO Port D void GPIOD_Handler(); 41 0x0000.00E4 Hibernate void HIB_Handler();
4 0x0000.0050 GPIO Port E void GPIOE_Handler(); 42 0x0000.00E8 USB MAC void USB0_Handler();
5 0x0000.0054 UART0 Rx and Tx void UART0_Handler(); 43 0x0000.00EC PWM Generator 3 void PWM0_3_Handler();
6 0x0000.0058 UART1 Rx and Tx void UART1_Handler(); 44 0x0000.00F0 μDMA 0 Software void UDMA_Handler();
7 0x0000.005C SSI0 Rx and Tx void SSI0_Handler(); 45 0x0000.00F4 μDMA 0 Error void UDMAERR_Handler();
8 0x0000.0060 I2C0 Master and Slave void I2C0_Handler(); 46 0x0000.00F8 ADC1 Sequence 0 void ADC1SS0_Handler();
9 0x0000.0064 PWM0 Fault void PWM0_FAULT_Handler(); 47 0x0000.00FC ADC1 Sequence 1 void ADC1SS1_Handler();
10 0x0000.0068 PWM0 Generator 0 void PWM0_0_Handler(); 48 0x0000.0100 ADC1 Sequence 2 void ADC1SS2_Handler();
11 0x0000.006C PWM0 Generator 1 void PWM0_1_Handler(); 49 0x0000.0104 ADC1 Sequence 3 void ADC1SS3_Handler();
12 0x0000.0070 PWM0 Generator 2 void PWM0_2_Handler(); 50 0x0000.0108 EBI0 External Bus Interface 0 void EBI0_Handler();
13 0x0000.0074 QEI0 Quadrature Encoder 0 void QEI0_Handler(); 51 0x0000.010C GPIO Port J void GPIOJ_Handler();
14 0x0000.0078 ADC0 Sequence 0 void ADC0SS0_Handler(); 52 0x0000.0110 GPIO Port K void GPIOK_Handler();
15 0x0000.007C ADC0 Sequence 1 void ADC0SS1_Handler(); 53 0x0000.0114 GPIO Port L void GPIOL_Handler();
16 0x0000.0080 ADC0 Sequence 2 void ADC0SS2_Handler(); 54 0x0000.0118 SSI2 Rx and Tx void SSI2_Handler();
17 0x0000.0084 ADC0 Sequence 3 void ADC0SS3_Handler(); 55 0x0000.011C SSI3 Rx and Tx void SSI3_Handler();
18 0x0000.0088 Watchdog Timers 0 and 1 void WDT0_Handler(); 56 0x0000.0120 UART3 Rx and Tx void UART3_Handler();
19 0x0000.008C 16/32-Bit Timer 0A void TIMER0A_Handler(); 57 0x0000.0124 UART4 Rx and Tx void UART4_Handler();
20 0x0000.0090 16/32-Bit Timer 0B void TIMER0B_Handler(); 58 0x0000.0128 UART5 Rx and Tx void UART5_Handler();
21 0x0000.0094 16/32-Bit Timer 1A void TIMER1A_Handler(); 59 0x0000.012C UART6 Rx and Tx void UART6_Handler();
22 0x0000.0098 16/32-Bit Timer 1B void TIMER1B_Handler(); 60 0x0000.0130 UART7 Rx and Tx void UART7_Handler();
23 0x0000.009C 16/32-Bit Timer 2A void TIMER2A_Handler(); 61 0x0000.0134 I2C2 Master and Slave void I2C2_Handler();
24 0x0000.00A0 16/32-Bit Timer 2B void TIMER2B_Handler(); 62 0x0000.0138 I2C3 Master and Slave void I2C3_Handler();
25 0x0000.00A4 Analog Comparator 0 void COMP0_Handler(); 63 0x0000.013C Timer 4A void TIMER4A_Handler();
26 0x0000.00A8 Analog Comparator 1 void COMP1_Handler(); 64 0x0000.0140 Timer 4B void TIMER4B_Handler();
27 0x0000.00AC Analog Comparator 2 void COMP2_Handler(); 65 0x0000.0144 Timer 5A void TIMER5A_Handler();
28 0x0000.00B0 System Control (PLL, OSC, BO) void SYSCTL_Handler(); 66 0x0000.0148 Timer 5B void TIMER5B_Handler();
29 0x0000.00B4 Flash Memory Control void FLASH_Handler();
67 0x0000.014C Floating-Point Exception (imprecise) void FPU_Handler();
30 0x0000.00B8 GPIO Port F void GPIOF_AHB_Handler();
31 0x0000.00BC GPIO Port G void GPIOG_Handler(); 68 ~ 69 Reserved
32 0x0000.00C0 GPIO Port H void GPIOH_Handler(); 70 0x0000.0158 I2C4 Master and Slave void I2C4_Handler();
33 0x0000.00C4 UART2 Rx and Tx void UART2_Handler(); 71 0x0000.015C I2C5 Master and Slave void I2C5_Handler();
34 0x0000.00C8 SSI1 Rx and Tx void SSI1_Handler(); 72 0x0000.0160 GPIO Port M void GPIOM_Handler();
35 0x0000.00CC 16/32-Bit Timer 3A void TIMER3A_Handler(); 73 0x0000.0164 GPIO Port N void GPION_Handler();
GPIO Example Code – Page 1 / 2
#include<stdint.h>
#include "TM4C1294.h"

// ************ Toggle pin 0 when pin 2 is falling edge **********


volatile uint32_t delay=0;

int main(void){

// turn on the port


SYSCTL->RCGCGPIO |= (1<<5);
while ((SYSCTL->PRGPIO)&(1<<5))==0) ;

// setup the port for PF0 (output, digital)


GPIOF_AHB->DIR |= (1<<0);
GPIOF_AHB->DEN |= (1<<0);
GPIOF_AHB->DATA |= (1<<0);

// Set up Pin 2 (input, digital, Pull up – used for interrupt)


GPIOF_AHB->DIR &= ~(1<<2); //PF2 INITIALIZATION
GPIOF_AHB->DEN |=(1<<2);
GPIOF_AHB->PUR |= (1<<2);

__disable_irq() ;
Page 2 / 2

// Configure pin 2 for interrupts (level, high)


GPIOF_AHB->IS |= (1<<2); // Make PF2 level sensitive
GPIOF_AHB->IBE &= ~(1<<2); // Uwe with IEV
GPIOF_AHB->IEV &= ~(1<<2); // Make PF2 low level triggered
GPIOF_AHB->ICR |= (1<<2); // Clear any previous interrupt at PF2
GPIOF_AHB->IM |= (1<<2); // Allow IRQ for PF2

// Set up the NVIC controller (IRQ 30 is PortF)


// D C B A
NVIC->IP[30]= 3; // Assign priority as 3
NVIC_ISER[0]|= (1<<30); // Enable interrupt for IRQ 30

__enable_irq(); // globally enable IRQ

while(true){} // do nothing whilst waiting for interrupt


}

void GPIOF_AHB_Handler(void){
GPIOF_AHB->ICR |= (1<<2); // Clear the interrupt mask
GPIOF_AHB->DATA ^= (1<<0); // Toggle pin 0
}
Better GPIO Example
Interrupt on PF2 Low Level.
The interrupt will toggle the PF0 pin
GPIO Example Code – Page 1 / 2
#include<stdint.h>
#include "TM4C1294.h"

// ************ Toggle pin 0 when pin 2 is falling edge **********


volatile uint32_t delay=0;

int main(void){

// turn on the port


SYSCTL->RCGCGPIO |= (1<<5);
while ((SYSCTL->PRGPIO)&(1<<5))==0) ;

// setup the port for PF0 (output, digital)


GPIOF_AHB->DIR |= (1<<0);
GPIOF_AHB->DEN |= (1<<0);
GPIOF_AHB->DATA |= (1<<0);

// Set up Pin 2 (input, digital, Pull up – used for interrupt)


GPIOF_AHB->DIR &= ~(1<<2); //PF2 INITIALIZATION
GPIOF_AHB->DEN |=(1<<2);
GPIOF_AHB->PUR |= (1<<2);

__disable_irq() ;
Page 2 / 2
// Configure pin 2 for interrupts (level, high)
GPIOF_AHB->IS |= (1<<2); // Make PF4 level sensitive
GPIOF_AHB->IBE &= ~(1<<2); // Uwe with IEV
GPIOF_AHB->IEV &= ~(1<<2); // Make PF4 low level triggered
GPIOF_AHB->ICR |= (1<<2); // Clear any previous interrupt at PF4
GPIOF_AHB->IM |= (1<<2); // Allow IRQ for PF4

// Set up the NVIC controller (IRQ 30 is PortF)


// D C B A
NVIC->IP[30] = 3; // Assign priority as 3
NVIC_ISER[0] |= (1<<30); // Enable interrupt for IRQ 30

__enable_irq(); // globally enable IRQ

while(true){} // do nothing whilst waiting for interrupt


}

void GPIOF_AHB_Handler(void){
// only toggle if IRQ generated by pin 2
// check for pin 2 generating the interrupt
if ((GPIOF_AHB->MIS & (1<<2)) == (1<<2))
GPIOF_AHB->DATA ^= (1<<0); // Toggle pin 0

GPIOF_AHB->ICR |= (1<<2); // Clear the interrupt mask after check since


// ICR will clear RIS and MIS bits

You might also like