EspPeriodicTimer is the ESP32-C6 implementation of the BasePeriodicTimer interface,
providing comprehensive periodic timer functionality specifically optimized for ESP32-C6
microcontrollers running ESP-IDF v5.5+.
It offers both basic and advanced timer features with hardware-specific optimizations.
Features
ESP32-C6 Timer - Full support for ESP32-C6 timer capabilities
High Precision - Microsecond-level precision
Multiple Timers - Support for multiple independent timers
Interrupt Support - Configurable interrupt handling
Power Management - Deep sleep compatibility
Callback Support - User-defined callback functions
#include"inc/mcu/esp32/EspPeriodicTimer.h"// Create timer instanceEspPeriodicTimertimer(HF_TIMER_GROUP_0,HF_TIMER_0,HF_TIMER_SCALE_MS);// Initializeif(!timer.Initialize()){printf("Failed to initialize timer\n");return;}// Start timer with 1 second periodhf_timer_err_terr=timer.Start(1000);// 1000ms = 1 secondif(err!=HF_TIMER_ERR_OK){printf("Failed to start timer: %d\n",err);return;}// Check if timer is runningboolrunning;err=timer.IsRunning(&running);if(err==HF_TIMER_ERR_OK&&running){printf("Timer is running\n");}// Stop timererr=timer.Stop();if(err==HF_TIMER_ERR_OK){printf("Timer stopped\n");}
// Timer callback functionvoidtimer_callback(void*user_data){staticintcount=0;count++;printf("Timer callback called %d times\n",count);// Access user data if neededif(user_data){int*data=static_cast<int*>(user_data);(*data)++;}}// Create timer with callbackintcallback_data=0;EspPeriodicTimertimer(HF_TIMER_GROUP_0,HF_TIMER_0,HF_TIMER_SCALE_MS);if(!timer.Initialize()){printf("Failed to initialize timer\n");return;}// Set callbackhf_timer_err_terr=timer.SetCallback(timer_callback,&callback_data);if(err!=HF_TIMER_ERR_OK){printf("Failed to set callback: %d\n",err);return;}// Start timer with 500ms perioderr=timer.Start(500);if(err!=HF_TIMER_ERR_OK){printf("Failed to start timer: %d\n",err);return;}// Let timer run for a whilevTaskDelay(pdMS_TO_TICKS(5000));// 5 seconds// Stop timertimer.Stop();printf("Callback data: %d\n",callback_data);
// Create multiple timersEspPeriodicTimertimer1(HF_TIMER_GROUP_0,HF_TIMER_0,HF_TIMER_SCALE_MS);EspPeriodicTimertimer2(HF_TIMER_GROUP_0,HF_TIMER_1,HF_TIMER_SCALE_MS);EspPeriodicTimertimer3(HF_TIMER_GROUP_1,HF_TIMER_0,HF_TIMER_SCALE_US);// Microsecond precision// Initialize all timersif(!timer1.Initialize()||!timer2.Initialize()||!timer3.Initialize()){printf("Failed to initialize timers\n");return;}// Set different periodstimer1.Start(1000);// 1 secondtimer2.Start(500);// 500mstimer3.Start(10000);// 10ms (in microseconds)// Set different callbackstimer1.SetCallback([](void*data){printf("Timer 1 tick\n");},nullptr);timer2.SetCallback([](void*data){printf("Timer 2 tick\n");},nullptr);timer3.SetCallback([](void*data){printf("Timer 3 tick\n");},nullptr);// Let timers runvTaskDelay(pdMS_TO_TICKS(3000));// 3 seconds// Stop all timerstimer1.Stop();timer2.Stop();timer3.Stop();
// Create high-precision timerEspPeriodicTimertimer(HF_TIMER_GROUP_0,HF_TIMER_0,HF_TIMER_SCALE_US);if(!timer.Initialize()){printf("Failed to initialize timer\n");return;}// Set microsecond precisionhf_timer_err_terr=timer.SetScale(HF_TIMER_SCALE_US);if(err!=HF_TIMER_ERR_OK){printf("Failed to set scale: %d\n",err);return;}// Start with 1000 microsecond period (1ms)err=timer.Start(1000);if(err!=HF_TIMER_ERR_OK){printf("Failed to start timer: %d\n",err);return;}// Get current counthf_timer_count_tcount;err=timer.GetCount(&count);if(err==HF_TIMER_ERR_OK){printf("Current timer count: %llu\n",count);}
// Create timer with specific configurationEspPeriodicTimertimer(HF_TIMER_GROUP_0,HF_TIMER_0,HF_TIMER_SCALE_MS,false);// No auto-reloadif(!timer.Initialize()){printf("Failed to initialize timer\n");return;}// Configure timer propertiestimer.SetAutoReload(true);// Enable auto-reloadtimer.SetScale(HF_TIMER_SCALE_MS);// Millisecond scale// Start timerhf_timer_err_terr=timer.Start(2000);// 2 second periodif(err!=HF_TIMER_ERR_OK){printf("Failed to start timer: %d\n",err);return;}// Change period while runningerr=timer.SetPeriod(1000);// Change to 1 secondif(err!=HF_TIMER_ERR_OK){printf("Failed to set period: %d\n",err);return;}// Reset timererr=timer.Reset();if(err==HF_TIMER_ERR_OK){printf("Timer reset\n");}
ESP32-C6 Specific Features
Hardware Timers
The ESP32-C6 provides multiple hardware timer groups with independent timers.
High Precision
Support for microsecond-level precision timing.
Interrupt Support
Hardware interrupt support for efficient timer handling.
Power Management
Timers can be configured for deep sleep compatibility.
Error Handling
The EspPeriodicTimer class provides comprehensive error handling with specific error codes:
HF_TIMER_ERR_OK - Operation successful
HF_TIMER_ERR_INVALID_ARG - Invalid parameter
HF_TIMER_ERR_NOT_INITIALIZED - Timer not initialized