Manipulando os registradores - ESP32
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.
[toc]
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
- 1x - ESP32.
- 1x - LED (usaremos o LED Onboard).
Código do projeto
void setup() { REG_WRITE(GPIO_ENABLE_REG, BIT2);//Define o GPIO2 como saída } void loop() { REG_WRITE(GPIO_OUT_W1TS_REG, BIT2);//GPIO2 HIGH (set) delay(250); REG_WRITE(GPIO_OUT_W1TC_REG, BIT2);//GPIO2 LOW (clear) delay(250); }
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)
Uma forma bem comum de se utilizar registradores para pinos, é a manipulação direta (nesse caso há 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):
REG_WRITE(GPIO_ENABLE_REG, BIT2 + BIT4);//Define o GPIO2 e GPIO4 como saída
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:
REG_WRITE(0x3ff44020, BIT2);//Define o GPIO2 como saída while (1) { REG_WRITE(0x3ff44008, BIT2);//GPIO2 = HIGH delay(250); REG_WRITE(0x3ff4400C, BIT2);//GPIO2 = LOW delay(250); }
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