CommunityProgramación y desarrollogithub.com

firmware-esp32

Firmware para ESP32 con PlatformIO — Arduino framework (principal) y ESP-IDF (también dentro de PlatformIO, o Arduino como componente IDF) — para ESP32, S2, S3, C3, C6. Cubre la configuración de platformio.ini, diferencias de API entre Arduino core 2.x vs 3.x, selección segura de pines (pines de strapping/flash/PSRAM/ADC2), tareas FreeRTOS e ISR, memoria/PSRAM, Wi-Fi/BLE, NVS/Preferences, OTA, sueño profundo, particiones, flasheo por USB/serie, decodificación de Guru Meditation y bucles de arranque.

¿Qué es firmware-esp32?

Esta habilidad proporciona una guía completa para el desarrollo de firmware en microcontroladores ESP32 (incluyendo S2, S3, C3, C6) utilizando PlatformIO con el framework Arduino como opción principal y ESP-IDF cuando se necesita un control más fino. Es útil para desarrolladores que trabajan en proyectos de IoT, robótica y sistemas embebidos, cubriendo desde la selección de pines seguros (evitando pines de strapping, flash, PSRAM y ADC2 que interfieren con Wi-Fi) hasta la gestión avanzada de memoria, tareas FreeRTOS, ISR, comunicación Wi-Fi/BLE, NVS/Preferences, actualizaciones OTA, particiones y técnicas de depuración. Se aplica en el análisis de fallos como Guru Meditation, watchdog, brownout y bucles de arranque, así como en la resolución de problemas de flasheo. Funciona en cualquier sistema que use PlatformIO con la plataforma espressif32, y se complementa con la habilidad embedded-c-cpp para estándares de código C/C++ y pruebas unitarias. La habilidad también referencia archivos detallados para configuraciones de platformio.ini, pines, RTOS/memoria, depuración y conectividad/seguridad.

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

Installed? Explore more Programación y desarrollo skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Firmware ESP32 (PlatformIO: Arduino primero, ESP-IDF cuando sea necesario)

Cargue también embedded-c-cpp para estándares de codificación, arquitectura, pruebas unitarias y depuración general. Esta habilidad contiene las partes específicas de ESP32.

Primero, identifique el proyecto

EncontrarDóndePor qué es importante
Chip y módulo exactos (ESP32-WROOM-32E, ESP32-S3-WROOM-1-N16R8, ESP32-C3-MINI-1...)platformio.ini board =, usuario, serigrafía de la placaNúcleos, pines, PSRAM, USB, ADC difieren mucho entre variantes
Frameworkframework = arduino, espidf o arduino, espidfAPI y modelo de configuración
Versión del núcleo Arduino (2.x o 3.x)línea de registro de compilación framework-arduinoespressif32 @ x.y.z, línea platform =, o ESP_ARDUINO_VERSION_MAJORVarias APIs cambiaron en 3.x (LEDC, temporizadores) — el código escrito para la versión incorrecta no compilará
Tamaño de Flash / PSRAMnombre del módulo (N16R8 = 16 MB flash, 8 MB octal PSRAM), board_upload.flash_sizeParticiones, ubicación de memoria
Cableado de la placausuario/esquemáticoEvitar pines de strapping y pines usados por flash/PSRAM/USB/LEDs

Si la variante es desconocida y la tarea toca pines, periféricos, alimentación o memoria, averigüe antes de escribir código — un pin que funciona bien en un S3 puede impedir que un ESP32 clásico arranque.

¿Arduino o ESP-IDF?

Quédese con Arduino (predeterminado)Muévase a ESP-IDF (en PlatformIO: framework = espidf) o Arduino + IDF (framework = arduino, espidf)
Prototipos y la mayoría de productosNecesita cambiar opciones de sdkconfig que el núcleo precompilado de Arduino no expone (OTA con reversión, arranque seguro, cifrado de flash, PM auto light-sleep, volcado de núcleo a flash, ajustes de FreeRTOS)
Muchas bibliotecas disponiblesÚltimas características de IDF, control estricto de memoria/rendimiento
Iteración rápidaEndurecimiento de producción

Arduino en ESP32 ya se ejecuta sobre FreeRTOS + ESP-IDF, por lo que las APIs de IDF (esp_*, xTaskCreatePinnedToCore, nvs_*, esp_sleep_*, heap_caps_*) funcionan desde código Arduino. "Arduino como componente IDF" (arduino, espidf) mantiene las bibliotecas de Arduino y agrega control de sdkconfig — la ruta de migración habitual.

Configuración, plantillas de platformio.ini y cambios de API entre 2.x y 3.x: references/platformio-setup.md.

