ARM

A31G123ML + Keil uVision - 타이머를 이용한 정밀 딜레이 만들기

게임교수 2025. 4. 18. 07:49
반응형

⏱️ ABOV A31G123ML 타이머로 정밀 딜레이 만들기

이전 편에서는 소프트웨어 루프를 이용한 단순 딜레이를 구현했었죠.
이번에는 ABOV A31G123의 16비트 타이머(TIMER16)를 사용해 1ms 정밀 타이머 기반 딜레이 함수를 만들어볼 거예요.

🧰 준비물

  • ABOV A31G123ML MCU 보드
  • Keil uVision5 개발환경
  • ABOV CMSIS Device Pack

🧱 타이머 기본 개념

타이머는 내부 클럭을 이용해 일정 주기마다 값을 증가시키는 하드웨어입니다.
우리는 이걸 1ms 단위 인터럽트 발생용으로 구성할 거예요.

💻 코드 예시: Timer16 기반 1ms 딜레이

#include "A31G123.h"

volatile uint32_t tick = 0;

void TIMER16_0_IRQHandler(void)
{
    if (TIMER16_0->INTFLAGS & 0x01) {
        TIMER16_0->INTFLAGS = 0x01; // clear match flag
        tick++; // 1ms 증가
    }
}

void delay_ms(uint32_t ms)
{
    tick = 0;
    while (tick < ms);
}

void timer16_init(void)
{
    // PCLK 8MHz 기준, 1ms마다 인터럽트
    SYSCON->SYSAHBCLKCTRL |= (1 << 7); // Timer16_0 Clock Enable
    TIMER16_0->TCR = 0x02; // Reset
    TIMER16_0->PR = 7999;  // (8000-1) = 1ms
    TIMER16_0->MR0 = 1;
    TIMER16_0->MCR = 0x03; // Interrupt & Reset on MR0
    NVIC_EnableIRQ(TIMER16_0_IRQn);
    TIMER16_0->TCR = 0x01; // Enable
}

main 함수에서는 다음과 같이 사용합니다:

int main(void)
{
    timer16_init();

    PORT0->MODE |= (1 << 0);
    PORT0->OUTEN |= (1 << 0);

    while (1) {
        PORT0->OUT ^= (1 << 0);
        delay_ms(500);
    }
}

✅ 확인 포인트

  • LED가 정확한 간격으로 깜빡이는지 확인
  • 딜레이가 NOP 루프보다 훨씬 정확함
  • 타이머 인터럽트를 활용한 구조 이해

📚 마무리

이번 편에서는 ABOV A31G123ML MCU의 TIMER16을 활용하여 정밀한 1ms 단위 딜레이 함수를 만들어보았습니다.

다음 편에서는 버튼을 눌렀을 때 반응하는 외부 인터럽트(EXINT)를 구성해볼게요!

반응형