Registradores – ESP32

Com o sucesso gigantesco do ESP32 que veio para bater de frente dos PIC32 e STM32, ganhando em alguns aspectos como velocidade, não podemos deixar de lado a manipulação de registradores que não estavam presentes, de maneira fácil, no ESP8266. Neste tutorial, vamos aprender a manipular os registradores de porta (GPIO) do ESP32 de forma simples para efetuar um Blink extremamente compacto e o mais rápido possível.

O que são registradores em um microcontrolador?

São pequenos endereços de memória que nos permitem, via software, controlar pinos, processos, interrupções e coisas do tipo de forma extremamente eficiente. Podemos dizer que isso se assemelha ao assembly, visto que é um dos itens de mais baixo nível que conseguimos controlar diretamente pelo código e com isso temos uma eficiente forma de programação em questão de velocidade e confiança.

O ESP32 conta com centenas de registradores de 32bits para que possamos manipular com eficiência todo o hardware disponível, todas as informações estão disponíveis no Datasheet que estará ao fim deste tutorial.

Observação importante: em alguns casos de registradores como o correspondente ao famoso “pinMode()” que declara um pino como saída por exemplo, há mais de um registrador que faz essa mesma tarefa e também mais formas de escrever ou ler registradores, entretanto, sobre os registradores, usaremos os registradores atômicos, que nos garantem a escrita ordenada em um ambiente Triple-Core.

 


Mãos a obra – Piscando um LED através da manipulação de registradores

Componentes necessários

Código do projeto

Colocando para funcionar


Entendendo a fundo

Software

Quem esta acostumado com registradores pode estranhar esse jeito de manipula-los, parecendo muito mais fácil do que em outros microcontroladores. A verdade é que “REG_WRITE” é uma macro para facilitar a manipulação dos registradores que é definida no arquivo “soc.h”, lá você também encontra macros como REG_READ que é usada para leitura de registradores, REG_SET_FIELD e etc.

Os três registradores usados são:

  • GPIO_ENABLE_REG (Figura 1): Registrador que habilita o GPIO(0-31) como saída.
  • GPIO_OUT_W1TS_REG (Figura 2): Registrador que define o GPIO(0-31) em HIGH (Vcc). (SET)
  • GPIO_OUT_W1TC_REG (Figura 3): Registrador que define o GPIO(0-31) em LOW (GND). (CLEAR)

 

Figura 1 – GPIO_ENABLE_REG

 

Figura 2 – GPIO_OUT_W1TS_REG

 

Figura 3 – GPIO_OUT_W1TC_REG

 

Uma forma bem comum de se utilizar registradores para pinos, é a manipulação direta (nesse caso a 32 bits, logo, 32 pinos) de uma única vez em uma linha! Com isso é possível economizar varias linhas e também deixar o código mais rápido. Se você pretende definir dois pinos como saída, a sentença ficará dessa forma (serve para os outros registradores também):

Esses são os registradores básicos para manipular um pino de saída, se você pretende ler pinos de entrada, terá que usar outros registradores que estão detalhados no Datasheet.

 

Observação: alguns registradores não estão com os nomes definidos nos arquivos do ESP32, logo, você não conseguirá manipular o registrador pelo nome (igual feito acima com GPIO_ENABLE_OUT e etc). Para manipular os registradores que não estão definidos, é necessário pegar o endereço do registrador na memória que se encontra no Datasheet. Veja como ficaria a manipulação sem o nome definido:

 

Figura 4 – Endereço dos registradores.

 


Considerações finais

Manipulando diretamente os registradores, conseguimos fazer tarefas com uma extrema velocidade e confiança, sendo necessária para vários projetos. Leia bem o Datasheet se você pretende dominar este incrível microcontrolador e boa sorte com os registradores.

Referências

Todos os registradores, informações e detalhes sobre o ESP32 se encontram nesse Datasheet:

http://espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf

Estudante de Engenharia da Computação pela USC, pretende se aprimorar e fazer a diferença nesta imensa área da tecnologia. Apaixonado por IoT, sistemas embarcados, microcontroladores e integração da computação nos mais diversos fins práticos e didáticos.