반응형
⏱️ 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 |