TM4C123G Lauchpad를 사용해서 GPIO인터럽트 구현
void PORTD_IntHandler(void)
{
uint32_t PORTD_Status;
// PORTD의 INTERRUPT 레지스터의 상태를 읽어온다.
PORTD_Status = GPIOIntStatus(GPIO_PORTD_BASE, true);
// PORTD의 INTERRUPT 레지스터의 상태를 Clear한다. 이렇게 해야지 다음에 Interrput를 계속해서 읽어올 수 있음
GPIOIntClear(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
// 0번 핀에서 인터럽트가 떴을 때
if (PORTD_Status & GPIO_PIN_0)
{
UARTCharPut(UART0_BASE, '0');
}
// 1번 핀에서 인터럽트가 떴을 때
if (PORTD_Status & GPIO_PIN_1)
{
UARTCharPut(UART0_BASE, '1');
}
}
int main(void)
{
FPULazyStackingEnable();
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
IntMasterEnable();
GPIO_Init();
IntEnable(INT_GPIOD);
// 인터럽트로 사용할 포트와 핀을 셋팅해준다.
// 반응을 어떻게 해줄 것인지? RisingEdge or FallingEdge인지 등등 설정가능
GPIOIntTypeSet(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3, GPIO_BOTH_EDGES);
// 인터럽트로 사용할 포트와 핀을 사용가능하게 해준다.
GPIOIntEnable(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
// 위에서 설정한 인터럽트 핀이 발동했을때 동작할 Handler함수를 등록해준다.
GPIOIntRegister(GPIO_PORTD_BASE, PORTD_IntHandler);
}


- 원하는 Input핀으로 인터럽트로 설정해줄 수 있다.
- 같은 포트에 있는 상태에서는 여러개의 핀을 한번에 설정해줘야한다.
- 위의 경우 핀별로 핀과 함수를 등록하는 경우는 동작하지 않음 -> 그래서 포트를 한번에 해줌
- 핸들러 함수에서 각각 핀에 대한 인터럽트 신호를 확인하면서 각각 처리해줌