Выручайте, я поплыл…
Сейчас трогаю weact esp32s3 mini с пакетом “esp32 by Espressif Systems” версии 3.1.3 в arduino ide (но потом хочу работать с ESP32-S3-Nano и пакетом “Arduino ESP32 Boards 2.0.18-arduino.5”)
Код следующий:
#include "driver/timer.h"
uint32_t last = 0;
static void IRAM_ATTR timer0_ISR (void *arg) {
// timer_spinlock_take(group); // надо ли?
// очистка флагов прерываний
timer_group_clr_intr_status_in_isr(TIMER_GROUP_0, TIMER_0);
// перезапуск прерывания Alarm
timer_group_enable_alarm_in_isr(TIMER_GROUP_0, TIMER_0);
uint64_t value = 0;
while (value < 360000) {
// получение текущего значения таймера uint64_t value
timer_get_counter_value (TIMER_GROUP_0, TIMER_0, &value);
// тут сравниваем с нужной длиной шим и дергаем порты
}
last = value;
// тут считаем тригонометрию, которую применим в следующем прерывании (дельта времени всегда 20мс)
// timer_spinlock_give(group); // надо ли?
}
void setup () {
/*rtc_wdt_protect_off();
rtc_wdt_disable();*/
timer_config_t config = {
.alarm_en = TIMER_ALARM_EN, // включение аларма таймера enum: 0 TIMER_ALARM_DIS | 1 TIMER_ALARM_EN
.counter_en = TIMER_PAUSE, // cостояние после инициализации enum: 0 TIMER_PAUSE | 1 TIMER_START
.intr_type = TIMER_INTR_LEVEL, // прерывание по уровню enum: 0 TIMER_INTR_LEVEL
.counter_dir = TIMER_COUNT_UP, // направление счетчика enum: 0 TIMER_COUNT_DOWN | 1 TIMER_COUNT_UP
.auto_reload = TIMER_AUTORELOAD_EN, // настройка автоматического рестарта прерывания enum: 0 TIMER_AUTORELOAD_DIS | 1 TIMER_AUTORELOAD_EN
.divider = 2 // предделитель uint16_t: 2..65535
};
// инициализация таймера
timer_init(TIMER_GROUP_0, TIMER_0, &config);
uint64_t value = 1;
uint64_t alarm_value = 2400000;
// начальное значение счетчика uint64_t value: 0..4294967295
timer_set_counter_value (TIMER_GROUP_0, TIMER_0, value);
// значение, при достижении которого сработает прерывание uint64_t alarm_value: 0..4294967295
timer_set_alarm_value (TIMER_GROUP_0, TIMER_0, alarm_value);
// разрешение прерывания
timer_enable_intr(TIMER_GROUP_0, TIMER_0);
// привязка функции обработки перрывания
timer_isr_register (TIMER_GROUP_0, TIMER_0, timer0_ISR, NULL, 0, NULL);
// запуск таймера
timer_start(TIMER_GROUP_0, TIMER_0);
Serial.begin(9600);
printf("Hi!\r\n");
}
void loop() {
//
String s = "loop! " + String(last) + "\r\n";
printf(s.c_str());
//delay(2000);
}
Компилится и даже ощущение, что делает желаемое, но компилятор предупреждает #warning “legacy timer group driver is deprecated, please migrate to driver/gptimer.h” что как бы намекает на использование устаревшей библиотеки для использования таймеров.
Я в их референсах ESP-IDF Programming Guide уже несколько разных реализаций прерываний нашел, не пойму, что именно мне нужно изучать
Interrupt Allocation - ESP32-S3 - — ESP-IDF Programming Guide v5.4 documentation это?