본문 바로가기

ESP32

ESP32 타이머 및 타이머 인터럽트

반응형

ESP32 타이머 인터럽트 프로그래밍 프로젝트 에서 정확한 타이밍 제어를 위해서는 타이머 인터럽트가 필수적입니다 . 특정 작업을 정해진 시간에 수행해야 할 경우, ESP32 타이머 인터럽트는 필요한 정확도를 제공합니다.

 

타이머 인터럽트는 고정밀 클록처럼 작동하는 전용 인터럽트로, 마이크로초 단위의 정밀도로 시간 이벤트를 계산하고 제어합니다. ESP32에 내장된 하드웨어 타이머는 두 가지 용도로 사용됩니다. 하나는 정확한 시간 지연을 제공하는 것이고, 다른 하나는 ESP32 타이머 인터럽트 예제 애플리케이션에서 카운터 역할을 하는 것입니다.

 

ESP32 타이머 64Bit 4개 구성

 

ESP32 칩에는 두 개의 하드웨어 타이머 그룹이 있습니다. 각 그룹에는 두 개의 범용 하드웨어 타이머가 있습니다. 이 타이머들은 모두 16비트 프리 스케일러와 64비트 업/다운 카운터를 기반으로 하는 64비트 범용 타이머이며, 자동 재로드 기능을 지원합니다.

 

ESP32 프로그래밍을 ESP-IDF에서 할 때 유용한 자료는 ESP-IDF 프로그래밍 가이드 범용 타이머를 참고하세요.

 

ESP32 타이머 인터럽트 LED 깜빡이 회로 - 간략 개요

  • 제작 시간: 1~2시간 | 가격: 8~12달러 | 난이도: 초급
  • 학습 내용: 타이머 인터럽트, ISR 함수, 하드웨어 타이머 설정, 비차단 실행
  • 응용 분야: 지연 없는 LED 깜빡임, 실시간 모터 제어, 주기적인 센서 폴링, 자동화 타이밍 작업

 

목차

ESP32 타이머 인터럽트 프로그래밍: 완벽 가이드

ESP32 타이머 인터럽트 프로그래밍에서 타이머 인터럽트 실행 흐름:

ESP32 타이머 인터럽트에 대한 자주 묻는 질문

ESP32 타이머 인터럽트 예제: LED 깜빡임 프로그램

ESP32 타이머 인터럽트 코드 구현

ESP32 타이머 시작

ESP32 타이머 이벤트용 AttachInterrupt 구현

ESP32 타이머알람쓰기

ESP32 타이머 인터럽트 프로그래밍 고급 기법

첨부 파일

더 많은 ESP32 프로젝트

 

ESP32 타이머 인터럽트 프로그래밍: 완벽 가이드

 

ESP32 타이머 인터럽트 및 하드웨어 타이머 이해하기

 

타이머 인터럽트는 밀리초 단위까지 정확한 타이밍으로 이벤트를 실행할 수 있도록 하는 효과적인 방법으로, 정밀한 클록 또는 PWM 동작 제어, 혹은 LED에 안정적인 펄스 공급 등을 가능하게 합니다. 타이머 인터럽트는 소프트웨어 타이머에 의해 생성되는 소프트웨어 인터럽트입니다. 타이머 인터럽트를 사용하면 코드의 다른 실행 상황과 관계없이 매우 정확한 시간 간격으로 작업을 수행할 수 있습니다. 외부 인터럽트와 유사하지만, 외부 이벤트가 아닌 타이머에 의해 트리거된다는 점이 다릅니다. 트리거되면 현재 명령어가 완료된 후 실행 스레드를 중단하고, ISR(인터럽트 서비스 루틴)을 호출한 다음, ISR이 완료되면 이전 명령어의 실행이 중단된 지점부터 다음 명령어로 돌아갑니다. 이는 하드웨어 또는 외부 인터럽트와 동일한 방식입니다. 다음 이미지는 타이머 개념을 보여줍니다.

 

 

 

ESP32 타이머 인터럽트

 

ESP32 타이머 인터럽트 프로그래밍에서 타이머 인터럽트 실행 흐름:

  1. 타이머 설정: ESP32 timerBegin은 타이머 값을 설정합니다.
  2. ISR 연결: ESP32 attachInterrupt는 임의의 함수에 타이머를 연결합니다.
  3. 연속 카운팅: 타이머가 백그라운드에서 지속적으로 카운팅합니다.
  4. 인터럽트 발생: 지정된 시간이 만료되면 타이머가 인터럽트를 발생시킵니다.
  5. ISR 실행: 프로그램이 일시 중단되고 ISR이 실행된 후 다시 재개됩니다.

 

