firmware-esp32

Firmware para ESP32 com PlatformIO — framework Arduino (principal) e ESP-IDF (também via PlatformIO, ou Arduino como componente IDF) — para ESP32, S2, S3, C3, C6. Cobre configuração platformio.ini, diferenças de API Arduino core 2.x vs 3.x, seleção segura de pinos (strapping/flash/PSRAM/ADC2), tarefas FreeRTOS e ISRs, memória/PSRAM, Wi-Fi/BLE, NVS/Preferences, OTA, deep sleep, partições, gravação via USB/serial, decodificação de panics Guru Meditation e loops de boot. Use esta skill sempre que o usuário trabalhar em qualquer placa ESP32 / ESP32-S3 / C3 / C6, platformio.ini com espressif32, sketches Arduino para ESP32, idf.py/sdkconfig, ou colar saída serial ESP32 (rst:, Guru Meditation, Brownout, watchdog) — mesmo se disser apenas "a placa reinicia" ou "o upload falha". Use em conjunto com embedded-c-cpp para qualidade geral de C/C++, testes e arquitetura.

O que é firmware-esp32?

Esta skill oferece orientação especializada para desenvolvimento de firmware ESP32 usando PlatformIO, com foco principal no framework Arduino, mas também suporte completo ao ESP-IDF (inclusive Arduino como componente IDF). Ela aborda desde a configuração básica do platformio.ini até tópicos avançados como diferenças entre Arduino core 2.x e 3.x (que impactam APIs de periféricos como LEDC e timers), seleção segura de pinos (evitando pinos de flash, PSRAM, strapping e ADC2), gerenciamento de tarefas FreeRTOS (com atenção a tamanhos de pilha em bytes, correção em ISRs e watchdog), uso de PSRAM, Wi-Fi/BLE, NVS/Preferences, OTA, deep sleep e partições. A skill também fornece decodificação detalhada de saídas de erro como Guru Meditation, panics RISC-V, brownout e loops de boot, além de comandos práticos de build/upload/monitor do PlatformIO. Ela é ideal para prototipagem rápida com Arduino e para migração para produção com ESP-IDF, cobrindo desde S3 com PSRAM octal até C3 de baixo custo, sempre com ênfase em evitar as falhas clássicas de hardware (pinos bloqueados, alimentação insuficiente, gravação eFuse irreversível) e de software (bloqueio de loop, fragmentação de heap, desgaste de flash).

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/budenga/firmware-skills/tree/HEAD/skills/esp32-firmware

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Firmware ESP32 (PlatformIO: Arduino primeiro, ESP-IDF quando necessário)

Carregue também embedded-c-cpp para padrões de codificação, arquitetura, testes unitários e depuração geral. Esta skill contém as partes específicas do ESP32.

Primeiro, identifique o projeto

EncontrarOndePor que importa
Chip e módulo exatos (ESP32-WROOM-32E, ESP32-S3-WROOM-1-N16R8, ESP32-C3-MINI-1...)platformio.ini board =, usuário, serigrafia da placaCores, pinos, PSRAM, USB, ADC diferem muito entre variantes
Frameworkframework = arduino, espidf, ou arduino, espidfAPI e modelo de configuração
Versão do Arduino core (2.x ou 3.x)linha do log de build framework-arduinoespressif32 @ x.y.z, linha platform =, ou ESP_ARDUINO_VERSION_MAJORVárias APIs mudaram na 3.x (LEDC, timers) — código escrito para a versão errada não compila
Tamanho de Flash / PSRAMnome do módulo (N16R8 = 16 MB flash, 8 MB octal PSRAM), board_upload.flash_sizePartições, alocação de memória
Conexões da placausuário/esquemáticoEvitar pinos strapping e pinos usados por flash/PSRAM/USB/LEDs

Se a variante for desconhecida e a tarefa envolver pinos, periféricos, alimentação ou memória, descubra antes de escrever código — um pino que funciona em um S3 pode impedir um ESP32 clássico de inicializar.

Arduino ou ESP-IDF?

