Esp32s3 необходимо починить таймеры

забудь, там изначально какой-то косяк

E:\arduino-ESP\portable\sketchbook\2024\ESP32\RPM_METER\RPM_METER.ino: In function 'void HallFUNC()':
E:\arduino-ESP\portable\sketchbook\2024\ESP32\RPM_METER\RPM_METER.ino:105:56: error: 'IGNITION_Charging_Func' was not declared in this scope
         timerAttachInterrupt(IGNITION_Charging_Timer, &IGNITION_Charging_Func, false);
                                                        ^~~~~~~~~~~~~~~~~~~~~~
E:\arduino-ESP\portable\sketchbook\2024\ESP32\RPM_METER\RPM_METER.ino:105:56: note: suggested alternative: 'IGNITION_Charging_Timer'
         timerAttachInterrupt(IGNITION_Charging_Timer, &IGNITION_Charging_Func, false);
                                                        ^~~~~~~~~~~~~~~~~~~~~~
                                                        IGNITION_Charging_Timer
E:\arduino-ESP\portable\sketchbook\2024\ESP32\RPM_METER\RPM_METER.ino: In function 'void setup()':
E:\arduino-ESP\portable\sketchbook\2024\ESP32\RPM_METER\RPM_METER.ino:149:46: error: expected type-specifier before 'MyAdvertisedDeviceCallbacks'
   pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
                                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~
E:\arduino-ESP\portable\sketchbook\2024\ESP32\RPM_METER\RPM_METER.ino: At global scope:
E:\arduino-ESP\portable\sketchbook\2024\ESP32\RPM_METER\RPM_METER.ino:27:21: error: 'my_mutex' defined but not used [-Werror=unused-variable]
 static portMUX_TYPE my_mutex;
                     ^~~~~~~~
cc1plus.exe: some warnings being treated as errors

Используем библиотеку ESP32 BLE Arduino версии 2.0.0 из папки: C:\Users\Professional\AppData\Local\Arduino15\packages\esp32-2.0.13\hardware\esp32\2.0.13\libraries\BLE 
exit status 1

Compilation error: 'IGNITION_Charging_Func' was not declared in this scope

“мама, хотите жареной картошки? ну дак встаньте и пожарьте!”

1 лайк

в общем победил. как выяснилось, таймеры в есп32 очень проблемная проблема и путешествует от камня к камню. в интернетах описано много разных способов победы но я не нашел рабочего.
Постоянная инициализация таймера с последующим её убийством работала когда то давно на каком то определенном камне(пример ниже)

