General Purpose I/O
AURIX™ TC275 ShieldBuddy
GPIO
GPIO(General Purpose Input/Output)는 외부 하드웨어와 직접 상호작용하기 위한 핵심 인터페이스이다. 각 GPIO 포트는 여러 개의 핀으로 구성되며, 각 핀은 독립적으로 입력 또는 출력으로 구성할 수 있다. TC275의 GPIO는 다음과 같은 주요 특징을 갖는다.
- 양방향 I/O (입력 또는 출력으로 구성 가능)
- 내부 pull-up/pull-down 저항 옵션
- 출력 모드 옵션 (Push-pull/Open-drain)
- 핀별 대체 기능(alternate function) 제공
- 비상 정지 로직
GPIO 핀은 레지스터를 통해 제어되며, 각 핀의 동작은 관련 레지스터에 비트를 설정하여 구성한다.
Structure
GPIO structure1
입력 경로
- 외부 핀 → 입력 스테이지(슈미트 트리거) →
IN
레지스터 및 대체 입력 경로 - 입력 pull-up/pull-down 저항은
IOCR
레지스터 설정에 따라 활성화/비활성화 - 슈미트 트리거는 히스테리시스를 제공하여 노이즈 면역성 향상
- 핀 상태는 항상
IN
레지스터를 통해 읽을 수 있음
출력 경로
Pn_OUT
레지스터 또는 대체 기능 출력 → 출력 멀티플렉서 → 출력 드라이버 → 외부 핀- 출력 드라이버는 push-pull 또는 open-drain으로 구성 가능
- 드라이버 강도와 slew rate는
PDR
레지스터로 조정 OMR
레지스터를 통해OUT
레지스터의 비트를 원자적으로 조작
Simple Project
Overview
스위치(버튼) 상태에 따라 LED를 제어하는 예제이다.
입출력 설정
P10.2
(LED): Push-pull 출력으로 설정P02.0
(버튼): 내부 pull-up 저항이 있는 입력으로 설정
제어 로직
- 버튼 누름 →
P02.0
핀 레벨이 HIGH에서 LOW로 변화 - 버튼이 LOW면 LED 켜기(HIGH), 그렇지 않으면 LED 끄기(LOW)
Register Settings
레지스터 설정을 위한 2가지 접근 방식이 존재한다.
- 직접 레지스터 접근
- iLLD 라이브러리 사용
직접 레지스터 접근
P10.2
출력 모드 설정1 2 3 4 5 6
/* P10_IOCR0 레지스터의 PC2 필드: P10.2 핀의 입출력 모드 제어 */ // PC2 필드 초기화: 기존 비트 clear P10_IOCR0.U &= ~(IFX_P_IOCR0_PC2_MSK << IFX_P_IOCR0_PC2_OFF); // PC2 필드의 값을 0x10으로 설정: Push-pull 출력 모드 P10_IOCR0.U |= (MyPort_Mode_outputPushPullGeneral << IFX_P_IOCR0_PC2_OFF);
P02.0
입력 모드 설정1 2 3 4 5 6
/* P02_IOCR0 레지스터의 PC0 필드: P02.0 핀의 입출력 모드 제어 */ // PC0 필드 초기화: 기존 비트 clear P02_IOCR0.U &= ~(IFX_P_IOCR0_PC0_MSK << IFX_P_IOCR0_PC0_OFF); // PC0 필드의 값을 0x02로 설정: Pull-up 입력 모드 P02_IOCR0.U |= (MyPort_Mode_inputPullUp << IFX_P_IOCR0_PC0_OFF);
Pull-up 저항 활성화 시 버튼을 누르고 있지 않을 때 HIGH 값을 유지한다.
버튼 상태 확인 및 LED 제어
1 2 3 4 5 6 7 8 9 10 11
// P02_IN 레지스터의 P0 비트: P02.0 핀의 상태 확인 if ((P02_IN.U & (IFX_P_IN_P0_MSK << IFX_P_IN_P0_OFF)) == 0) { // P10_OMR 레지스터의 PS2 비트: P10_OUT 레지스터의 P2 비트 set P10_OMR.U = IFX_P_OMR_PS2_MSK << IFX_P_OMR_PS2_OFF; } else { // P10_OMR 레지스터의 PCL2 비트: P10_OUT 레지스터의 P2 비트 clear P10_OMR.U = IFX_P_OMR_PCL2_MSK << IFX_P_OMR_PCL2_OFF; }
OMR
레지스터는 read-modify-write 연산 없이 원자적으로OUT
레지스터의 비트를 set/clear한다.
iLLD 라이브러리 사용
iLLD(Infineon Low Level Driver)는 저수준 레지스터 접근을 추상화하여 더 간결하고 읽기 쉬운 코드를 제공한다. 내부적으로는 동일한 레지스터 설정을 수행하지만, 하드웨어 세부 사항을 숨기고 직관적인 API를 제공한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void initGPIO(void)
{
// LED1과 연결된 핀을 출력 모드로 설정
IfxPort_setPinMode(LED1, IfxPort_Mode_outputPushPullGeneral);
// SW1과 연결된 핀을 입력 모드로 설정
IfxPort_setPinMode(SW1, IfxPort_Mode_inputPullUp);
}
void controlLED(void)
{
// Pull-up 회로: 스위치를 닫으면 LOW 상태가 됨
if (IfxPort_getPinState(SW1) == 0)
{
IfxPort_setPinState(LED1, IfxPort_State_high); // LED 켜기
}
else
{
IfxPort_setPinState(LED1, IfxPort_State_low); // LED 끄기
}
}
References
- Infineon. “AURIX_code_examples/code_examples/GPIO_LED_Button_1_KIT_TC275_LK.” GitHub. [Online].
- jjongs2. “tc275/GPIO.” GitHub. [Online].
- jjongs2. “tc275/iLLD_GPIO.” GitHub. [Online].
Footnote
이 글은 저작자의 CC BY-SA 4.0 라이선스를 따릅니다.