Fique com Arduino (padrão)Migre para ESP-IDF (no PlatformIO: framework = espidf) ou Arduino + IDF (framework = arduino, espidf)
Protótipos e maioria dos produtosNecessidade de alterar opções do sdkconfig que o core pré-compilado do Arduino não expõe (rollback OTA, secure boot, flash encryption, PM auto light-sleep, core-dump-to-flash, configurações do FreeRTOS)
Muitas bibliotecas disponíveisÚltimos recursos do IDF, controle rígido de memória/desempenho
Iteração rápidaEndurecimento para produção

O Arduino no ESP32 já executa sobre FreeRTOS + ESP-IDF, então APIs do IDF (esp_*, xTaskCreatePinnedToCore, nvs_*, esp_sleep_*, heap_caps_*) funcionam a partir do código Arduino. "Arduino como componente IDF" (arduino, espidf) mantém as bibliotecas Arduino e adiciona controle do sdkconfig — o caminho usual de migração.

Configuração, templates de platformio.ini e mudanças de API 2.x vs 3.x: references/platformio-setup.md.

Regras que evitam as falhas clássicas do ESP32

  1. Pinos: nunca use pinos de flash (GPIO6–11 no ESP32), pinos de PSRAM (16/17 no WROVER; 33–37 em módulos S3 octal-PSRAM) ou pinos USB ao usar USB; trate pinos strapping (ESP32: 0, 2, 5, 12, 15) como "apenas com cuidado" — GPIO12 puxado alto no boot faz módulos flash 3,3 V falharem ao inicializar. ADC2 não funciona enquanto o Wi-Fi estiver ligado (ESP32 clássico): use pinos ADC1. Tabelas completas por variante: references/pins-and-variants.md.
  2. Não bloqueie loop() ou uma tarefa para sempre: loops while longos sem delay()/vTaskDelay() disparam o watchdog de tarefa; while (WiFi.status() != WL_CONNECTED) precisa de um timeout.
  3. ISRs: marque com IRAM_ATTR, mantenha-as pequenas, sem Serial.print, sem delay, sem chamadas Wi-Fi; passe o trabalho para uma tarefa (fila / notificação de tarefa / flag). Variáveis compartilhadas volatile + seção crítica (portENTER_CRITICAL_ISR spinlock — o ESP32 é dual-core).
  4. Pilhas de tarefas são em bytes no ESP-IDF/Arduino (diferente do FreeRTOS vanilla em palavras). Meça com uxTaskGetStackHighWaterMark(NULL) (bytes). O loop() do Arduino tem 8 KB por padrão (SET_LOOP_TASK_STACK_SIZE(16 * 1024); para alterar).
  5. Fonte de alimentação: a transmissão Wi-Fi consome picos de ~300–500 mA. "Brownout detector was triggered" significa corrigir a alimentação (regulador, capacitor de desacoplamento, cabo) — não desabilite o detector de brownout.
  6. Heap: evite concatenação de String em loops e new/malloc frequentes (fragmentação ao longo de dias); pré-aloque. Verifique ESP.getFreeHeap() / heap_caps_get_minimum_free_size(MALLOC_CAP_8BIT) ao longo do tempo.
  7. Desgaste de NVS/flash: não grave Preferences/NVS em toda iteração do loop; grave apenas quando houver mudança, com limitação de taxa.
  8. Operações irreversíveis: gravação de eFuse, secure boot, flash encryption em modo release são permanentes. Nunca execute espefuse.py burn_*, habilite estas opções no sdkconfig, ou erase_flash em um dispositivo com dados, sem confirmação explícita do usuário.

Build, upload, monitor (PlatformIO)

pio run -e <env>                       # build
pio run -e <env> -t upload             # gravar via USB/serial
pio device monitor -e <env>            # monitor serial (usa monitor_speed / monitor_filters)
pio run -e <env> -t upload -t monitor  # ambos
pio run -e <env> -t uploadfs           # gravar pasta data/ como imagem LittleFS/SPIFFS
pio run -e <env> -t erase              # apagar flash inteiro (pergunta primeiro: apaga NVS/credenciais Wi-Fi)
pio run -e <env> -t menuconfig         # apenas ESP-IDF / arduino+espidf
pio test -e native                     # testes unitários no host (veja embedded-c-cpp)

