본문 바로가기
MCU/AVR

[AVR128DB48] GPIO 사용 방법 및 예제 코드

by linuxgo 2025. 8. 18.
반응형

1. AVR128DB48 GPIO 모듈 개요

Microchip의 AVR128DB48은 AVR DB 시리즈의 8비트 마이크로컨트롤러로, 저전력 애플리케이션, 센서 인터페이스, LED 제어, 모터 제어 등 다양한 GPIO(General Purpose Input/Output) 애플리케이션에 적합합니다. GPIO 모듈은 유연한 입출력 설정, 풀업 저항, 인터럽트, 그리고 주변 장치 멀티플렉싱 기능을 제공합니다. 이 문서에서는 AVR128DB48의 GPIO 설정 방법, Bitfield 구조를 활용한 레지스터 설정, 그리고 실용적인 예제 코드를 제공하여 초보자와 숙련된 개발자 모두 쉽게 활용할 수 있도록 돕습니다.

주요 사양

  • 포트 : PORTA, PORTB, PORTC, PORTD, PORTE, PORTF (최대 48개의 GPIO 핀)
  • 핀당 기능 :
    •   디지털 입출력
    •   풀업 저항 설정
    •   인터럽트 (상승/하강/양방향 에지, 저레벨)
    •   멀티플렉스드 주변 장치 (UART, SPI, TWI 등)
  • 클럭 소스 : 시스템 클럭 (최대 24MHz, OSCHF 내부 오실레이터)
  • 인터럽트 : 각 포트별 인터럽트 지원 (PORTx_INT)
  • 주요 레지스터 :
    •   DIR: 입출력 방향 설정
    •   OUT: 출력 데이터 설정
    •   IN: 입력 데이터 읽기
    •   PINxCTRL: 핀별 제어 (풀업, 인터럽트, 반전)
    •   PORTCTRL: 슬루율 제한
  • 전력 관리 : 저전력 모드에서 GPIO 동작 지원
  • 전압 레벨 : 1.8V~5.5V 동작 지원

2. GPIO Bitfield 설정 상세

AVR128DB48의 GPIO 레지스터는 Bitfield 구조로 정의되어 있으며, <avr/io.h> 헤더 파일을 통해 접근합니다. 주요 레지스터는 다음과 같습니다:

2.1 DIR (방향 레지스터)

  • bit.PINx : 핀 방향 설정 (0: 입력, 1: 출력, x=0~7)
  • 예 : PORTA.DIRSET = PIN0_bm (PA0 출력 설정)

2.2 OUT (출력 데이터 레지스터)

  • bit.PINx : 출력 값 설정 (0: Low, 1: High)
  • 예 : PORTA.OUTSET = PIN0_bm (PA0 High 출력)

2.3 IN (입력 데이터 레지스터)

  • bit.PINx : 입력 값 읽기 (0: Low, 1: High)
  • 예 : PORTB.IN & PIN0_bm (PB0 입력 상태 확인)

2.4 PINxCTRL (핀 제어 레지스터, x=0~7)

  • bit.ISC : 인터럽트 감지 설정
    • 0: 비활성화
    • 2: 상승 에지
    • 3: 하강 에지
    • 4: 양방향 에지
    • 5: 저레벨
  • bit.PULLUPEN : 풀업 저항 활성화 (1: 활성화)
  • bit.INVEN : 출력 반전 (1: 반전)

2.5 PORTCTRL (포트 제어 레지스터)

  • bit.SRLEN : 슬루율 제한 활성화 (1: 활성화, 전력 소모 감소)

3. GPIO 설정 절차

  1. 시스템 초기화 :
    •   set_system_clock()로 시스템 클럭 설정 (24MHz, XOSC32K 오토튜닝)
    •   인터럽트 비활성화 (cli())
  2. 포트 클럭 활성화 :
    •   AVR128DB48에서는 별도의 포트 클럭 활성화 불필요 (항상 활성화)
  3. 방향 설정 :
    •   PORTx.DIRSET 또는 PORTx.DIRCLR로 입출력 방향 설정
  4. 출력 설정 :
    •   PORTx.OUTSET 또는 PORTx.OUTCLR로 출력 값 설정
  5. 입력 설정 :
    •   PORTx.PINxCTRL.bit.PULLUPEN으로 풀업 저항 설정
  6. 인터럽트 설정 (필요 시) :
    •   PORTx.PINxCTRL.bit.ISC로 인터럽트 조건 설정
    •   PORTx.INTFLAGS로 인터럽트 플래그 확인
  7. 포트 실행 :
    •   설정 후 즉시 동작 (별도 활성화 불필요)

