본문 바로가기
MCU/AVR

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

by linuxgo 2025. 8. 19.
반응형

1. AVR128DB48 Watchdog 모듈 개요

Microchip의 AVR128DB48 마이크로컨트롤러는 Watchdog Timer(WDT)를 포함하여 시스템 안정성을 높이는 데 유용한 기능을 제공합니다. Watchdog 타이머는 소프트웨어 오류나 시스템 멈춤 시 마이크로컨트롤러를 리셋하여 안정적인 동작을 보장합니다. 이 문서에서는 AVR128DB48의 Watchdog 설정 방법, Bitfield 구조를 활용한 레지스터 설정, 그리고 실용적인 예제 코드를 제공하여 초보자와 숙련된 개발자 모두 쉽게 활용할 수 있도록 돕습니다.

주요 사양

  • 타이머 : 32.768kHz RTC 클럭 또는 내부 1.024kHz 오실레이터 기반
  • 타임아웃 기간 : 8ms ~ 8s (8가지 설정 가능)
  • 동작 모드 :
    • 일반 모드: 타임아웃 시 시스템 리셋
    • 윈도우 모드: 특정 시간 창 내에서만 리셋 가능
  • 레지스터 :
    • WDT.CTRLA: Watchdog 제어 및 타임아웃 설정
    • WDT.STATUS: Watchdog 상태 및 동기화 플래그
  • 전력 관리 : 저전력 모드에서 동작 지원
  • 인터럽트 : 윈도우 모드에서 조기 경고 인터럽트 지원
  • 전압 레벨 : 1.8V~5.5V 동작 지원

2. Watchdog Bitfield 설정 상세

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

2.1 WDT.CTRLA (제어 레지스터 A)

  •   bit.PERIOD : 타임아웃 기간 설정
    •   0x0: 비활성화
    •   0x1: 8ms (8 사이클, 1.024kHz 기준)
    •   0x2: 16ms
    •   0x3: 32ms
    •   0x4: 64ms
    •   0x5: 128ms
    •   0x6: 256ms
    •   0x7: 512ms
    •   0x8: 1s
    •   0x9: 2s
    •   0xA: 4s
    •   0xB: 8s
  •   bit.WINDOW : 윈도우 모드 타임아웃 설정 (윈도우 모드에서 사용, PERIOD와 동일한 값 사용)
  •   bit.LOCK : Watchdog 잠금 (1: 설정 후 변경 불가)
  •   예: WDT.CTRLA = WDT_PERIOD_1S_gc; (1초 타임아웃 설정)

2.2 WDT.STATUS (상태 레지스터)

  •   bit.SYNCBUSY : 동기화 진행 중 플래그 (1: 동기화 중)
  •   bit.LOCK : Watchdog 잠금 상태 (1: 잠김)

3. Watchdog 설정 절차

  1. 시스템 초기화 :
    •   시스템 클럭 설정 (24MHz, XOSC32K 오토튜닝)
    •   인터럽트 비활성화 (cli())
  2. Watchdog 비활성화 :
    •   초기 설정 시 Watchdog 비활성화 (_PROTECTED_WRITE(WDT.CTRLA, 0);)
  3. 타임아웃 설정 :
    •   WDT.CTRLA에 PERIOD 값 설정
  4. 윈도우 모드 설정 (옵션) :
    •   WDT.CTRLA에 WINDOW 값 설정
  5. Watchdog 잠금 (옵션) :
    •   WDT.CTRLA.bit.LOCK = 1로 설정 변경 방지
  6. Watchdog 활성화 :
    •   설정 후 즉시 동작
  7. Watchdog 리셋 :
    •   wdt_reset() 매크로 호출로 타이머 초기화

4. Watchdog 설정 고려사항

  • 클럭 소스 : 1.024kHz 내부 오실레이터 안정화 확인
  • 타임아웃 선택 : 애플리케이션 요구사항에 맞는 타임아웃 기간 설정
  • 윈도우 모드 : 너무 짧은 윈도우 설정 시 리셋 실패 가능성 주의
  • 잠금 기능 : LOCK 비트 설정 후 변경 불가, 신중히 사용
  • 저전력 모드 : Watchdog은 슬립 모드에서도 동작
  • 인터럽트 : 윈도우 모드에서 조기 경고 인터럽트 활용 가능

5. Watchdog 예제 코드 (Bitfield 구조)

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

5.1 예제 1: 기본 Watchdog 설정 (1초 타임아웃)

// File: wdt_basic.c
// Description: AVR128DB48 Watchdog 기본 설정 예제 (1초 타임아웃)
// 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);
    while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
        ; // XOSC32K 안정화 대기
    }
    // 내부 OSCHF를 24 MHz로 설정, XOSC32K 오토튜닝 활성화
    _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00); // 프리스케일러 비활성화
}

void wdt_init(void) {
    // Watchdog 비활성화 (안전한 설정을 위해)
    _PROTECTED_WRITE(WDT.CTRLA, 0);
    // Watchdog 1초 타임아웃 설정
    _PROTECTED_WRITE(WDT.CTRLA, WDT_PERIOD_1S_gc);
}

int main(void) {
    set_system_clock(); // 시스템 클록 설정
    wdt_init();         // Watchdog 초기화

    // PB3(LED0)를 출력으로 설정
    PORTB.DIRSET = PIN3_bm;
    PORTB.OUTSET = PIN3_bm;

    while (1) {
        // Watchdog 리셋 (타이머 초기화)
        wdt_reset();
        PORTB.OUTTGL = PIN3_bm; // LED 토글
        _delay_ms(500);         // 500ms 지연
    }

    return 0;
}

