Austin과 Igor의 답변은 충분히 자세합니다. 그러나 다른 방법으로 대답하고 싶습니다. 아마 도움이 될 수 있습니다.
LPC11xx (Cortex-M0)는 GPIO 핀에 대해 4 가지 레벨을 가지며 GPIO0.0에서 GPIO0.n까지의 모든 핀은 동일한 인터럽트 번호를 공유하며 GPIO3.0에서 GPIO3.m의 모든 핀은 동일한 인터럽트 번호를 공유합니다.
LPC11xx에서 GPIO 인터럽트를 초기화하는 6 가지 단계가 있습니다
- 핀 연결 블록 레지스터를 수정하여 핀 기능을 설정하십시오.
- GPIO 데이터 방향 레지스터를 수정하여 핀 방향을 설정하십시오 (기본값은 입력 됨).
- 각 개별 핀에 대한 인터럽트를 설정하려면 GPIO 인터럽트 마스크 레지스터 GPIOnIE로 이동하여 비트 (핀에 해당) 논리 1을 설정해야합니다.
- GPIO 인터럽트 감지 레지스터 GPIOnIBE 및 GPIOnIS를 수정하여 상승 에지 또는 하강 에지에 대한 인터럽트를 설정하십시오.
- CMSIS 기능을 사용하여 Nested Vectored Interrupt Control에서 PIO_0 / PIO_1 / PIO_2 / PIO_3 인터럽트 소스를 활성화하십시오.
- CMSIS 기능을 사용하여 인터럽트 우선 순위를 설정하십시오.
코드 구현. 두 가지 기능이 필요합니다. 하나는 위의 6 단계를 초기화하고 두 번째는 인터럽트 처리기이며 시작 코드 startup_LPC11xx.s
파일에 정의 된 처리기와 이름이 같아야 합니다. 이름은에서 PIOINT0_IRQHandler
까지 PIOINT3_IRQHandler
입니다. 다른 이름을 사용하는 경우 시작 파일에서 이름을 변경해야합니다.
/*Init the GPIO pin for interrupt control */
void GPIO_Init(){
LPC_IOCON-> =.. //Pin configuration register
LPC_GPIO1->FIODIR = ... //GPIO Data direction register
LPC_GPIO1->FIOMASK = .. //GPIO Data mask register - choose the right pin
LPC_GPIO1->GPIOnIE = .. //Set up falling or rising edge
NVIC_EnableIRQ(PIO_1); //Call API to enable interrupt in NVIC
NVIC_SetPriority(PriorityN); //Set priority if needed
}
/*Must have the same name as listed in start-up file startup_LPC11xx.s */
void PIOINT1_IRQHandler(void){
//Do something here
}