не работает
наш таймер= timerBegin(0, 80, true);
timerAttachInterrupt(наш таймер, &функция по таймеру, false);
timerAlarmWrite(наш таймер, переменная, false); 
timerAlarmEnable(наш таймер);```

далее в функции по таймеру
(делаем что то)
 startTimer();
  stopTimer();
  startTimer();

или 
(делаем что то)
timerAlarmDisable(наш таймер);

теперь повторная инициализация таймера приводит к ошибке и перезагрузке МК.
решение\костыль - инициализировать кусок таймера один раз :

 void setup() {
          Serial.begin(115200);
         
          timer = timerBegin(0, 80, true);
          timerAttachInterrupt(timer, &onTimer, true);

далее в функции по прерыванию обнулять его и заставлять считать заново нужные нам значения :

void ARDUINO_ISR_ATTR onTimer() {
  if (COUNT) {
    portENTER_CRITICAL(&timerMux);
    что то делаем
    portEXIT_CRITICAL(&timerMux);
    COUNT = false;
  }
}


void ARDUINO_ISR_ATTR timerfunc() {  // Set BTN_STOP_ALARM to input mode
  if (!COUNT) {
    portENTER_CRITICAL(&timerMux);
    timerRestart(timer);
    timerAlarmWrite(timer, наша переменная, true);
    portEXIT_CRITICAL(&timerMux);
    timerAlarmEnable(timer);
    COUNT = true;
  }
}

у меня работает
ide 2.3.2
форк есп 2,0,12

весь код ниже



volatile bool COUNT = false;

hw_timer_t *timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;


void ARDUINO_ISR_ATTR onTimer() {
  if (COUNT) {
    portENTER_CRITICAL(&timerMux);
    TPS++;
    portEXIT_CRITICAL(&timerMux);
    COUNT = false;
  }
}

void ARDUINO_ISR_ATTR timerfunc() {  // Set BTN_STOP_ALARM to input mode
  if (!COUNT) {
    portENTER_CRITICAL(&timerMux);
    timerRestart(timer);
    timerAlarmWrite(timer, Ignition_Timing_Charge_Calc, true);
    portEXIT_CRITICAL(&timerMux);
    timerAlarmEnable(timer);
    COUNT = true;
  }
}


void IRAM_ATTR HallFUNC() {  ///выход метала от датчика

  if (digitalRead(HALL_PIN)) {
    Hall_micros = micros() - HallFUNC_FALLING_micros;  /////время нахождения выступа напротив датчика
                                                       
    if (Hall_micros > 400) { // if (Hall_micros < 8666 && Hall_micros > 400){
      Deegree_micros = Hall_micros / 26;
      RPM = 600000 / (Deegree_micros * 360);
      if (RPM > 1 && RPM < 90) {  ///if (RPM > 8 && RPM < 90) {
        volatile int Advance_MAP[120]{
          5, 5, 5, 5, 5, 5, 5, 3, 7, 10,           ///1000 обмин
          10, 10, 10, 10, 10, 15, 15, 15, 15, 15,  ///2000 обмин   10, 10, 10, 10, 10, 15, 15, 15, 15, 15, ///2000 обмин 10, 15, 15, 15, 15, 15, 15, 15, 15, 15,
          15, 15, 15, 20, 20, 20, 20, 20, 20, 25,  ///3000 обмин  20, 20, 20, 20, 20, 30, 30, 30, 30, 30, ///3000 обмин
          25, 25, 25, 25, 25, 25, 25, 25, 25, 25,  ///4000 обмин 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, ///4000 обмин
          25, 25, 25, 25, 25, 25, 25, 25, 25, 25,  ///5000 обмин 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, ///5000 обмин
          30, 30, 30, 30, 30, 30, 30, 30, 30, 30,  ///6000 обмин
          35, 35, 35, 35, 35, 35, 35, 35, 35, 35,  ///7000 обмин
          35, 35, 35, 35, 35, 35, 35, 35, 35, 35,  ///8000 обмин
          38, 38, 38, 38, 38, 38, 38, 38, 38, 38,  ///9000 обмин......отсечка
          35, 35, 35, 35, 35, 35, 35, 35, 35, 35,  ///10 000 обмин
          35, 35, 35, 35, 35, 35, 35, 35, 35, 35,  ///11 000 обмин
          35, 35, 35, 35, 35, 35, 35, 35, 35, 35,  ///12 000 обмин
        };
        portENTER_CRITICAL(&timerMux);
        Ignition_Timing_Charge_Calc = ((Deegree_micros * (160 - Advance_MAP[RPM])) - Ignition_Timing_Charge);  ///(247 /Deegree_micros)
        portEXIT_CRITICAL(&timerMux);
        timerfunc();}

           } else
      Hall_micros = 0;
    //}
  }
  if (!digitalRead(HALL_PIN)) {  // && KILLSW_OFF) { //
    HallFUNC_FALLING_micros = micros();
  }
}



        void setup() {
          Serial.begin(115200);
          pinMode(HALL_PIN, INPUT_PULLUP);
          timer = timerBegin(0, 80, true);
          timerAttachInterrupt(timer, &onTimer, true);
          attachInterrupt(digitalPinToInterrupt(HALL_PIN), HallFUNC, CHANGE);
        }

        void IRAM_ATTR loop() {
          portENTER_CRITICAL(&timerMux);
          Serial.println(TPS);
          Serial.println(Ignition_Timing_Charge_Calc);
          portEXIT_CRITICAL(&timerMux);
          delay(500);
        }

если криво написал- прошу простить)
в общем всем спасибо за помощь.
на случай важных переговоров

Если ты понял, что после утраты возможеости ходить ногами, тебе помогают костыли, это совсем не означает, что ты полноцено ходишь.)