본문 바로가기
MCU/AVR

[AVR128DB48] 프로젝트 설정 절차 및 기본 프로그램 작성

by linuxgo 2025. 8. 18.
반응형

이 문서는 Microchip Studio에서 AVR128DB48 Curiosity Nano 보드를 사용하여 프로젝트를 생성하는 절차와 기본 프로그램 작성 조건을 설명합니다. 프로젝트는 내부 고주파 오실레이터(OSCHF)를 24 MHz로 설정하고, 32.768 kHz 외부 크리스털을 참조하여 오토튜닝(Auto-Tune)을 활성화하며, LED0(PB3)를 500ms 간격으로 깜빡이고, USART0를 설정하여 루프백 테스트를 수행하도록 작성됩니다. MPLAB Code Configurator(MCC)는 사용하지 않습니다.

전제 조건

  • 하드웨어:
    • AVR128DB48 Curiosity Nano 보드.
    • 오토튜닝을 위해 32.768 kHz 크리스털(XOSC32K)이 PC0(TOSC1)와 PC1(TOSC2) 핀에 연결되어 있어야 합니다.
    • UART 루프백 테스트를 위해 PD2(TXD0)와 PD3(RXD0)를 물리적으로 연결(루프백).

  • 소프트웨어: Microchip Studio 7.0.2542 이상, AVR-Dx_DFP 1.3.67 이상 설치.

프로젝트 설정 절차

  1. Microchip Studio 설치:
    •   Microchip Studio 7.0.2542 이상을 설치합니다.
    •   AVR-Dx_DFP(Device Family Pack) 1.3.67 이상을 설치하여 AVR128DB48 지원을 확인합니다.
  2. 새 프로젝트 생성:
    •   Microchip Studio를 실행하고, File → New → Project를 선택합니다.
    •   C/C++ → AVR XC8 C Application Project 템플릿을 선택합니다.
    •   프로젝트 이름(예: AVR128DB48_Blink_UART_24MHz_AutoTune)과 저장 위치를 지정한 후, 솔루션 이름을 입력합니다.
    •   OK를 클릭하여 프로젝트를 생성합니다.
  3. 장치 선택:
    •   프로젝트 마법사에서 DeviceAVR128DB48로 선택합니다.
    •   확인 후 프로젝트를 생성합니다.
  4. 하드웨어 연결:
    •   AVR128DB48 Curiosity Nano 보드를 USB 케이블(Standard-A to Micro-B)로 컴퓨터에 연결합니다.
    •   온보드 디버거(nEDBG)가 자동으로 인식됩니다.
    •    32.768 kHz 크리스털이 PC0(TOSC1)와 PC1(TOSC2)에 연결되어 있는지 확인합니다.
    •   UART 루프백 테스트를 위해 PD2(TXD0)와 PD3(RXD0)를 점퍼 와이어로 연결합니다.
  5. 빌드 및 프로그래밍:
    •   코드를 작성한 후, Build → Build Solution (F7)로 빌드합니다.
    •   빌드 성공 후, Debug → Start Debugging and Break (ALT+F5) 또는 Make and Program Device Main Project를 클릭하여 코드를 AVR128DB48에 프로그래밍합니다.

예제 코드

아래 코드는 내부 OSCHF를 24 MHz로 설정하고, 32.768 kHz 외부 크리스털을 사용해 오토튜닝을 활성화하며, LED0(PB3)를 500ms 간격으로 깜빡이고, USART0를 설정하여 루프백 테스트를 수행합니다. 주석은 상세하게 넣었습니다.

#include <avr/io.h>        // AVR 입출력 관련 헤더 파일
#include <avr/interrupt.h> // 인터럽트 처리 관련 헤더 파일
#include <util/delay.h>    // 지연 함수 관련 헤더 파일

#define F_CPU 24000000UL  // 시스템 클록 주파수를 24 MHz로 정의 (지연 함수 정확도를 위해 필요)
#define BAUD_RATE 9600    // UART 통신 보드레이트를 9600으로 설정
#define BAUD_SETTING ((F_CPU / (16UL * BAUD_RATE)) - 1) // 보드레이트 설정 계산 (16분주 사용)

volatile uint8_t rx_data; // UART로 수신된 데이터를 저장하는 전역 변수 (인터럽트에서 사용)

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 uart_init(void) {
    // PD2(TXD0)를 출력으로, PD3(RXD0)를 입력으로 설정
    PORTD.DIRSET = PIN2_bm; // PD2를 출력으로 설정 (UART 송신 핀)
    PORTD.DIRCLR = PIN3_bm; // PD3를 입력으로 설정 (UART 수신 핀)
    
    // USART0 설정: 9600 보드레이트, 8비트 데이터, 패리티 없음, 1 스톱 비트
    USART0.BAUD = BAUD_SETTING; // 보드레이트 레지스터에 계산된 값 설정
    USART0.CTRLC = USART_CHSIZE_8BIT_gc; // 8비트 데이터, 패리티 없음, 1 스톱 비트 설정
    USART0.CTRLA = USART_RXCIE_bm; // 수신 완료 인터럽트 활성화
    USART0.CTRLB = USART_TXEN_bm | USART_RXEN_bm | USART_RXMODE_NORMAL_gc; 
    // 송신(TX) 및 수신(RX) 활성화, 일반 수신 모드 설정
    
    // 글로벌 인터럽트 활성화
    sei(); // 인터럽트 처리를 위해 글로벌 인터럽트 활성화
}

void uart_transmit(uint8_t data) {
    // 데이터 레지스터가 비어질 때까지 대기
    while (!(USART0.STATUS & USART_DREIF_bm)); // DREIF 비트가 1이 될 때까지 대기
    USART0.TXDATAL = data; // 데이터를 TXDATAL 레지스터에 작성하여 송신
}

ISR(USART0_RXC_vect) {
    // USART0 수신 완료 인터럽트 서비스 루틴
    rx_data = USART0.RXDATAL; // 수신된 데이터를 RXDATAL 레지스터에서 읽음
    uart_transmit(rx_data); // 수신된 데이터를 다시 송신 (루프백 테스트)
}

int main(void)
{
    // 시스템 클록을 24 MHz로 설정하고 오토튜닝 활성화
    set_system_clock(); // 시스템 클록 설정 함수 호출
    
    // PB3(LED0)를 출력으로 설정
    PORTB.DIRSET = PIN3_bm; // PB3 핀을 출력으로 설정 (Curiosity Nano의 LED0)
    
    // UART 초기화
    uart_init(); // USART0 초기화 함수 호출
    
    while (1) 
    {
        // LED 상태 토글
        PORTB.OUTTGL = PIN3_bm; // PB3의 출력 상태를 토글하여 LED를 켜고 끔
        _delay_ms(500); // 500ms 지연 (LED 깜빡임 주기 조정)
    }
    
    return 0; // 프로그램 종료 (실제로는 도달하지 않음)
}

코드 설명

  1. 32.768 kHz 크리스털 활성화:
    •   CLKCTRL.XOSC32KCTRLA: 외부 32.768 kHz 크리스털(XOSC32K)을 활성화하고, 스탠바이 모드에서도 동작하도록 설정합니다.
    •   CLKCTRL.MCLKSTATUS: XOSC32K이 안정될 때까지 대기하여 안정적인 클록 소스를 보장합니다.
  2. 24 MHz 내부 클록 및 오토튜닝 설정:
    •   CLKCTRL.OSCHFCTRLA: 내부 OSCHF를 24 MHz로 설정하고, XOSC32K를 참조하여 오토튜닝을 활성화합니다.
    •   CLKCTRL.MCLKCTRLA: OSCHF를 시스템 클록 소스로 선택합니다.
    •   CLKCTRL.MCLKCTRLB: 프리스케일러를 비활성화하여 24 MHz를 그대로 사용합니다.
    •   _PROTECTED_WRITE: 보호된 레지스터에 안전하게 쓰기합니다.
  3. UART 설정 (USART0):
    •   PORTD.DIRSET/DIRCLR: PD2(TXD0)를 출력, PD3(RXD0)를 입력으로 설정.
    •   USART0.BAUD: 9600 보드레이트 설정 (24 MHz 클록 기준).
    •   USART0.CTRLC: 8비트 데이터, 패리티 없음, 1 스톱 비트 설정.
    •   USART0.CTRLA: 수신 완료 인터럽트(RXCIE) 활성화.
    •   USART0.CTRLB: 송신(TX) 및 수신(RX) 활성화, 일반 모드 설정.
    •   sei(): 글로벌 인터럽트를 활성화하여 수신 인터럽트를 처리.
  4. 인터럽트 처리:
    •   ISR(USART0_RXC_vect): 수신 완료 인터럽트에서 수신 데이터를 읽고(RXDATAL), 동일한 데이터를 송신하여 루프백 테스트를 구현합니다.
  5. LED 깜빡임:
    •   PORTB.DIRSET = PIN3_bm: PB3(LED0)를 출력으로 설정.
    •   PORTB.OUTTGL = PIN3_bm: PB3의 상태를 토글하여 LED를 켜고 끕니다.
    •   _delay_ms(500): 500ms 지연으로 깜빡임 간격을 조정.
    •   F_CPU: 24 MHz로 정의하여 지연 함수의 정확성을 보장.

