External Request Unit
AURIX™ TC275 ShieldBuddy
ERU
ERU(External Request Unit)는 외부 핀이나 내부 신호에서 발생하는 이벤트를 감지하고, 해당 이벤트에 기반하여 인터럽트를 생성하거나 다른 주변 장치(peripheral)의 동작을 트리거하는 역할을 한다.
Structure
ERU structure1
ERU는 3가지 핵심 기능 블록으로 구성된다.
- Input Channel
- ERS(External Request Selector): 4개의 가능한 입력 중 하나를 선택
- ETL(Event Trigger Logic): 에지 감지, 트리거 생성
- Connecting Matrix
- 입력 채널의 이벤트를 출력 채널로 분배
- Output Channel
- OGU(Output Gating Unit): 이벤트 조합, 시스템 반응 정의
Simple Project
Overview
스위치(버튼)로 외부 인터럽트를 발생시켜 LED를 제어하는 예제
입출력 설정
P10.2
(LED): Push-pull 출력으로 설정P02.0
(버튼): 내부 pull-up 저항이 있는 입력으로 설정
버튼 입력 감지
- 버튼 누름 →
P02.0
핀 레벨이 HIGH에서 LOW로 변화 - ERU가 하강 에지를 감지하고 트리거 이벤트 생성
- 트리거 이벤트가
OGU0
으로 라우팅 - 인터럽트 게이팅 패턴이 ‘항상 활성화’로 설정되어 있어 인터럽트 생성
인터럽트 처리
- CPU는 현재 작업을 중단하고 인터럽트 벡터 테이블을 참조하여 ISR(Interrupt Service Routine) 실행
P10.2
핀 상태 토글- ISR 종료 후 CPU는 중단된 작업으로 복귀
Register Settings
직접 레지스터 접근
입력 라인 선택
1 2 3 4 5 6
/* SCU_EICR1 레지스터의 EXIS1 필드: 입력 채널 1이 어떤 입력 라인을 사용할지 결정 */ // EXIS1 필드 초기화: 기존 비트 clear SCU_EICR1.U &= ~(IFX_SCU_EICR_EXIS1_MSK << IFX_SCU_EICR_EXIS1_OFF); // EXIS1 필드의 값을 0x2로 설정: REQ6(P02.0) 핀을 선택 SCU_EICR1.U |= (Ifx_RxSel_c << IFX_SCU_EICR_EXIS1_OFF);
에지 감지 설정
1 2
// SCU_EICR1 레지스터의 FEN1 비트: 하강 에지(HIGH에서 LOW로 변화) 감지 활성화 SCU_EICR1.U |= (IFX_SCU_EICR_FEN1_MSK << IFX_SCU_EICR_FEN1_OFF);
트리거 펄스 활성화
1 2
// SCU_EICR1 레지스터의 EIEN1 비트: 선택한 에지가 감지될 때 트리거 이벤트 생성 활성화 SCU_EICR1.U |= (IFX_SCU_EICR_EIEN1_MSK << IFX_SCU_EICR_EIEN1_OFF);
출력 채널 라우팅
1 2 3 4 5 6
/* SCU_EICR1 레지스터의 INP1 필드: 입력 채널 1의 트리거 이벤트를 어떤 출력 채널로 라우팅할지 결정 */ // INP1 필드 초기화: 기존 비트 clear SCU_EICR1.U &= ~(IFX_SCU_EICR_INP1_MSK << IFX_SCU_EICR_INP1_OFF); // INP1 필드의 값을 0x0으로 설정: OGU0(출력 채널 0) 선택 SCU_EICR1.U |= (IfxScuEru_InputNodePointer_0 << IFX_SCU_EICR_INP1_OFF);
인터럽트 게이팅 패턴 설정
1 2 3 4 5 6
/* SCU_IGCR0 레지스터의 IGP0 필드: 감지된 패턴이 출력 라인에 어떻게 영향을 미치는지 결정 */ // IGP0 필드 초기화: 기존 비트 clear SCU_IGCR0.U &= ~(IFX_SCU_IGCR_IGP0_MSK << IFX_SCU_IGCR_IGP0_OFF); // IGP0 필드의 값을 0x1로 설정: 패턴과 무관하게 트리거 이벤트 발생 시 항상 인터럽트 활성화 SCU_IGCR0.U |= (IfxScuEru_InterruptGatingPattern_alwaysActive << IFX_SCU_IGCR_IGP0_OFF);
인터럽트 라우터 설정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/* SRC_SCUERU0 레지스터의 SRPN 필드: 인터럽트 우선순위 설정 */ // SRPN 필드 초기화: 기존 비트 clear SRC_SCU_SCU_ERU0.U &= ~(IFX_SRC_SRCR_SRPN_MSK << IFX_SRC_SRCR_SRPN_OFF); // SRPN 필드의 값을 원하는 우선순위 값(0x00~0xFF)으로 설정: 값이 높을수록 우선순위가 높음 SRC_SCU_SCU_ERU0.U |= (ISR_PRIORITY_SCUERU_INT0 << IFX_SRC_SRCR_SRPN_OFF); /* SRC_SCUERU0 레지스터의 SRE 비트: 인터럽트 활성화 */ SRC_SCU_SCU_ERU0.U |= (IFX_SRC_SRCR_SRE_MSK << IFX_SRC_SRCR_SRE_OFF); /* SRC_SCUERU0 레지스터의 TOS 필드: 인터럽트를 처리할 CPU 지정 */ // TOS 필드 초기화: 기존 비트 clear SRC_SCU_SCU_ERU0.U &= ~(IFX_SRC_SRCR_TOS_MSK << IFX_SRC_SRCR_TOS_OFF); // TOS 필드의 값을 0x0으로 설정: CPU0에서 인터럽트 처리 SRC_SCU_SCU_ERU0.U |= (IfxSrc_Tos_cpu0 << IFX_SRC_SRCR_TOS_OFF);
ISR 등록
1 2 3 4 5 6 7 8 9
// 인터럽트 벡터 테이블에 ISR 등록 (ISR, 벡터 테이블, 우선순위) IFX_INTERRUPT(SCUERU_Int0_Handler, 0, ISR_PRIORITY_SCUERU_INT0); // ISR void SCUERU_Int0_Handler(void) { // P10_OMR 레지스터의 PS2 + PCL2 비트: P10_OUT 레지스터의 P2 비트 토글 P10_OMR.U = (IFX_P_OMR_PS2_MSK << IFX_P_OMR_PS2_OFF) | (IFX_P_OMR_PCL2_MSK << IFX_P_OMR_PCL2_OFF); }
iLLD 라이브러리 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
IFX_INTERRUPT(SCUERU_Int0_Handler, 0, ISR_PRIORITY_SCUERU_INT0);
void SCUERU_Int0_Handler(void)
{
// LED1 토글
IfxPort_setPinState(LED1, IfxPort_State_toggled);
}
void initGPIO(void)
{
// LED1 핀을 출력 모드로 설정
IfxPort_setPinMode(LED1, IfxPort_Mode_outputPushPullGeneral);
}
void initERU(void)
{
// 입력 설정
g_ERUconfig.reqPin = REQ6;
g_ERUconfig.inputChannel = (IfxScuEru_InputChannel)g_ERUconfig.reqPin->channelId;
// SW1 핀을 입력 모드로 설정 + 입력 신호 선택
IfxScuEru_initReqPin(g_ERUconfig.reqPin, IfxPort_InputMode_pullUp);
// 에지 감지 설정
IfxScuEru_enableFallingEdgeDetection(g_ERUconfig.inputChannel);
// 트리거 펄스 활성화
IfxScuEru_enableTriggerPulse(g_ERUconfig.inputChannel);
// 출력 채널 설정
g_ERUconfig.outputChannel = IfxScuEru_OutputChannel_0;
g_ERUconfig.triggerSelect = IfxScuEru_InputNodePointer_0;
IfxScuEru_connectTrigger(g_ERUconfig.inputChannel, g_ERUconfig.triggerSelect);
// 인터럽트 게이팅 패턴 설정
IfxScuEru_setInterruptGatingPattern(g_ERUconfig.outputChannel, IfxScuEru_InterruptGatingPattern_alwaysActive);
// 서비스 요청 설정
g_ERUconfig.src = &MODULE_SRC.SCU.SCU.ERU[(int)g_ERUconfig.outputChannel % 4];
IfxSrc_init(g_ERUconfig.src, IfxSrc_Tos_cpu0, ISR_PRIORITY_SCUERU_INT0);
IfxSrc_enable(g_ERUconfig.src);
}
References
- Infineon. “AURIX_code_examples/code_examples/ERU_Interrupt_1_KIT_TC275_LK.” GitHub. [Online].
- jjongs2. “tc275/ERU.” GitHub. [Online].
- jjongs2. “tc275/iLLD_ERU.” GitHub. [Online].
Footnote
이 글은 저작자의 CC BY-SA 4.0 라이선스를 따릅니다.