4. GPIO 설정 고려사항

  • 클럭 설정 : 시스템 클럭(24MHz) 및 XOSC32K 안정화 확인
  • 풀업 저항 : 입력 핀에서 노이즈 방지용 권장
  • 인터럽트 : 다중 핀 인터럽트 시 우선순위 주의
  • 저전력 : 슬루율 제한(PORTCTRL.SRLEN)으로 전력 소모 감소
  • 멀티플렉싱 : GPIO 핀을 다른 주변 장치(UART, SPI 등)로 사용할 경우 충돌 주의

5. 실용적인 GPIO 예제 코드 (Bitfield 구조)

아래는 AVR128DB48 GPIO를 Bitfield 구조로 설정한 5개의 예제 코드입니다. 각 예제는 Atmel Studio 또는 MPLAB X IDE와 AVR-GCC 환경에서 실행 가능합니다. 

5.1 예제 1: 기본 GPIO 출력 (LED 제어)

// File: gpio_basic_output.c
// Description: AVR128DB48 GPIO 기본 출력 예제 (LED 점멸)
// Compiler: AVR-GCC
// Target: AVR128DB48

#include <avr/io.h>        // AVR 입출력 관련 헤더 파일
#include <util/delay.h>    // 지연 함수 관련 헤더 파일

#define F_CPU 24000000UL  // 시스템 클록 주파수를 24 MHz로 정의 (지연 함수 정확도를 위해 필요)

void set_system_clock(void) {
    // 32.768 kHz 외부 크리스털 오실레이터(XOSC32K) 활성화
    _PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm); 
    // CLKCTRL.XOSC32KCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_ENABLE_bm: XOSC32K 활성화
    // CLKCTRL_RUNSTDBY_bm: 스탠바이 모드에서도 XOSC32K 동작 유지
    
    // XOSC32K가 안정될 때까지 대기
    while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
        ; // CLKCTRL.MCLKSTATUS의 XOSC32KS_bm 비트가 1이 될 때까지 대기 (안정화 확인)
    }
    
    // 내부 OSCHF를 24 MHz로 설정하고 XOSC32K를 참조하여 오토튜닝 활성화
    _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
    // CLKCTRL.OSCHFCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_FRQSEL_24M_gc: OSCHF를 24 MHz로 설정
    // CLKCTRL_AUTOTUNE_bm: XOSC32K를 참조한 오토튜닝 활성화
    
    // OSCHF를 시스템 클록 소스로 설정
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
    // CLKCTRL.MCLKCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_CLKSEL_OSCHF_gc: 시스템 클록 소스를 OSCHF로 선택
    
    // 클록 프리스케일러 비활성화 (24 MHz 그대로 사용)
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);
    // CLKCTRL.MCLKCTRLB 레지스터를 0으로 설정하여 프리스케일러 비활성화
}

void gpio_init(void) {
    // PB3(LED0)를 출력으로 설정
    PORTB.DIRSET = PIN3_bm; // PB3 핀을 출력으로 설정 (Curiosity Nano의 LED0)
    PORTB.OUTSET = PIN3_bm; // PB3 초기값 High (LED 켬)
}

int main(void) {
    set_system_clock(); // 시스템 클록 설정 함수 호출
    gpio_init();        // GPIO 설정 함수 호출

    while (1) {
        PORTB.OUTTGL = PIN3_bm; // PB3의 출력 상태를 토글하여 LED를 켜고 끔
        _delay_ms(500);         // 500ms 지연 (LED 깜빡임 주기 조정)
    }

    return 0; // 프로그램 종료 (실제로는 도달하지 않음)
}