오토튜닝 설명

  • 기능: 오토튜닝은 CLKCTRL.OSCHFCTRLA의 AUTOTUNE_bm 비트를 설정하여 활성화되며, 32.768 kHz 외부 크리스털(XOSC32K)을 참조로 내부 OSCHF의 주파수를 실시간으로 조정합니다. 이는 RTC(Real-Time Counter)와 같은 타이밍에 민감한 애플리케이션에서 유용합니다.
  • 제약사항: 오토튜닝을 사용하려면 32.768 kHz 크리스털이 하드웨어에 연결되어 있어야 합니다. AVR128DB48 Curiosity Nano 보드는 기본적으로 16 MHz 크리스털만 제공하므로, PC0(TOSC1)와 PC1(TOSC2) 핀에 32.768 kHz 크리스털과 적절한 부하 커패시터(예: 12.5 pF)를 추가해야 합니다.

추가 참고 사항

  • 클록 정확도:
    •   오토튜닝을 사용하면 내부 OSCHF의 정확도가 외부 크리스털(일반적으로 20 ppm 이하)에 근접합니다.
    •   오토튜닝 없이 내부 OSCHF는 약 ±2%의 주파수 변동이 있을 수 있습니다.
  • 퓨즈 설정:
    •   기본적으로 내부 클록 및 오토튜닝 설정은 퓨즈 변경 없이 동작합니다. 영구적인 클록 설정을 위해 Microchip Studio에서 FUSE.OSCCFG를 확인하세요.
  • 하드웨어 요구사항:
    •   32.768 kHz 크리스털이 없으면 오토튜닝이 동작하지 않습니다. Curiosity Nano 보드에 추가 크리스털을 설치하거나, 외부 클록 소스를 연결하세요.
    •   UART 루프백 테스트를 위해 PD2와 PD3를 점퍼 와이어로 연결하세요.
  • 테스트:
    •   코드 실행 후 LED0(PB3)가 500ms 간격으로 깜빡이는지 확인.
    •   UART 루프백 테스트를 위해 터미널 프로그램(예: Tera Term)을 사용하여 데이터를 전송하고, 전송된 데이터가 정확히 수신되는지 확인.
    •   클록 정확도를 확인하려면 RTC를 설정하거나 PWM 출력으로 주파수를 측정하세요.
    •   디버거로 CLKCTRL.MCLKSTATUS와 CLKCTRL.OSCHFCTRLA를 점검하여 클록 설정을 확인하세요.

문제 해결

  • XOSC32K 안정화 실패: CLKCTRL.MCLKSTATUS의 XOSC32KS_bm 비트가 설정되지 않으면, 크리스털 연결 또는 부하 커패시터를 확인하세요.
  • 오토튜닝 동작 안 함: CLKCTRL.OSCHFCTRLA의 AUTOTUNE_bm 비트가 설정되었는지 확인하고, XOSC32K이 활성화되었는지 점검하세요.
  • 타이밍 문제: LED 깜빡임 주기나 UART 통신이 예상과 다르면, F_CPU와 실제 클록 주파수가 일치하는지 확인하세요.
  • UART 문제: 데이터가 수신되지 않으면, PD2와 PD3의 루프백 연결, 보드레이트 설정, 또는 인터럽트 활성화 여부를 확인하세요.

 

키워드: AVR128DB48, Microchip Studio, USART, UART 설정, AVR USART 예제, 인터럽트 처리, 루프백 테스트, 오토튜닝, 24 MHz, 내부 클록, Auto-Tune, LED 깜빡임, Curiosity Nano, OSCHF, XOSC32K, CLKCTRL, PB3, 32.768 kHz 크리스털, 시스템 클록

출처:

  • AVR128DB48 Curiosity Nano Hardware User Guide
  • AVR DB Product Brief, Microchip Technology
  • AVR128DB48 Curiosity Nano Product Page
반응형