Reglas que previenen los fallos clásicos de ESP32

  1. Pines: nunca use pines de flash (GPIO6–11 en ESP32), pines de PSRAM (16/17 en WROVER; 33–37 en módulos S3 con PSRAM octal) o pines USB cuando use USB; trate los pines de strapping (ESP32: 0, 2, 5, 12, 15) como "solo con cuidado" — GPIO12 en alto al arrancar impide que los módulos con flash de 3.3 V arranquen. ADC2 no funciona mientras Wi-Fi está encendido (ESP32 clásico): use pines de ADC1. Tablas completas por variante: references/pins-and-variants.md.
  2. No bloquee loop() ni una tarea para siempre: bucles while largos sin delay()/vTaskDelay() disparan el watchdog de tareas; while (WiFi.status() != WL_CONNECTED) necesita un tiempo de espera.
  3. ISR: marque IRAM_ATTR, manténgalas pequeñas, sin Serial.print, sin delay, sin llamadas a Wi-Fi; pase el trabajo a una tarea (cola / notificación de tarea / bandera). Variables compartidas volatile + sección crítica (spinlock portENTER_CRITICAL_ISR — el ESP32 es de doble núcleo).
  4. Las pilas de tareas están en bytes en ESP-IDF/Arduino (a diferencia de FreeRTOS estándar que usa palabras). Mida con uxTaskGetStackHighWaterMark(NULL) (bytes). El loop() de Arduino tiene 8 KB por defecto (SET_LOOP_TASK_STACK_SIZE(16 * 1024); para cambiarlo).
  5. Fuente de alimentación: la transmisión Wi-Fi consume picos de ~300–500 mA. "Se disparó el detector de brownout" significa arreglar la fuente (regulador, condensador de desacoplo, cable) — no desactive el detector de brownout.
  6. Heap: evite la concatenación de String en bucles y los frecuentes new/malloc (fragmentación a lo largo de días); preasigne. Verifique ESP.getFreeHeap() / heap_caps_get_minimum_free_size(MALLOC_CAP_8BIT) con el tiempo.
  7. Desgaste de NVS/flash: no escriba Preferences/NVS en cada iteración del bucle; escriba solo cuando cambie, con limitación de velocidad.
  8. Operaciones irreversibles: quema de eFuse, arranque seguro, cifrado de flash en modo release son permanentes. Nunca ejecute espefuse.py burn_*, habilite estas opciones en sdkconfig, o use erase_flash en un dispositivo con datos, sin confirmación explícita del usuario.

Compilar, subir, monitor (PlatformIO)

pio run -e <env>                       # compilar
pio run -e <env> -t upload             # flashear por USB/serie
pio device monitor -e <env>            # monitor serie (usa monitor_speed / monitor_filters)
pio run -e <env> -t upload -t monitor  # ambos
pio run -e <env> -t uploadfs           # subir carpeta data/ como imagen LittleFS/SPIFFS
pio run -e <env> -t erase              # borrar todo el flash (pregunta primero: borra credenciales NVS/WiFi)
pio run -e <env> -t menuconfig         # solo ESP-IDF / arduino+espidf
pio test -e native                     # pruebas unitarias en host (ver embedded-c-cpp)

Si la subida falla con "Failed to connect / Wrong boot mode detected" → mantenga presionado BOOT (GPIO0 / GPIO9 en C3), pulse EN/RST, suelte BOOT; verifique que el cable soporte datos; cierre cualquier otro monitor serie que tenga ocupado el puerto. Confirme que la placa está conectada y el puerto antes de subir (pio device list).

Cuando se bloquea o reinicia

La salida serial pegable es la evidencia clave. Habilite monitor_filters = esp32_exception_decoder y build_type = debug para que los backtraces se decodifiquen a archivo:línea. Luego vea references/panics-and-debug.md para: tipos de Guru Meditation (LoadProhibited, StoreProhibited, IllegalInstruction, fallo de acceso Load/Store en RISC-V), stack canary, watchdog de tarea/interrupción, códigos rst:, brownout, bucles de arranque, depuración JTAG (debug_tool = esp-builtin en S3/C3/C6).

Archivos de referencia

ArchivoLeer cuando
references/platformio-setup.mdCrear/arreglar platformio.ini, elegir versión de plataforma/núcleo, cambios de API Arduino 2.x→3.x, PSRAM, USB-CDC serie, particiones y sistema de archivos, usar ESP-IDF en PlatformIO, sdkconfig
references/pins-and-variants.mdElegir o revisar pines, comparar ESP32/S2/S3/C3/C6, ADC, táctil, pines de despertar en sueño profundo
references/rtos-memory-power.mdTareas, núcleos, ISR, colas, watchdog, pila/heap/PSRAM, IRAM, sueño profundo/ligero, batería
references/panics-and-debug.mdCualquier bloqueo, reinicio, watchdog, brownout, bucle de arranque, fallo de subida, depuración JTAG, volcados de núcleo, motivo de reinicio
references/connectivity-ota-security.mdRobustez Wi-Fi/BLE, NVS/Preferences, actualizaciones OTA y reversión, arranque seguro / decisiones de cifrado de flash

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.

Skills relacionados