설명:

  • 기능 : PB3에 연결된 LED를 500ms 간격으로 점멸
  • 설정 : PB3 출력 설정, 초기 High, 토글로 점멸
  • 출력 : PB3에 LED 점멸 출력

5.2 예제 2: GPIO 입력 (버튼 읽기)

// File: gpio_input_button.c
// Description: AVR128DB48 GPIO 입력 예제 (버튼으로 LED 제어)
// Compiler: AVR-GCC
// Target: AVR128DB48

#include <avr/io.h>        // AVR 입출력 관련 헤더 파일
#include <util/delay.h>    // 지연 함수 관련 헤더 파일

#define F_CPU 24000000UL  // 시스템 클록 주파수를 24 MHz로 정의 (지연 함수 정확도를 위해 필요)

void set_system_clock(void) {
    // 32.768 kHz 외부 크리스털 오실레이터(XOSC32K) 활성화
    _PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm); 
    // CLKCTRL.XOSC32KCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_ENABLE_bm: XOSC32K 활성화
    // CLKCTRL_RUNSTDBY_bm: 스탠바이 모드에서도 XOSC32K 동작 유지
    
    // XOSC32K가 안정될 때까지 대기
    while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
        ; // CLKCTRL.MCLKSTATUS의 XOSC32KS_bm 비트가 1이 될 때까지 대기 (안정화 확인)
    }
    
    // 내부 OSCHF를 24 MHz로 설정하고 XOSC32K를 참조하여 오토튜닝 활성화
    _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
    // CLKCTRL.OSCHFCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_FRQSEL_24M_gc: OSCHF를 24 MHz로 설정
    // CLKCTRL_AUTOTUNE_bm: XOSC32K를 참조한 오토튜닝 활성화
    
    // OSCHF를 시스템 클록 소스로 설정
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
    // CLKCTRL.MCLKCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_CLKSEL_OSCHF_gc: 시스템 클록 소스를 OSCHF로 선택
    
    // 클록 프리스케일러 비활성화 (24 MHz 그대로 사용)
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);
    // CLKCTRL.MCLKCTRLB 레지스터를 0으로 설정하여 프리스케일러 비활성화
}

void gpio_init(void) {
    // PB3(LED0)를 출력으로, PB0(SW0)를 입력으로 설정
    PORTB.DIRSET = PIN3_bm;          // PB3 핀을 출력으로 설정 (Curiosity Nano의 LED0)
    PORTB.DIRCLR = PIN0_bm;          // PB0 핀을 입력으로 설정 (Curiosity Nano의 SW0)
    PORTB.PIN0CTRL |= PORT_PULLUPEN_bm; // PB0에 풀업 저항 활성화
}

int main(void) {
    set_system_clock(); // 시스템 클록 설정 함수 호출
    gpio_init();        // GPIO 설정 함수 호출

    while (1) {
        if (!(PORTB.IN & PIN0_bm)) { // PB0가 Low일 때 (버튼 누름)
            PORTB.OUTSET = PIN3_bm;  // PB3 High (LED 켬)
        } else {
            PORTB.OUTCLR = PIN3_bm;  // PB3 Low (LED 끔)
        }
        _delay_ms(10); // 디바운싱을 위한 10ms 대기
    }

    return 0; // 프로그램 종료 (실제로는 도달하지 않음)
}

설명:

  • 기능 : PB0에 연결된 버튼 입력에 따라 PB3 LED 제어
  • 설정 : PB3 출력, PB0 입력(풀업 저항), 버튼 Low 감지
  • 출력 : 버튼 누름 시 LED ON, 놓을 시 LED OFF

5.3 예제 3: GPIO 인터럽트 (버튼 트리거)

// File: gpio_interrupt.c
// Description: AVR128DB48 GPIO 인터럽트 예제 (버튼으로 LED 토글)
// Compiler: AVR-GCC
// Target: AVR128DB48

#include <avr/io.h>        // AVR 입출력 관련 헤der 파일
#include <avr/interrupt.h> // 인터럽트 처리 관련 헤더 파일

#define F_CPU 24000000UL  // 시스템 클록 주파수를 24 MHz로 정의

