반응형
⏱️ 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)를 구성해볼게요!
반응형
'ARM' 카테고리의 다른 글
| A31G123ML + Keil uVision : PWM 출력으로 LED 밝기/부저 음 조절하기 — TIMER16 활용 (0) | 2025.04.18 |
|---|---|
| A31G123ML + Keil uVision : ADC로 아날로그 센서값 읽기 — 가변저항/조도센서 측정 (0) | 2025.04.18 |
| A31G123ML + Keil uVision : UART 통신으로 PC와 시리얼 데이터 주고받기 (0) | 2025.04.18 |
| A31G123ML + Keil uVision : 외부 인터럽트로 버튼 누르기 — EXINT 설정과 토글 제어 (0) | 2025.04.18 |
| Keil uVision으로 ABOV A31G123ML 첫 LED 깜빡이기 (0) | 2025.04.18 |