Post

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 라이브러리 사용

직접 레지스터 접근

  1. 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);
    
  2. 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 값을 유지한다.

  3. 버튼 상태 확인 및 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


Footnote

이 글은 저작자의 CC BY-SA 4.0 라이선스를 따릅니다.