이 타이머는 하드웨어 기반이므로 모든 타이밍은 타이머의 클록과 관련이 있습니다. 타이머 속도는 다음 공식으로 구할 수 있습니다.

 

timer speed (Hz) = Timer clock speed (Mhz) / prescaler

 

예를 들어, 80MHz 클럭 주파수로 작동하는 ESP32의 타이머 속도는 프리 스케일러 값이 1로 설정되면 80MHz(8000000Hz)가 되고, 프리 스케일러 값이 80으로 설정되면 1MHz(1000000Hz)가 됩니다.

 

프리 스케일러는 위의 주파수를 나누어 타이머의 "틱"(카운터 증가)을 생성하는 값입니다. ISR은 특정 틱 수 후에 실행되도록 구성됩니다. 다음 이미지는 타이머 인터럽트를 사용한 프로세스 흐름을 보여줍니다.

 

 

 

ESP32 타이머 흐름도

 

 

하드웨어 인터럽트와 마찬가지로 타이머 인터럽트는 특정 간격으로 비차단 함수를 실행하는 가장 좋은 방법입니다. 이를 위해 setup 함수에서 특정 타이머 인터럽트를 특정 ISR(인터럽트 서비스 루틴)에 연결하도록 설정합니다. 컨트롤러는 메인 루프를 지속적으로 실행합니다. 타이머 인터럽트가 발생하면 마이크로컨트롤러는 메인 루프를 일시 중지하고 ISR 실행을 진행합니다. ISR 실행이 완료되면 마이크로컨트롤러는 일시 중지되었던 지점부터 메인 루프를 다시 시작합니다. 이 과정은 모든 타이머 인터럽트에 대해 반복됩니다.

 

ESP32 타이머 인터럽트에 대한 자주 묻는 질문

 

⇥ ESP32에는 타이머가 몇 개 있나요?

 

ESP32는 64비트 타이머를 4개 제공합니다.

 

⇥ ESP32에서 타이머 인터럽트를 사용하는 방법은 무엇인가요?

 

원하는 타이머를 인터럽트에 연결하고 해당 인터럽트에 대해 ISR(인터럽트 서비스 루틴)을 할당할 수 있습니다.

 

⇥ ESP32 타이머는 어떻게 작동하나요?

 

타이머는 클럭 주파수와 프리 스케일러 값에 따라 특정 속도로 카운트하는 카운터를 사용합니다. 이 카운터는 설정된 값에 도달하면 초기화되고 인터럽트를 발생시킵니다. 이 카운트 값을 변경하여 타이머 간격을 조절할 수 있습니다.

 

⇥ ESP32 타이머 인터럽트의 일반적인 응용 분야는 무엇인가요?

 

ESP32 타이머 인터럽트를 활용한 대표적인 산업 응용 사례는 모터 제어(서보 제어 포함), 데이터 로깅, 자동화 시스템 등입니다. 이러한 예시들은 모두 타이머 인터럽트가 비차단 방식의 시간 민감형 작업을 유연하게 구현하는 데 얼마나 유용한지 보여줍니다. ESP32 타이머 인터럽트 프로그래밍을 통해 프로그래머는 실시간 로봇 공학, IoT 기기, 측정 장비, 자동화 시스템 등 마이크로초 단위의 시간 정확도가 요구되는 분야에 필요한 정밀한 타이밍 제어를 구현할 수 있습니다.

 

⇥ ESP32 타이머 인터럽트를 여러 개 동시에 실행할 수 있는 방법이 있습니까?

 

네, ESP32에는 4개의 하드웨어 타이머가 있어 4개의 ESP32 타이머 인터럽트를 동시에 실행할 수 있습니다. 각 타이머는 독립적으로 실행되며, 서로 다른 ESP32 timerBegin, ESP32 attachInterrupt 및 ISR 함수 설정을 가질 수 있습니다. 더욱 정교한 ESP32 타이머 인터럽트 프로그래밍 프로젝트에서는 복잡한 타이밍 시퀀스 구성, 센서 데이터 다중화 또는 타이밍 통신 프로토콜 처리 등을 위해 여러 개의 타이머 인터럽트를 구현할 수 있습니다. 타이머 프로그래밍의 복잡성이 증가함에 따라, 간섭 없이 여러 타이머를 동시에 작동시키려면 각 ISR의 우선순위를 신중하게 설정하고 효율적인 코드를 작성해야 합니다. ESP32의 동시 타이머 인터럽트 기능은 여러 타이밍 작업을 동시에 수행해야 하는 고급 임베디드 애플리케이션에 ESP32를 더욱 매력적으로 만듭니다.

 