volatile uint8_t led_state = 0; // LED 상태를 저장하는 전역 변수 (인터럽트에서 사용)

void set_system_clock(void) {
    // 32.768 kHz 외부 크리스털 오실레이터(XOSC32K) 활성화
    _PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm); 
    // CLKCTRL.XOSC32KCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_ENABLE_bm: XOSC32K 활성화
    // CLKCTRL_RUNSTDBY_bm: 스탠바이 모드에서도 XOSC32K 동작 유지
    
    // XOSC32K가 안정될 때까지 대기
    while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
        ; // CLKCTRL.MCLKSTATUS의 XOSC32KS_bm 비트가 1이 될 때까지 대기 (안정화 확인)
    }
    
    // 내부 OSCHF를 24 MHz로 설정하고 XOSC32K를 참조하여 오토튜닝 활성화
    _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
    // CLKCTRL.OSCHFCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_FRQSEL_24M_gc: OSCHF를 24 MHz로 설정
    // CLKCTRL_AUTOTUNE_bm: XOSC32K를 참조한 오토튜닝 활성화
    
    // OSCHF를 시스템 클록 소스로 설정
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
    // CLKCTRL.MCLKCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_CLKSEL_OSCHF_gc: 시스템 클록 소스를 OSCHF로 선택
    
    // 클록 프리스케일러 비활성화 (24 MHz 그대로 사용)
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);
    // CLKCTRL.MCLKCTRLB 레지스터를 0으로 설정하여 프리스케일러 비활성화
}

void gpio_init(void) {
    // PB3(LED0)를 출력으로, PB0(SW0)를 입력으로 설정
    PORTB.DIRSET = PIN3_bm;          // PB3 핀을 출력으로 설정 (Curiosity Nano의 LED0)
    PORTB.DIRCLR = PIN0_bm;          // PB0 핀을 입력으로 설정 (Curiosity Nano의 SW0)
    PORTB.PIN0CTRL |= PORT_PULLUPEN_bm | PORT_ISC_BOTHEDGES_gc; // PB0 풀업 및 양방향 에지 인터럽트
}

ISR(PORTB_PORT_vect) {
    // PORTB 인터럽트 서비스 루틴
    led_state ^= 1;                  // LED 상태 토글 (0->1, 1->0)
    if (led_state) {
        PORTB.OUTSET = PIN3_bm;      // PB3 High (LED 켬)
    } else {
        PORTB.OUTCLR = PIN3_bm;      // PB3 Low (LED 끔)
    }
    PORTB.INTFLAGS = PIN0_bm;        // PB0 인터럽트 플래그 클리어
}

int main(void) {
    set_system_clock(); // 시스템 클록 설정 함수 호출
    gpio_init();        // GPIO 설정 함수 호출

    sei(); // 글로벌 인터럽트 활성화

    while (1) {
        // 무한 루프: 인터럽트로 LED 제어
    }

    return 0; // 프로그램 종료 (실제로는 도달하지 않음)
}

설명:

  • 기능 : PB0 버튼의 에지 변화로 PB3 LED 토글
  • 설정 : PB3 출력, PB0 입력(풀업, 양방향 에지 인터럽트)
  • 출력 : 버튼 누름/놓음 시 LED 상태 토글

5.4 예제 4: 슬루율 제한 (저전력 출력)

// File: gpio_slew_rate.c
// Description: AVR128DB48 GPIO 슬루율 제한 예제 (저전력 LED 제어)
// Compiler: AVR-GCC
// Target: AVR128DB48

#include <avr/io.h>        // AVR 입출력 관련 헤더 파일
#include <util/delay.h>    // 지연 함수 관련 헤더 파일

#define F_CPU 24000000UL  // 시스템 클록 주파수를 24 MHz로 정의 (지연 함수 정확도를 위해 필요)

