Recents in Beach


Receba o meu conteúdo GRATUITAMENTE


ESP32 MAIS VELOZ!



Existem duas maneiras de você fazer o GPIO do ESP32 ficar 0 ou 1. Ou você chama a função digitalwrite ou você vai direto no registrador. E, o que eu vou mostrar para vocês hoje é esta segunda opção: como ir direto ao registrador, escreve na memória dele e o comando vai de forma instantânea mudar de estado. Vamos, portanto, aprender como modificar vários GPIOs de uma vez utilizando máscara de bits. No nosso exemplo de hoje utilizamos cinco leds.





Demonstração





Registradores /sdk/include/soc/soc/rtc_io_struct.h

union {
  struct {
    uint32_t reserved0:14;
    uint32_t w1ts:18; /*GPIO0~17 output value write 1 to set*/
};
uint32_t val;
} out_w1ts;

union {
  struct {
    uint32_t reserved0:14;
    uint32_t w1tc:18; /*GPIO0~17 output value write 1 to clear*/
};
uint32_t val;
} out_w1tc;







digitalWrite  código do ESP32 Arduino /cores/esp32/esp32-hal-gpio.c

extern void IRAM_ATTR __digitalWrite(uint8_t pin, uint8_t val)
{
  if(val) {
     if(pin < 32) 
     {
        GPIO.out_w1ts = ((uint32_t)1 << pin);
     } 
     else if(pin < 34) {
        GPIO.out1_w1ts.val = ((uint32_t)1 << (pin - 32));
     }
  } 
  else 
  {
     if(pin < 32) 
     {
        GPIO.out_w1tc = ((uint32_t)1 << pin);
     } 
     else if(pin < 34) 
     {
        GPIO.out1_w1tc.val = ((uint32_t)1 << (pin - 32));
     }
  }
}




Múltiplos pinos de uma vez ex.1

Setup

void setup()
{
    //Configuração dos gpios
    gpio_config_t io_conf

    //Colocamos como OUTPUT
    io_conf.mode = GPIO_MODE_OUTPUT;

    //Definição dos gpios que fazem parte desta configuração
    //Da direita para a esquerda, os que tem 1 fazem parte da configuração
    //Neste exemplo, contando da direita para esquerda (começando do 0) temos o gpio 2 e o gpio 4
    //Para facilitar quando temos pinos de valor alto podemos utilizar
    //deslocamento de bits, por exemplo: (1 << 2) | (1 << 4)
    io_conf.pin_bit_mask = 0b10100;
    //Ou poderia ser
    //io_conf.pin_bit_mask = (1 << 2) | (1 << 4);

    //Aplica a configuração
    gpio_config(&io_conf);
}




Loop

void loop()
{
    //Máscara de bits com os pinos que serão "setados" como ativos
    GPIO.out_w1ts = 0b10100;
    //Ou poderia ser
    //GPIO.out_w1ts = (1 << 2) | (1 << 4);

    //Delay de 1 segundo
    delay(1000);

    //Máscara de bits com os pinos serão desativados (clear)
    GPIO.out_w1tc = 0b10100;
    //Ou poderia ser
    //GPIO.out_w1tc = (1 << 2) | (1 << 4);

    //Delay de 1 segundo
    delay(1000);
}



Múltiplos pinos de uma vez ex.2

Setup

//Máscara com os GPIOs 0, 2 e 4
//Se invertermos esta máscara com "~" teremos 0b01010
//e passamos a ter selecionados os GPIOs 1 e 3
int mask = 0b10101;

void setup()
{
    //Configuração dos gpios
    gpio_config_t io_conf;

    //Colocamos como OUTPUT
    io_conf.mode = GPIO_MODE_OUTPUT;

    //Definição dos gpios que fazem parte desta configuração
    //Da direita para a esquerda, os que tem 1 fazem parte da conifguração
    //No caso os GPIOs 0, 1, 2, 3 e 4
    io_conf.pin_bit_mask = 0b11111;

    //Aplica a configuração
    gpio_config(&io_conf);
}


Loop

void loop()
{
    //Invertamos os bits da máscara
    //Os que estavam selecionados são desselecionados e vice-versa
    mask = ~mask;
    //Máscara de bits com os pinos que serão "setados" como ativos
    GPIO.out_w1ts = mask;
    //Máscara de bits com os pinos que serão desativados (clear)
    GPIO.out_w1tc = ~mask;

    //Delay de 1 segundo
    delay(1000);
}


Teste de velocidade digitalWrite

void setup()
{
    pinMode(4, OUTPUT);
}

void loop()
{
    digitalWrite(4, HIGH);
    digitalWrite(4, LOW);
}

Teste de velocidade Máscara de bits

void setup()
{
    //Configuração dos gpios
    gpio_config_t io_conf;

    //Colocamos como OUTPUT
    io_conf.mode = GPIO_MODE_OUTPUT;

    //Definição dos gpios que fazem parte desta configuração
    io_conf.pin_bit_mask = 0b10000;

    //Aplica a configuração
    gpio_config(&io_conf);
}

void loop()
{
    //Máscara de bits com os pinos que serão "setados" como ativos
    GPIO.out_w1ts = 0b10000;
    //Máscara de bits com os pinos serão desativados (clear)
    GPIO.out_w1tc = 0b10000;
}


Resultado Teste de velocidade digitalWrite




Resultado Teste de velocidade máscara GPIO





FAÇA O DOWNLOAD DOS ARQUIVOS





Postar um comentário

2 Comentários

  1. Esse método é mais rápido do que as macros disponíveis ?
    REG_WRITE(GPIO_OUT_W1TS_REG, BIT2);//GPIO2 HIGH (set)
    REG_WRITE(GPIO_OUT_W1TC_REG, BIT2);//GPIO2 LOW (clear)

    ResponderExcluir