⇥ ESP32 타이머 인터럽트 프로그래밍에서 ISR 함수 설계 시 몇 가지 지침이 있습니다.

 

ESP32 타이머 인터럽트 프로그래밍에서 ISR을 설계할 때는 몇 가지 모범 사례를 따라야 합니다. 첫째, ISR은 실행 시간이 최대한 짧아야 합니다. 둘째, ISR은 IRAM_ATTR 속성을 사용하여 플래시 메모리가 아닌 IRAM에서 실행되어야 합니다. ISR 코드는 Serial.print() 또는 delay() 함수를 실행할 수 없습니다. 두 함수 모두 실행 시간이 너무 오래 걸리고 인터럽트를 차단할 수 있기 때문입니다. 가능한 한 간단한 ISR 함수를 사용하고, 플래그를 활용하여 복잡한 처리는 메인 루프에서 수행해야 합니다.

 

ESP32 타이머 인터럽트 예제: LED 깜빡임 프로그램

 

이 예제에서는 LED 깜빡임 프로그램을 테스트해 보겠습니다. 하지만 지연 시간 대신 타이머 인터럽트를 사용할 것입니다. 이를 위해 아래 회로도와 같이 브레드보드에 연결하십시오.

 

 

ESP32 타이머 인터럽트 프로그래밍을 위한 회로 구성도

 

 

LED의 애노드를 GPIO21에 연결하고, 캐소드를 220옴 저항을 거쳐 GND에 연결하십시오.

 

ESP32 타이머 인터럽트 코드 구현

 

이 글 하단에 첨부된 코드를 다운로드하여 ESP32에 업로드하세요. LED가 1Hz의 속도로 깜빡이는 것을 확인할 수 있습니다. 이제 코드의 각 부분을 살펴보겠습니다.

 

#define LED 21

hw_timer_t *My_timer = NULL;

 

전역 변수 영역에서 LED 핀을 GPIO21로 정의했습니다. 그런 다음 타이머를 설정하기 위해 hw_timer_t 타입의 My_timer 라는 포인터 변수를 생성했습니다.

 

void IRAM_ATTR onTimer(){

digitalWrite(LED, !digitalRead(LED));

}

 

다음으로 타이머 인터럽트를 위한 ISR(인터럽트 서비스 루틴)을 생성했습니다. 이 ISR에는 GPIO21의 상태를 반전시키는 함수를 작성했습니다. 이 ISR은 타이머 인터럽트가 발생할 때 실행됩니다.

 

void setup() {
pinMode(LED, OUTPUT)
My_timer = timerBegin(0, 80, true);
timerAttachInterrupt(My_timer, &onTimer, true);
timerAlarmWrite(My_timer, 1000000, true);
timerAlarmEnable(My_timer);
}
void loop() {
}

 

 

그리고 Setup 함수에서는 pinMode 매크로를 사용하여 GPIO21을 출력으로 초기화했습니다.

 

ESP32 타이머 시작

 

My_timer = timerBegin(0, 80, true);

 

타이머를 초기화하기 위해 ESP32의 timerBegin 함수를 다음과 같은 변수들과 함께 사용합니다 . 첫 번째 변수는 사용할 타이머 번호(하드웨어 타이머가 4개 있으므로 0에서 3까지), 두 번째 변수는 프리 스케일러 값, 마지막 변수는 카운터가 증가(true)할지 감소(false)할지를 나타내는 플래그입니다. 이 예제에서는 타이머 0, 프리 스케일러 80, 그리고 카운터가 증가하도록 설정합니다.

 

ESP32 타이머 이벤트용 AttachInterrupt 구현

 

timerAttachInterrupt(My_timer, &onTimer, true);

 

타이머를 활성화하기 전에, 인터럽트가 발생할 때 실행될 ISR(인터럽트 서비스 루틴)에 타이머를 연결해야 합니다. 이는 ESP32의 `attachInterrupt` 함수를 호출하여 수행합니다. 이 예제에서는 `onTimer`라는 ISR 함수를 타이머 인터럽트에 연결했습니다.

 

ESP32 타이머알람쓰기

 