O upload falha com "Failed to connect / Wrong boot mode detected" → segure BOOT (GPIO0 / GPIO9 no C3), toque EN/RST, solte BOOT; verifique se o cabo transporta dados; feche qualquer outro monitor serial que esteja segurando a porta. Confirme se a placa está conectada e qual porta antes de fazer upload (pio device list).

Quando trava ou reinicia

A saída serial copiável é a evidência chave. Ative monitor_filters = esp32_exception_decoder e build_type = debug para que os backtraces sejam decodificados para arquivo:linha. Então veja references/panics-and-debug.md para: tipos de Guru Meditation (LoadProhibited, StoreProhibited, IllegalInstruction, Load/Store access fault no RISC-V), stack canary, watchdog de tarefa/interrupção, códigos rst:, brownout, loops de boot, depuração com JTAG (debug_tool = esp-builtin no S3/C3/C6).

Arquivos de referência

ArquivoLeia quando
references/platformio-setup.mdCriando/consertando platformio.ini, escolhendo plataforma/versão do core, mudanças de API Arduino 2.x→3.x, PSRAM, USB-CDC serial, partições e sistema de arquivos, usando ESP-IDF no PlatformIO, sdkconfig
references/pins-and-variants.mdEscolhendo ou revisando pinos, comparando ESP32/S2/S3/C3/C6, ADC, touch, pinos de wake de deep sleep
references/rtos-memory-power.mdTarefas, cores, ISRs, filas, watchdog, pilha/heap/PSRAM, IRAM, deep/light sleep, bateria
references/panics-and-debug.mdQualquer travamento, reset, watchdog, brownout, loop de boot, falha de upload, depuração JTAG, core dumps, motivo do reset
references/connectivity-ota-security.mdRobustez de Wi-Fi/BLE, NVS/Preferences, atualizações OTA e rollback, secure boot / flash encryption

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

pic-firmware

Microchip PIC and dsPIC firmware with MPLAB X IDE, XC8 / XC16 / XC-DSC / XC32 compilers and MPLAB Code Configurator (MCC Melody/Classic) for PIC16, PIC18, PIC24, dsPIC33 (F/EP/EV/CK/CH dual-core/A) and PIC32 — configuration bits, oscillator/PLL, TRIS/LAT/PORT/ANSEL, PPS, interrupts per family, 8/16-bit atomicity and hardware-stack limits, dsPIC DSP engine and Q15 fixed-point, high-speed PWM/ADC control loops, motor control and digital power, XC8 memory and optimization, headless builds, programming and debugging with PICkit 4/5, MPLAB Snap and ICD (ipecmd), reset causes and traps. Use this skill whenever the user mentions any PIC or dsPIC part (PIC16F, PIC18F, PIC24F, dsPIC33EP/CK/CH, PIC32MX/MZ), MPLAB X, MCC, XC8/XC16/XC-DSC/XC32, PICkit, Snap, ICD, `#pragma config`, motorBench, or a .X project folder — even for a short question like "o pino não lê nada no PIC" or "o meu controlo PI no dsPIC oscila". Use together with embedded-c-cpp for general C quality, testing and arc...

stm32-firmware

STM32 firmware development with STM32CubeMX / STM32CubeIDE + HAL/LL and with PlatformIO — project structure and USER CODE rules, peripherals (UART/I2C/SPI/ADC/timers/DMA), clocks, low power, flash/option bytes, building from the command line, flashing and debugging with ST-Link (STM32CubeProgrammer CLI, OpenOCD, GDB, SWV), and HardFault analysis. Use this skill whenever the user works on any STM32 / Nucleo / Discovery / Blue Pill board, a `.ioc` file, CubeMX/CubeIDE, HAL_ functions, ST-Link, or sees a HardFault — even if they just say "o meu STM32 não arranca" or paste a HAL call. Use together with embedded-c-cpp for general C/C++ quality, testing and architecture.

Habilidades Relacionadas