void set_system_clock(void) {
    // 32.768 kHz 외부 크리스털 오실레이터(XOSC32K) 활성화
    _PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm); 
    // CLKCTRL.XOSC32KCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_ENABLE_bm: XOSC32K 활성화
    // CLKCTRL_RUNSTDBY_bm: 스탠바이 모드에서도 XOSC32K 동작 유지
    
    // XOSC32K가 안정될 때까지 대기
    while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
        ; // CLKCTRL.MCLKSTATUS의 XOSC32KS_bm 비트가 1이 될 때까지 대기 (안정화 확인)
    }
    
    // 내부 OSCHF를 24 MHz로 설정하고 XOSC32K를 참조하여 오토튜닝 활성화
    _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
    // CLKCTRL.OSCHFCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_FRQSEL_24M_gc: OSCHF를 24 MHz로 설정
    // CLKCTRL_AUTOTUNE_bm: XOSC32K를 참조한 오토튜닝 활성화
    
    // OSCHF를 시스템 클록 소스로 설정
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
    // CLKCTRL.MCLKCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_CLKSEL_OSCHF_gc: 시스템 클록 소스를 OSCHF로 선택
    
    // 클록 프리스케일러 비활성화 (24 MHz 그대로 사용)
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);
    // CLKCTRL.MCLKCTRLB 레지스터를 0으로 설정하여 프리스케일러 비활성화
}

void gpio_init(void) {
    // PB3(LED0)를 출력으로 설정, 슬루율 제한 활성화
    PORTB.DIRSET = PIN3_bm;          // PB3 핀을 출력으로 설정 (Curiosity Nano의 LED0)
    PORTB.PORTCTRL |= PORT_SRLEN_bm; // PB3 슬루율 제한 활성화 (저전력)
    PORTB.OUTSET = PIN3_bm;          // PB3 초기값 High (LED 켬)
}

int main(void) {
    set_system_clock(); // 시스템 클록 설정 함수 호출
    gpio_init();        // GPIO 설정 함수 호출

    while (1) {
        PORTB.OUTTGL = PIN3_bm; // PB3의 출력 상태를 토글하여 LED를 켜고 끔
        _delay_ms(500);         // 500ms 지연 (LED 깜빡임 주기 조정)
    }

    return 0; // 프로그램 종료 (실제로는 도달하지 않음)
}

설명:

  • 기능 : PB3에 연결된 LED를 500ms 간격으로 점멸, 슬루율 제한 적용
  • 설정 : PB3 출력, 슬루율 제한 활성화, 초기 High
  • 출력 : PB3에 저전력 LED 점멸 출력

5.5 예제 5: 다중 핀 출력 (LED 패턴)

// File: gpio_multi_pin.c
// Description: AVR128DB48 GPIO 다중 핀 출력 예제 (LED 패턴)
// Compiler: AVR-GCC
// Target: AVR128DB48

#include <avr/io.h>        // AVR 입출력 관련 헤더 파일
#include <util/delay.h>    // 지연 함수 관련 헤더 파일

#define F_CPU 24000000UL  // 시스템 클록 주파수를 24 MHz로 정의 (지연 함수 정확도를 위해 필요)

void set_system_clock(void) {
    // 32.768 kHz 외부 크리스털 오실레이터(XOSC32K) 활성화
    _PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm); 
    // CLKCTRL.XOSC32KCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_ENABLE_bm: XOSC32K 활성화
    // CLKCTRL_RUNSTDBY_bm: 스탠바이 모드에서도 XOSC32K 동작 유지
    
    // XOSC32K가 안정될 때까지 대기
    while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
        ; // CLKCTRL.MCLKSTATUS의 XOSC32KS_bm 비트가 1이 될 때까지 대기 (안정화 확인)
    }
    
    // 내부 OSCHF를 24 MHz로 설정하고 XOSC32K를 참조하여 오토튜닝 활성화
    _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
    // CLKCTRL.OSCHFCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_FRQSEL_24M_gc: OSCHF를 24 MHz로 설정
    // CLKCTRL_AUTOTUNE_bm: XOSC32K를 참조한 오토튜닝 활성화
    
    // OSCHF를 시스템 클록 소스로 설정
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
    // CLKCTRL.MCLKCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_CLKSEL_OSCHF_gc: 시스템 클록 소스를 OSCHF로 선택
    
    // 클록 프리스케일러 비활성화 (24 MHz 그대로 사용)
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);
    // CLKCTRL.MCLKCTRLB 레지스터를 0으로 설정하여 프리스케일러 비활성화
}