설명:

  • 기능 : 1초 타임아웃으로 Watchdog 설정, PB3 LED를 500ms 간격으로 점멸
  • 설정 : Watchdog 1초 타임아웃, PB3 출력 설정
  • 출력 : Watchdog 리셋 호출로 정상 동작 시 LED 점멸, 1초 내 리셋 없으면 시스템 리셋

5.2 예제 2: 윈도우 모드 Watchdog

// File: wdt_window_mode.c
// Description: AVR128DB48 Watchdog 윈도우 모드 예제 (1초 타임아웃, 500ms 윈도우)
// 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) {
    _PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);
    while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
        ; // XOSC32K 안정화 대기
    }
    _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);
}

void wdt_init(void) {
    // Watchdog 비활성화
    _PROTECTED_WRITE(WDT.CTRLA, 0);
    // 윈도우 모드: 500ms 윈도우, 1초 타임아웃
    _PROTECTED_WRITE(WDT.CTRLA, WDT_WINDOW_512MS_gc | WDT_PERIOD_1S_gc);
}

int main(void) {
    set_system_clock(); // 시스템 클록 설정
    wdt_init();         // Watchdog 초기화

    // PB3(LED0)를 출력으로 설정
    PORTB.DIRSET = PIN3_bm;
    PORTB.OUTSET = PIN3_bm;

    while (1) {
        _delay_ms(600);         // 600ms 대기 (윈도우 내 리셋)
        wdt_reset();            // Watchdog 리셋
        PORTB.OUTTGL = PIN3_bm; // LED 토글
    }

    return 0;
}

설명:

  • 기능 : 500ms 윈도우, 1초 타임아웃으로 윈도우 모드 설정, PB3 LED 점멸
  • 설정 : 윈도우 모드 활성화, 600ms 간격으로 리셋 호출
  • 출력 : 윈도우(500ms~1s) 내 리셋 시 정상 동작, 그렇지 않으면 시스템 리셋

5.3 예제 3: Watchdog 잠금 및 LED 제어

// File: wdt_lock.c
// Description: AVR128DB48 Watchdog 잠금 예제 (2초 타임아웃, 잠금 활성화)
// 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) {
    _PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);
    while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
        ; // XOSC32K 안정화 대기
    }
    _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);
}

void wdt_init(void) {
    // Watchdog 비활성화
    _PROTECTED_WRITE(WDT.CTRLA, 0);
    // 2초 타임아웃 설정, 잠금 활성화
    _PROTECTED_WRITE(WDT.CTRLA, WDT_PERIOD_2S_gc | WDT_LOCK_bm);
}

int main(void) {
    set_system_clock(); // 시스템 클록 설정
    wdt_init();         // Watchdog 초기화

    // PB3(LED0)를 출력으로 설정
    PORTB.DIRSET = PIN3_bm;
    PORTB.OUTSET = PIN3_bm;

    while (1) {
        wdt_reset();            // Watchdog 리셋
        PORTB.OUTTGL = PIN3_bm; // LED 토글
        _delay_ms(1000);        // 1초 지연
    }

    return 0;
}

설명:

  • 기능 : 2초 타임아웃, 잠금 활성화, PB3 LED를 1초 간격으로 점멸
  • 설정 : Watchdog 2초 타임아웃, LOCK 비트 설정, 1초 간격 리셋
  • 출력 : 2초 내 리셋 호출 시 LED 점멸, 그렇지 않으면 시스템 리셋

6. 사용 방법

6.1 환경 설정

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

6.2 코드 실행

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

6.3 하드웨어 준비

  • LED 출력 : PB3에 LED 및 전류 제한 저항(예: 330Ω) 연결
  • 전원 : 1.8V~5.5V 전원 공급
  • 테스트 : Watchdog 동작 확인을 위해 리셋 호출 제거 후 시스템 리셋 확인

6.4 디버깅

  • Atmel Studio/MPLAB X IDE의 디버거 사용
  • WDT.STATUS 레지스터 확인 (SYNCBUSY, LOCK 상태)
  • 오실로스코프 또는 로직 분석기로 리셋 신호 점검

7. 추가 팁

  • 클럭 안정화 : set_system_clock()로 XOSC32K 안정화 확인
  • 타임아웃 설정 : 애플리케이션 루프 시간에 맞게 PERIOD 설정
  • 윈도우 모드 : 윈도우 기간이 너무 짧으면 리셋 실패 가능성 있음
  • 잠금 기능 : LOCK 비트 설정 후 변경 불가, 신중히 사용
  • Microchip 리소스 : AVR128DB48 데이터시트, Application Notes, AVR-GCC 예제
  • 문제 해결 :
    • Watchdog 동작 안 함: WDT.CTRLA 설정 및 동기화 확인
    • 예기치 않은 리셋: wdt_reset() 호출 주기 확인
    • 설정 변경 불가: WDT.STATUS.LOCK 확인
  • 커뮤니티 : Microchip Community, AVR Freaks 포럼 참고

8. 결론

이 문서는 AVR128DB48 Watchdog Timer의 설정 방법과 Bitfield 구조를 활용한 예제 코드를 제공하여 시스템 안정성을 높이는 데 활용할 수 있도록 구성했습니다. 초보자는 기본 Watchdog 설정부터 시작하고, 숙련자는 윈도우 모드와 잠금 기능을 활용하여 복잡한 시스템을 구현할 수 있습니다.

키워드 : AVR128DB48, Watchdog, WDT, 마이크로컨트롤러, Atmel Studio, MPLAB X IDE, 시스템 리셋, 윈도우 모드, 잠금 기능, 저전력

반응형