Problema con timer y gestor de placa ESP32

En la version 2.x (gestor de placa de esp32 de espressif systems) la configuración de los timers por ejemplo "timer = timerBegin(1,80,true);" te permite elegir el timer en este caso timer1 pero en la version 3.x solo se ingresa la frecuencia ejemplo "timer = timerBegin(1000000);" entonces al querer parar el timer si me eligió automáticamente el timer usado por freeRTOS al detener el timer se detiene todo (o eso interpreto que esta pasando). ¿como se supone que puedo elija el timer que yo quiero? si quiero usar x timer para el uso que yo quiera darle ¿como lo selecciono ahora en la version 3.x ??

Pongo una simplificación del código donde se maneja solo el timer , en este caso es para el gestor de placas V2.X donde si configuro el timer 0 obtengo el mismo problema que el codigo adaptado para la V3.X pero como en la V2.X puedo elegir el timer al ingresar otro timer se puede ver solo la impresión de "andando" cuando esta desactivado el timer y "andando" con "entro" cuando esta activado el timer (algo que con el timer 0 si se para también se para toda la ejecución es decir no se imprime nada).


TaskHandle_t Tarea0; 
hw_timer_t *timer = NULL; // Declaración de la variable timer

bool estado_dimmer = true;
bool flag = false;

void IRAM_ATTR reloj() {
  flag = true;

}

void d_on_off(bool on_off) {  
	 
  if (on_off){ 

	  if(estado_dimmer == false){
		  Serial.println("todo activado");
      timerStart(timer);
      estado_dimmer = true;
    }
    else{
      Serial.println("ya esta todo activado");
    }  

  }
  else{

	  if(estado_dimmer == true){
      Serial.println("todo desactivado");
      timerStop(timer);
      estado_dimmer = false;
    }
    else{
      Serial.println("ya esta todo desactivado");
    }

  }
}


void setup() {

  
  timer = timerBegin(2,80,true);//timer = timerBegin(1000000);
  timerAttachInterrupt(timer, &reloj ,true); 
  timerAlarmWrite(timer, 2000000, true); 
  timerAlarmEnable(timer); 

  xTaskCreatePinnedToCore(loop0,"Tarea_0",1000,NULL,1,&Tarea0,1); // Core 1

  
  Serial.begin(115200);       

}

void loop() { 
} 

void loop0(void *parameter){

  while(1==1){


    Serial.println("andando");

    if(flag){
      Serial.println("entro");
      flag=false;
    }


  int valorIngresado;    

  if (Serial.available() ) {  
    valorIngresado = Serial.parseInt(); 
 
    if(valorIngresado == 300){

      d_on_off(true);
          
    }
    else if(valorIngresado == 400){

      d_on_off(false);
            
    }else {

      Serial.println("Ingresar el valor 300 o 400.");
    }
    while (Serial.available() ) { 
      Serial.read(); // Limpia el búfer de entrada
    }
  }

      vTaskDelay(1000 / portTICK_PERIOD_MS); 
  } 
}

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

No conocía el tema pero de lo que leí me parece que esto podría servirte

Podés usar la función timer_group para seleccionar el grupo de timers y dentro de cada grupo, los timers disponibles.
ESP32 tiene dos grupos de timers (Grupo 0 y Grupo 1), y cada grupo tiene cuatro timers (0 a 3).

#include "driver/timer.h"

#define TIMER_GROUP TIMER_GROUP_0
#define TIMER_NUMBER TIMER_1

TaskHandle_t Tarea0; 
bool estado_dimmer = true;
bool flag = false;

void IRAM_ATTR reloj() {
  flag = true;
}

void d_on_off(bool on_off) {  
  if (on_off){ 
    if(estado_dimmer == false){
      Serial.println("todo activado");
      timer_start(TIMER_GROUP, TIMER_NUMBER);
      estado_dimmer = true;
    }
    else{
      Serial.println("ya esta todo activado");
    }  
  }
  else{
    if(estado_dimmer == true){
      Serial.println("todo desactivado");
      timer_pause(TIMER_GROUP, TIMER_NUMBER);
      estado_dimmer = false;
    }
    else{
      Serial.println("ya esta todo desactivado");
    }
  }
}

void setup() {
  Serial.begin(115200);       

  timer_config_t config = {
    .alarm_en = TIMER_ALARM_EN,
    .counter_en = TIMER_PAUSE,
    .intr_type = TIMER_INTR_LEVEL,
    .counter_dir = TIMER_COUNT_UP,
    .auto_reload = TIMER_AUTORELOAD_EN,
    .divider = 80    // 80 MHz clock divider (1 MHz tick)
  };

  timer_init(TIMER_GROUP, TIMER_NUMBER, &config);
  timer_set_counter_value(TIMER_GROUP, TIMER_NUMBER, 0x00000000ULL);
  timer_set_alarm_value(TIMER_GROUP, TIMER_NUMBER, 2000000ULL); // 2 seconds
  timer_enable_intr(TIMER_GROUP, TIMER_NUMBER);
  timer_isr_callback_add(TIMER_GROUP, TIMER_NUMBER, reloj, NULL, ESP_INTR_FLAG_IRAM);
  timer_start(TIMER_GROUP, TIMER_NUMBER);

  xTaskCreatePinnedToCore(loop0,"Tarea_0",1000,NULL,1,&Tarea0,1); // Core 1
}

void loop() { 
} 

void loop0(void *parameter){
  while(1){
    Serial.println("andando");

    if(flag){
      Serial.println("entro");
      flag=false;
    }

    int valorIngresado;    

    if (Serial.available() ) {  
      valorIngresado = Serial.parseInt(); 

      if(valorIngresado == 300){
        d_on_off(true);       
      }
      else if(valorIngresado == 400){
        d_on_off(false);       
      }else {
        Serial.println("Ingresar el valor 300 o 400.");
      }
      while (Serial.available() ) { 
        Serial.read(); // Limpia el búfer de entrada
      }
    }

    vTaskDelay(1000 / portTICK_PERIOD_MS); 
  } 
}

Este es un ejemplo que encontré que te debería funcionar.
Seleccionado el grupo de timers 0 (TIMER_GROUP_0) y el timer 1 (TIMER_1).
Luego, se configura y se inicializa el timer como siempre, pero utilizando las funciones del hardware del ESP32 para manejar los timers de forma más explícita. Esto te permite tener un mayor control sobre qué timer estás utilizando y evitar conflictos con los timers usados .