timerAlarmWrite(My_timer, 1000000, true);

 

`timerAlarmWrite` 함수는 타이머 인터럽트가 발생할 카운터 값을 지정하는 데 사용됩니다. 이 예제에서는 매초 인터럽트를 발생시키려고 하므로 1초에 해당하는 1000000 마이크로초 값을 전달합니다. 세 번째 인수에는 `true`를 전달하여 카운터가 다시 로드되고 주기적으로 인터럽트가 발생하도록 합니다.

 

timerAlarmEnable(My_timer);

 

마지막으로 timerAlarmEnable 함수를 사용하여 타이머 인터럽트를 활성화합니다.

 

ESP32 타이머 인터럽트 프로그래밍 고급 기법

 

전문적인 ESP32 타이머 인터럽트 프로그래밍은 여러 타이머를 사용하여 이벤트를 예약하고, 우선순위를 설정하며, 리소스를 공유하는 것을 포함할 수 있습니다. 고급 ESP32 타이머 인터럽트 예제 프로젝트에서는 개발자가 여러 타이머를 연동하여 복잡한 타이밍 시퀀스, 센서 샘플링 및 통신 프로토콜을 개발할 수 있습니다.

 

체계적인 ESP32 타이머 인터럽트 프로그래밍을 위해서는 다음과 같은 몇 가지 핵심 사항을 고려하는 것이 중요합니다.

- ISR 실행 시간 최소화

- ESP32 timerBegin 매개변수 선택의 정확성 확보

- ISR에 추가적인 복잡성이 필요한 시점에 ESP32 attachInterrupt 함수 활용

- 인터럽트 컨텍스트에서의 메모리 관리

- 서로 다른 애플리케이션 모듈 간의 타이머 리소스 공유

 

첨부 파일

 

한계를 뛰어넘는 더 많은 ESP32 프로젝트

 

ESP32 기반 프로젝트들을 살펴보면서 타이머, 인터럽트, 실시간 애플리케이션에 대한 자신감을 키워보세요. 인터넷에서 시간을 동기화하거나, 외부 RTC 모듈을 사용하거나, 인터럽트 처리에 대해 더 자세히 알아보고 싶다면, 이 튜토리얼들을 통해 정밀하고 제어력 있는 시간 인식 시스템을 구축하는 데 필요한 도구를 익힐 수 있습니다.

 

전체 코드는 아래와 같습니다.

 

#define LED 21
hw_timer_t *My_timer = NULL;
void IRAM_ATTR onTimer(){
digitalWrite(LED, !digitalRead(LED));
}
void setup() {
pinMode(LED, OUTPUT);
My_timer = timerBegin(0, 80, true);
timerAttachInterrupt(My_timer, &onTimer, true);
timerAlarmWrite(My_timer, 1000000, true);
timerAlarmEnable(My_timer); //Just Enable
}
void loop() {
}

 

 

참고 코드

 

위 코드가 어디서 나온 건지는 모르겠지만 작동하지 않습니다.

이 방법은 테스트를 거쳐 정상 작동합니다. (ESP-32S, Arduino IDE 2.3.6, Arduino ESP32 보드 2.0.18, ESP32(Espressif) 3.3.0, 2025년 7월 29일)


#define LED 02 // 일부 ESP32 보드에 내장되어 있습니다. 필요에 따라 조정하십시오.

// 타이머 구조체에 대한 참조를 생성합니다.
hw_timer_t *timer = NULL;

// 인터럽트 서비스 루틴 생성
void ARDUINO_ISR_ATTR onTimer() {
 digitalWrite(LED, !digitalRead(LED));
}

void setup() {
 pinMode(LED, OUTPUT);
 // 타이머 구조체를 생성하고 참조
 변수에 할당한 후 1MHz로 실행을 시작합니다.
 timer = timerBegin(1000000);  
 // 타이머에 인터럽트를 연결합니다.
 timerAttachInterrupt(timer, &onTimer);
 // 매초(1000000μS)마다 알람이 울리도록 설정하고, 자동 재로드를 활성화하며,
 // 무한 반복합니다.
 timerAlarm(timer, 1000000, true, 0);
}

 

 

위 튜토리얼의 원문을 참고하시고 다른 많은 프로젝트를 탐구하세요.

 

 

ESP32 인터럽트 튜토리얼

ESP32와 OLED 디스플레이를 이용한 인터넷 시계

DS3231 모듈을 사용한 ESP32 실시간 시계

 

 

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

당신의 성공을 위해 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