ESP32 Firmware (PlatformIO)

Développement de firmware ESP32 avec PlatformIO – Arduino (principal) et ESP-IDF (via PlatformIO ou en composant Arduino) pour les séries ESP32, S2, S3, C3, C6. Couvre la configuration et les APIs.

Qu'est-ce que ESP32 Firmware (PlatformIO) ?

Cette compétence est dédiée à toutes les étapes du développement de firmware sur microcontrôleurs ESP32 (incluant ESP32-S3, S2, C3, C6) en utilisant PlatformIO comme environnement de build central. Elle traite à la fois l'IDE Arduino (framework principal) et le SDK ESP-IDF officiel (utilisable seul ou en combo avec Arduino). Elle vous guide dans l'identification précise de votre variante de puce (module, flash, PSRAM), le choix du bon framework, et la configuration de `platformio.ini` pour éviter les pièges classiques : mauvaise version du core Arduino (2.x vs 3.x qui brisent la compatibilité), broches de strapping ou de flash/mémoire qui empêchent le boot, et limitations du convertisseur ADC2 avec le Wi-Fi. Elle fournit des règles claires pour ne pas bloquer le watchdog, écrire des ISR efficaces en environnement dual-core, gérer la mémoire (fragmentation du heap, PSRAM, pile des tâches en octets), et éviter l'usure de la flash NVS. Elle couvre aussi le build, le flash par USB/série, le moniteur série avec decodeur d'exceptions, l'interprétation des panics Guru Meditation, des reboots Brownout, des boot loops, et les tâches FreeRTOS / gestion des réveils. Enfin, elle prévient les opérations irréversibles (eFuse, secure boot, encryption) et s'appuie sur des fichiers de référence dédiés (brochage, setup platformio, debug, RTOS, connectivité). Elle doit être utilisée conjointement avec la compétence 'embedded-c-cpp' pour les bonnes pratiques générales C/C++, les tests et l'architecture.

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

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Firmware ESP32 (PlatformIO : Arduino d'abord, ESP-IDF si nécessaire)

Chargez également embedded-c-cpp pour les standards de codage, l'architecture, les tests unitaires et le débogage général. Cette compétence contient les parties spécifiques à l'ESP32.

D'abord, identifier le projet

TrouvezOùPourquoi c'est important
Puce et module exacts (ESP32-WROOM-32E, ESP32-S3-WROOM-1-N16R8, ESP32-C3-MINI-1...)platformio.ini board =, utilisateur, sérigraphie de la carteCœurs, broches, PSRAM, USB, ADC diffèrent beaucoup entre variantes
Frameworkframework = arduino, espidf, ou arduino, espidfModèle d'API et de configuration
Version du core Arduino (2.x ou 3.x)Ligne du log de build framework-arduinoespressif32 @ x.y.z, ligne platform =, ou ESP_ARDUINO_VERSION_MAJORPlusieurs APIs ont changé en 3.x (LEDC, timers) — du code écrit pour la mauvaise version ne compilera pas
Taille flash / PSRAMnom du module (N16R8 = 16 Mo flash, 8 Mo PSRAM octal), board_upload.flash_sizePartitions, placement mémoire
Câblage de la carteutilisateur / schémaÉviter les broches de strapping et celles utilisées par flash/PSRAM/USB/LEDs

Si la variante est inconnue et que la tâche touche aux broches, périphériques, alimentation ou mémoire, trouvez-la avant d'écrire du code — une broche qui fonctionne sur un S3 peut empêcher un ESP32 classique de démarrer.

Arduino ou ESP-IDF ?

Restez avec Arduino (par défaut)Passez à ESP-IDF (dans PlatformIO : framework = espidf) ou Arduino + IDF (framework = arduino, espidf)
Prototypes et la plupart des produitsBesoin de modifier les options sdkconfig que le core précompilé d'Arduino n'expose pas (OTA rollback, secure boot, flash encryption, PM auto light-sleep, core-dump-to-flash, paramètres FreeRTOS)
Beaucoup de bibliothèques disponiblesDernières fonctionnalités IDF, contrôle fin de la mémoire/performance
Itération rapideDurcissement pour la production

Arduino sur ESP32 fonctionne déjà sur FreeRTOS + ESP-IDF, donc les APIs IDF (esp_*, xTaskCreatePinnedToCore, nvs_*, esp_sleep_*, heap_caps_*) sont utilisables depuis du code Arduino. "Arduino as IDF component" (arduino, espidf) conserve les bibliothèques Arduino et ajoute le contrôle de sdkconfig — c'est la voie de migration habituelle.

Configuration, modèles platformio.ini et modifications d'API 2.x vs 3.x : references/platformio-setup.md.

Règles qui évitent les échecs classiques de l'ESP32

  1. Broches : n'utilisez jamais les broches flash (GPIO6–11 sur ESP32), les broches PSRAM (16/17 sur WROVER ; 33–37 sur modules S3 à PSRAM octal) ou les broches USB lorsqu'on utilise l'USB ; traitez les broches de strapping (ESP32 : 0, 2, 5, 12, 15) comme "uniquement avec précaution" — GPIO12 tirée haut au boot empêche les modules flash 3,3 V de démarrer. L'ADC2 ne fonctionne pas lorsque le Wi-Fi est activé (ESP32 classique) : utilisez les broches ADC1. Tableaux complets par variante : references/pins-and-variants.md.
  2. Ne bloquez pas loop() ou une tâche pour toujours : les longues boucles while sans delay()/vTaskDelay() déclenchent le watchdog de tâche ; while (WiFi.status() != WL_CONNECTED) doit avoir un timeout.
  3. ISR : marquez IRAM_ATTR, gardez-les minuscules, pas de Serial.print, pas de delay, pas d'appels Wi-Fi ; déléguez le travail à une tâche (file d'attente / notification de tâche / drapeau). Variables partagées volatile + section critique (portENTER_CRITICAL_ISR spinlock — l'ESP32 est dual-core).
  4. Les piles de tâches sont en octets dans ESP-IDF/Arduino (contrairement aux mots du FreeRTOS standard). Mesurez avec uxTaskGetStackHighWaterMark(NULL) (octets). La pile de loop() Arduino fait 8 Ko par défaut (SET_LOOP_TASK_STACK_SIZE(16 * 1024); pour changer).
  5. Alimentation : la transmission Wi-Fi tire des pics de ~300–500 mA. "Brownout detector was triggered" signifie qu'il faut corriger l'alimentation (régulateur, condensateur de découplage, câble) — ne désactivez pas le détecteur de brownout.
  6. Heap : évitez la concaténation de String dans des boucles et les new/malloc fréquents (fragmentation au fil des jours) ; préallouez. Vérifiez ESP.getFreeHeap() / heap_caps_get_minimum_free_size(MALLOC_CAP_8BIT) au fil du temps.
  7. Usure NVS/flash : n'écrivez pas Preferences/NVS à chaque itération de boucle ; écrivez uniquement lors d'un changement, avec limitation de débit.
  8. Opérations irréversibles : le grillage d'eFuse, le secure boot, le chiffrement de la flash en mode release sont permanents. N'exécutez jamais espefuse.py burn_*, n'activez pas ces options dans sdkconfig, et n'exécutez pas erase_flash sur un appareil contenant des données, sans confirmation explicite de l'utilisateur.

Build, upload, moniteur (PlatformIO)

pio run -e <env>                       # build
pio run -e <env> -t upload             # flash par USB/série
pio device monitor -e <env>            # moniteur série (utilise monitor_speed / monitor_filters)
pio run -e <env> -t upload -t monitor  # les deux
pio run -e <env> -t uploadfs           # upload du dossier data/ en tant qu'image LittleFS/SPIFFS
pio run -e <env> -t erase              # efface toute la flash (demande d'abord : efface NVS/infos Wi-Fi)
pio run -e <env> -t menuconfig         # ESP-IDF / arduino+espidf uniquement
pio test -e native                     # tests unitaires hôte (voir embedded-c-cpp)

L'upload échoue avec "Failed to connect / Wrong boot mode detected" → maintenez BOOT (GPIO0 / GPIO9 sur C3), appuyez sur EN/RST, relâchez BOOT ; vérifiez que le câble transporte les données ; fermez toute autre fenêtre de moniteur série qui occupe le port. Confirmez que la carte est connectée et quel port avant d'uploader (pio device list).

En cas de crash ou redémarrage

La sortie série que l'utilisateur peut coller est l'élément de preuve clé. Activez monitor_filters = esp32_exception_decoder et build_type = debug pour que les backtraces soient décodées en fichier:ligne. Consultez ensuite references/panics-and-debug.md pour : les types Guru Meditation (LoadProhibited, StoreProhibited, IllegalInstruction, défaut d'accès Load/Store sur RISC-V), le stack canary, le watchdog de tâche/interruption, les codes rst:, le brownout, les boot loops, le débogage JTAG (debug_tool = esp-builtin sur S3/C3/C6).

Fichiers de référence

FichierLire quand
references/platformio-setup.mdCréer/réparer platformio.ini, choisir la plateforme/version du core, modifications API Arduino 2.x→3.x, PSRAM, USB-CDC série, partitions et système de fichiers, utiliser ESP-IDF dans PlatformIO, sdkconfig
references/pins-and-variants.mdChoisir ou vérifier des broches, comparer ESP32/S2/S3/C3/C6, ADC, touch, broches de réveil en deep-sleep
references/rtos-memory-power.mdTâches, cœurs, ISR, files d'attente, watchdog, pile/heap/PSRAM, IRAM, sommeil profond/léger, batterie
references/panics-and-debug.mdTout crash, reset, watchdog, brownout, boot loop, échec d'upload, débogage JTAG, core dumps, raison du reset
references/connectivity-ota-security.mdRobustesse Wi-Fi/BLE, NVS/Preferences, mises à jour OTA et rollback, décisions sur secure boot / chiffrement de la 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 associés