Aula 04 - Entradas e Saídas Digitais (GPIO) e Circuitos de Interface ⚙️
Objetivo Pedagógico
Objetivo: Modos de operação de GPIO (Input, Output Push-Pull, Open-Drain). Resistores internos de pull-up/down e técnicas de debouncing de chaves mecânicas.
📑 1. Fundamentos Teóricos & Conceituação
Modos de operação de GPIO (Input, Output Push-Pull, Open-Drain). Resistores internos de pull-up/down e técnicas de debouncing de chaves mecânicas. Em projetos de engenharia eletrônica e sistemas computacionais embarcados, a precisão temporal, a contenção de recursos de memória e a confiabilidade contínua são requisitos mandatórios de projeto.
📐 Arquitetura Conceitual & Fluxo de Operação
graph TD
A["Entrada / Periféricos"] --> B["Entradas e Saídas Digitais (GPIO) e Circuitos de Interface"]
B --> C["Processamento e Validação"]
C --> D["Saída / Atuador / Rede"]
style A fill:#e3f2fd,stroke:#1565c0
style B fill:#fff3e0,stroke:#e65100,stroke-width:2px
style C fill:#e8f5e9,stroke:#2e7d32
style D fill:#f3e5f5,stroke:#7b1fa2 🔍 Pilares e Princípios de Engenharia
Nesta unidade, exploramos detalhadamente os seguintes conceitos: - Push-Pull: Requisito essencial para garantir operação determinística e estável. - Open-Drain: Requisito essencial para garantir operação determinística e estável. - Pull-Up / Pull-Down: Requisito essencial para garantir operação determinística e estável. - Debounce Hardware e Software: Requisito essencial para garantir operação determinística e estável. - Acoplamento Óptico: Requisito essencial para garantir operação determinística e estável.
🛠️ 2. Implementação Técnica & Código em C/C++
Abaixo está o exemplo prático estruturado de acordo com as normas de desenvolvimento bare-metal / FreeRTOS para a família estudada:
// Leitura de botão com debouncing temporal em software
#include <stdint.h>
#include <stdbool.h>
bool button_read_debounced(uint32_t current_time_ms) {
static uint32_t last_debounce_time = 0;
static bool last_state = true;
static bool button_state = true;
bool reading = gpio_get_level(PIN_BUTTON);
if (reading != last_state) {
last_debounce_time = current_time_ms;
}
if ((current_time_ms - last_debounce_time) > 50) {
if (reading != button_state) {
button_state = reading;
}
}
last_state = reading;
return (button_state == false); // Pressionado (Pull-up ativo em LOW)
}
💡 Análise Passo a Passo do Código
- Configuração de Registradores / Drivers: O hardware é parametrizado antes da ativação das interrupções globais.
- Tratamento Seguro: Utilização de tipos com largura fixa (
uint8_t,uint32_t) da biblioteca<stdint.h>para garantir portabilidade entre arquiteturas de 8, 16 e 32 bits. - Eficiência e Baixo Consumo: Minimização de ciclos de clock desperdiçados e liberação do barramento para outros periféricos.
🎯 3. Próximos Passos & Sequência Prática
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto