스위치를 눌렀을 때 인터럽트를 실행할 수 있도록 세팅해보자.
외부 스위치 입력은 External Request에 해당한다.
External Request Unit(ERU)에서 처리한다.



ERU에 Input으로 오는 External Request는 다음과 같이 처리된다.
ERU의 출력은 IR의 입력으로 연결된다.


ERU는 맨 처음 External Request Selector(ERS)가 어떤 input을 처리할 것인지 정해준다.
우리는 P02.0과 P02.1를 사용하기 때문에, ERS3과 ERS2을 설정해주면 된다.

Channel x의 input은 input x[0:3] 중에서 EICRy.EXISx에 의해 하나로 정해진다.
P02.0은 ERS3의 2번이므로 Input 32
P02.1은 ERS2의 1번이므로 Input 21
에 해당하는 것을 알 수 있다.
또한, 이것은 EICRy.EXISx에 의해 정해지는데, 아래 그림에서도 확인할 수 있다.

ERS와 ETL은 EICRm.EXISx 값을 설정해주고, 이 값에 의해 동작한다.

EICR은 External Input Channel Register이다.
EICRi는 i번 레지스터 마다 ERS(2i)와 ERS(2i+1), ETL(2i)과 ETL(2i+1)을 세팅한다.
우리가 사용할 것은 ERS2, ERS3이고,
2 = 2*1
3 = 2*1+1
이므로 i=1인 경우. 즉, EICR1만 세팅해주면 된다.
이 중에서 우리는 EXIS, FEN, EIEN, INP를 세팅해주면 된다.

EICR1에는 다양한 Field가 있다.
그 중 먼저 input을 선택해주는 EXISx를 먼저 세팅한다.

EICRi마다 2i에 세팅을 해주는데, 위처럼 이해하면 좋은 것 같다.

EICRi.EXISx 형태에서 EXISx 부분이다.
먼저 P02.1인 ERS2의 1번은 EICR1.EXIS0을 0b001로 세팅한다.

마찬가지로 P02.0은 ERS3의 2번이고, EICR1.EXIS1을 0b010로 세팅한다.


P02.1은 Pull-up 회로로, 눌렀을 때 falling edge가 발생한다.
눌렀을 때 인터럽트가 발생하게 하기 위해 FEN0을 0b1로 세팅한다.
P02.0을 위해 FEN1도 0b1로 세팅한다.


Trigger event를 발생하도록 설정한다.
EIEN0을 0b1, EIEN1을 0b1로 설정하자.


이 field는 trigger event의 output channel을 설정한다.
INP0을 0b000으로 설정하여 OGU0 output으로 설정하고
INP1을 0b001으로 설정하여 OGU1 output으로 설정한다.
둘 다 OGU0를 사용하게 했더니 한쪽이 값을 덮어 써 동시에 사용할 수 없는 것을 확인했다.
이제 output을 처리할 부분을 설정한다.


위의 ETL에서 OGU0로 넘겨주었고, OGU0의 IOUT으로 전달하고자 한다.
왜 IOUT인지는 아직 모르겠다.

이를 위해서는 Flag Gating Register(IGCR)의 IGPy를 설정해주면 된다.


IGP0을 0b01로, IGP1을 0b01로 설정한다.

이제 ERU에서 출력이 나왔으니, Interrupt Router(IR)로 연결된다.
그럼 IR레서 ERU에서 나온 Service Request를 처리하도록 설정해주자.

우선순위이면서 Interrupt vector에서 ISR 함수를 mapping 해줄 수 있는 부분이다.
SRPN은 적당히 10, 20정도로 설정해주었다.

Service Request를 Enable 해야 동작한다.
SRE도 0b1로 설정해준다.

Service를 처리할 곳을 설정해준다.
CPU0를 사용중이므로 TOS는 0b0으로 설정한다.
initERU()에서 전부 처리하도록 만들었다.
void initERU(void)
{
// P2.0
SCU_EICR1.B.EXIS1 = 0x2; // 0b010, Input 3 2 is selected
SCU_EICR1.B.FEN1 = 1; // Falling Edge eNabled
SCU_EICR1.B.EIEN1 = 1; // External Input ENabled
SCU_EICR1.B.INP1 = 0x0; // Input Node Pointer to OGU0
SCU_IGCR0.B.IGP1 = 0x1; // Interrupt Gating Pattern IOUT
SRC_SCU_SCU_ERU1.B.SRPN = 10; // Set Service Request Priority Number to 10
SRC_SCU_SCU_ERU1.B.SRE = 1; // Service Request Enabled
SRC_SCU_SCU_ERU1.B.TOS = 0x0; // Set Type of Service Control to CPU0
// P2.1
SCU_EICR1.B.EXIS0 = 0x1; // 0b001, Input 2 1 is selected
SCU_EICR1.B.FEN0 = 1; // Falling Edge eNabled
SCU_EICR1.B.EIEN0 = 1; // External Input ENabled
SCU_EICR1.B.INP0 = 0x1; // Input Node Pointer to OGU1
SCU_IGCR0.B.IGP0 = 0x1; // Interrupt Gating Pattern IOUT
SRC_SCU_SCU_ERU0.B.SRPN = 20; // Set Service Request Priority Number to 20
SRC_SCU_SCU_ERU0.B.SRE = 1; // Service Request Enabled
SRC_SCU_SCU_ERU0.B.TOS = 0x0; // Set Type of Service Control to CPU0
}
다음 포스트에서는 인터럽트 핸들러를 설정하도록 한다.