|
#include "Timer.h"
|
|
|
|
hw_timer_t * timer = NULL;
|
|
volatile SemaphoreHandle_t timerSemaphore;
|
|
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
|
|
volatile uint32_t isrCounter = 0;
|
|
volatile uint32_t lastIsrAt = 0;
|
|
|
|
void IRAM_ATTR onTimer(){
|
|
// Increment the counter and set the time of ISR
|
|
portENTER_CRITICAL_ISR(&timerMux);
|
|
isrCounter++;
|
|
lastIsrAt = millis();
|
|
portEXIT_CRITICAL_ISR(&timerMux);
|
|
// Give a semaphore that we can check in the loop
|
|
xSemaphoreGiveFromISR(timerSemaphore, NULL);
|
|
// It is safe to use digitalRead/Write here if you want to toggle an output
|
|
}
|
|
|
|
void setupTimer(){
|
|
// Create semaphore to inform us when the timer has fired
|
|
timerSemaphore = xSemaphoreCreateBinary();
|
|
// Use 1st timer of 4 (counted from zero).
|
|
// Set 80 divider for prescaler (see ESP32 Technical Reference Manual for more
|
|
// info).
|
|
timer = timerBegin(0, 80, true);
|
|
// Attach onTimer function to our timer.
|
|
timerAttachInterrupt(timer, &onTimer, true);
|
|
// Set alarm to call onTimer function every second (value in microseconds).
|
|
// Repeat the alarm (third parameter)
|
|
timerAlarmWrite(timer, 1000000, true);
|
|
// Start an alarm
|
|
timerAlarmEnable(timer);
|
|
}
|