5502879a5b
This is very much still work in progress and much more will change before the final 2.0.0 Some APIs have changed. New libraries have been added. LittleFS included. Co-authored-by: Seon Rozenblum <seonr@3sprockets.com> Co-authored-by: Me No Dev <me-no-dev@users.noreply.github.com> Co-authored-by: geeksville <kevinh@geeksville.com> Co-authored-by: Mike Dunston <m_dunston@comcast.net> Co-authored-by: Unexpected Maker <seon@unexpectedmaker.com> Co-authored-by: Seon Rozenblum <seonr@3sprockets.com> Co-authored-by: microDev <70126934+microDev1@users.noreply.github.com> Co-authored-by: tobozo <tobozo@users.noreply.github.com> Co-authored-by: bobobo1618 <bobobo1618@users.noreply.github.com> Co-authored-by: lorol <lorolouis@gmail.com> Co-authored-by: geeksville <kevinh@geeksville.com> Co-authored-by: Limor "Ladyada" Fried <limor@ladyada.net> Co-authored-by: Sweety <switi.mhaiske@espressif.com> Co-authored-by: Loick MAHIEUX <loick111@gmail.com> Co-authored-by: Larry Bernstone <lbernstone@gmail.com> Co-authored-by: Valerii Koval <valeros@users.noreply.github.com> Co-authored-by: 快乐的我531 <2302004040@qq.com> Co-authored-by: chegewara <imperiaonline4@gmail.com> Co-authored-by: Clemens Kirchgatterer <clemens@1541.org> Co-authored-by: Aron Rubin <aronrubin@gmail.com> Co-authored-by: Pete Lewis <601236+lewispg228@users.noreply.github.com>
83 lines
2.2 KiB
C++
83 lines
2.2 KiB
C++
/*
|
|
Repeat timer example
|
|
|
|
This example shows how to use hardware timer in ESP32. The timer calls onTimer
|
|
function every second. The timer can be stopped with button attached to PIN 0
|
|
(IO0).
|
|
|
|
This example code is in the public domain.
|
|
*/
|
|
|
|
// Stop button is attached to PIN 0 (IO0)
|
|
#define BTN_STOP_ALARM 0
|
|
|
|
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 ARDUINO_ISR_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 setup() {
|
|
Serial.begin(115200);
|
|
|
|
// Set BTN_STOP_ALARM to input mode
|
|
pinMode(BTN_STOP_ALARM, INPUT);
|
|
|
|
// 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);
|
|
}
|
|
|
|
void loop() {
|
|
// If Timer has fired
|
|
if (xSemaphoreTake(timerSemaphore, 0) == pdTRUE){
|
|
uint32_t isrCount = 0, isrTime = 0;
|
|
// Read the interrupt count and time
|
|
portENTER_CRITICAL(&timerMux);
|
|
isrCount = isrCounter;
|
|
isrTime = lastIsrAt;
|
|
portEXIT_CRITICAL(&timerMux);
|
|
// Print it
|
|
Serial.print("onTimer no. ");
|
|
Serial.print(isrCount);
|
|
Serial.print(" at ");
|
|
Serial.print(isrTime);
|
|
Serial.println(" ms");
|
|
}
|
|
// If button is pressed
|
|
if (digitalRead(BTN_STOP_ALARM) == LOW) {
|
|
// If timer is still running
|
|
if (timer) {
|
|
// Stop and free timer
|
|
timerEnd(timer);
|
|
timer = NULL;
|
|
}
|
|
}
|
|
}
|