void gpio_init(void) {
    // PA0, PA1, PA2를 출력으로 설정
    PORTA.DIRSET = PIN0_bm | PIN1_bm | PIN2_bm; // PA0, PA1, PA2 핀을 출력으로 설정 (LED 연결)
}

int main(void) {
    set_system_clock(); // 시스템 클록 설정 함수 호출
    gpio_init();        // GPIO 설정 함수 호출

    while (1) {
        PORTA.OUT = PIN0_bm; // PA0 ON, PA1/PA2 OFF
        _delay_ms(500);      // 500ms 지연
        PORTA.OUT = PIN1_bm; // PA1 ON, PA0/PA2 OFF
        _delay_ms(500);      // 500ms 지연
        PORTA.OUT = PIN2_bm; // PA2 ON, PA0/PA1 OFF
        _delay_ms(500);      // 500ms 지연
    }

    return 0; // 프로그램 종료 (실제로는 도달하지 않음)
}

설명:

  • 기능 : PA0, PA1, PA2에 연결된 LED를 순차적으로 점등
  • 설정 : PA0~PA2 출력 설정, 순차적 패턴 출력
  • 출력 : LED가 순차적으로 점등 (500ms 간격)

6. 사용 방법

6.1 환경 설정

  • AVR-GCC 설치 : Atmel Studio 또는 MPLAB X IDE에 AVR-GCC 툴체인 설치
  • 헤더 파일 : <avr/io.h>, <avr/interrupt.h>, <util/delay.h> 포함
  • 프로젝트 설정 : AVR128DB48 타겟으로 프로젝트 생성
  • 클럭 정의 : #define F_CPU 24000000UL로 시스템 클록 설정

6.2 코드 실행

  • 각 예제를 별도의 .c 파일로 저장하거나, main.c에 복사
  • 다른 예제 코드 주석 처리
  • Atmel Studio/MPLAB X IDE에서 빌드 및 플래싱

6.3 하드웨어 준비

  • LED 출력 : PB3, PA0, PA1, PA2에 LED 및 전류 제한 저항(예: 330Ω) 연결
  • 버튼 입력 : PB0에 버튼 및 풀업/풀다운 저항 연결
  • 디바운싱 : 버튼 입력 시 10ms 이상 대기
  • 전원 : 1.8V~5.5V 전원 공급

6.4 디버깅

  • Atmel Studio/MPLAB X IDE의 디버거 사용
  • PORTx.IN, PORTx.OUT, PORTx.INTFLAGS 레지스터 확인
  • 오실로스코프 또는 로직 분석기로 GPIO 신호 점검

7. 추가 팁

  • 클럭 설정 : set_system_clock()로 XOSC32K 안정화 및 24MHz 설정 확인
  • 노이즈 감소 : 입력 핀에 풀업 저항 사용, 외부 디바운싱 회로 추가
  • Microchip 리소스 : Microchip AVR128DB48 데이터시트, Application Notes (AN), AVR-GCC 예제
  • 문제 해결 :
    •   출력 없음: PORTx.DIRSET 및 PORTx.OUTSET 설정 확인
    •   인터럽트 실패: PORTx.PINxCTRL 및 PORTx.INTFLAGS 확인
    •   버튼 입력 불안정: 디바운싱 처리(소프트웨어/하드웨어) 추가
  • 커뮤니티 : Microchip Community, AVR Freaks 포럼 참고

8. 결론

이 문서는 AVR128DB48 GPIO 모듈의 설정 방법과 Bitfield 구조를 활용한 예제 코드를 제공하여 다양한 애플리케이션에 적용 가능하도록 구성했습니다. 초보자는 기본 LED 제어 예제부터 시작하고, 숙련자는 인터럽트 및 다중 핀 제어를 활용하여 복잡한 시스템을 구현할 수 있습니다.

키워드 : AVR128DB48, GPIO, AVR, 마이크로컨트롤러, Atmel Studio, MPLAB X IDE, LED 제어, 버튼 입력, 인터럽트, 풀업 저항, 슬루율 제한, 다중 핀

반응형