Community程式設計與開發github.com

ESP32韌體 (PlatformIO:Arduino優先,必要時用ESP-IDF)

針對ESP32、S2、S3、C3、C6系列晶片的PlatformIO韌體開發技能,涵蓋Arduino框架(主要)與ESP-IDF(以PlatformIO元件或Arduino元件形式),包含platformio.ini設定、API差異、腳位選擇、FreeRTOS、記憶體、Wi-Fi/BLE、OTA、深眠、分割區、燒錄、崩潰診斷等。

ESP32韌體 (PlatformIO:Arduino優先,必要時用ESP-IDF) 是什麼?

此技能專為使用PlatformIO開發ESP32、ESP32-S2、S3、C3、C6系列晶片的使用者設計。其核心目標是協助開發者有效建立與除錯韌體,首選Arduino框架,必要時無縫切換至ESP-IDF。技能內容涵蓋完整的開發流程:從識別晶片型號、設定platformio.ini、避免經典的腳位衝突(如strapping pin、ADC2與Wi-Fi衝突),到使用FreeRTOS任務與ISR的技巧。此外,深度整合記憶體管理(PSRAM、堆疊、堆積)、電源供應注意事項、NVS/Preferences快閃記憶體磨損預防,以及不可逆操作(如eFuse燒錄)的安全提醒。當遇到崩潰或重啟時,技能提供詳細的診斷方法,包括Guru Meditation錯誤解碼、看門狗、布朗輸出、啟動迴圈等,並引用多份參考文件(如平台設定、腳位對照、RTOS記憶體/電源、除錯、連線/OTA/安全性)作為延伸支援。此技能應與`embedded-c-cpp`技能搭配,以確保整體C/C++程式碼品質、架構與測試。

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

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

ESP32韌體 (PlatformIO:Arduino優先,必要時用ESP-IDF) 是做什麼的?

同時載入 embedded-c-cpp 以取得編碼標準、架構、單元測試與一般除錯。此技能包含僅與ESP32相關的部分。

首先,識別專案

項目從何處取得為什麼重要
確切的晶片與模組(ESP32-WROOM-32E、ESP32-S3-WROOM-1-N16R8、ESP32-C3-MINI-1...)platformio.ini 中的 board =、使用者、電路板上的印刷標示核心、腳位、PSRAM、USB、ADC 在不同型號間差異很大
框架framework = arduino、espidf 或 arduino, espidfAPI 與設定模型
Arduino核心版本(2.x 或 3.x)建置紀錄中的 framework-arduinoespressif32 @ x.y.z、platform = 行,或 ESP_ARDUINO_VERSION_MAJOR3.x 中多個 API 已變更(LEDC、計時器)— 為錯誤版本寫的程式碼無法編譯
Flash / PSRAM 大小模組名稱(N16R8 = 16 MB Flash、8 MB 八位元 PSRAM)、board_upload.flash_size分割區、記憶體佈局
電路板接線使用者/電路圖避免使用 strapping 腳位、以及被Flash/PSRAM/USB/LED使用的腳位

若型號未知且任務涉及腳位、周邊、電源或記憶體,請在撰寫程式碼前先確認——在S3上沒問題的腳位,可能使經典ESP32無法啟動。

Arduino 還是 ESP-IDF?

預設使用 Arduino轉用 ESP-IDF(PlatformIO中:framework = espidf)或 Arduino + IDF(framework = arduino, espidf)
原型設計與多數產品需要修改 Arduino 預編譯核心未開放的 sdkconfig 選項(回滾OTA、安全開機、Flash加密、PM自動輕眠、核心傾印至Flash、FreeRTOS設定)
有大量可用程式庫最新的 IDF 功能、對記憶體/效能的精細控制
快速迭代生產環境強化

ESP32 上的 Arduino 本質上已在 FreeRTOS + ESP-IDF 上運行,因此 IDF API(esp_*、xTaskCreatePinnedToCore、nvs_*、esp_sleep_*、heap_caps_*)可以直接在 Arduino 程式碼中使用。「Arduino 作為 IDF 元件」(arduino, espidf)可以同時保有 Arduino 程式庫並增加 sdkconfig 控制——這是一般的遷移路徑。

設定、platformio.ini 範本以及 2.x 與 3.x 的 API 變更請參考:references/platformio-setup.md。

避免經典 ESP32 故障的規則

  1. 腳位:絕不使用 Flash 腳位(ESP32上的GPIO6–11)、PSRAM腳位(WROVER上的16/17;S3八位元PSRAM模組的33–37)或使用USB時的USB腳位;將 strapping 腳位(ESP32:0、2、5、12、15)視為「謹慎使用」—— GPIO12在開機時被拉高會使3.3V Flash模組無法開機。Wi-Fi開啟時ADC2無法正常工作(經典ESP32):請使用ADC1腳位。各型號的完整腳位對照表:references/pins-and-variants.md。
  2. 不要阻塞 loop() 或一個任務太久:長時間的 while 迴圈中沒有 delay()/vTaskDelay() 會觸發看門狗;while (WiFi.status() != WL_CONNECTED) 必須加上超時機制。
  3. 中斷服務常式(ISR):標記為 IRAM_ATTR,保持極簡,禁止使用 Serial.print、delay、Wi-Fi呼叫;將工作交由任務處理(佇列 / 任務通知 / 旗標)。共用變數需使用 volatile + 臨界區段(portENTER_CRITICAL_ISR 自旋鎖——ESP32是雙核心)。
  4. 任務堆疊單位為位元組:在ESP-IDF/Arduino中(不同於標準FreeRTOS的“字”)。使用 uxTaskGetStackHighWaterMark(NULL)(位元組)測量。Arduino loop() 預設堆疊大小為8 KB(使用 SET_LOOP_TASK_STACK_SIZE(16 * 1024); 可變更)。
  5. 電源供應:Wi-Fi發射時峰值電流約300–500 mA。「檢測到布朗輸出」表示電源供應有問題(穩壓器、大電容、傳輸線)——請不要停用布朗輸出檢測器。
  6. 堆積:避免在迴圈中進行 String 拼接以及頻繁的 new/malloc(導致長時間累積的記憶體碎片);應預先配置。定期檢查 ESP.getFreeHeap() / heap_caps_get_minimum_free_size(MALLOC_CAP_8BIT)。
  7. NVS/Flash磨損:不要在每次迴圈疊代中都寫入 Preferences/NVS;應在有變更且有限速時才寫入。
  8. 不可逆操作:eFuse燒錄、安全開機、生產模式的Flash加密都是永久性的。未經使用者明確確認,絕不執行 espefuse.py burn_*、在 sdkconfig 中啟用這些功能,或對含有資料的裝置執行 erase_flash。

建置、上傳、監控(PlatformIO)

pio run -e <env>                       # 建置
pio run -e <env> -t upload             # 透過 USB/序列埠燒錄
pio device monitor -e <env>            # 序列監控(使用 monitor_speed / monitor_filters 設定)
pio run -e <env> -t upload -t monitor  # 同時進行
pio run -e <env> -t uploadfs           # 將 data/ 目錄上傳為 LittleFS/SPIFFS 映像
pio run -e <env> -t erase              # 清除整個 Flash(會先詢問:抹除 NVS/Wi-Fi 憑證)
pio run -e <env> -t menuconfig         # 僅限 ESP-IDF / arduino+espidf
pio test -e native                     # 主機端單元測試(請參考 embedded-c-cpp)

上傳失敗顯示「Failed to connect / Wrong boot mode detected」→ 按住 BOOT (GPIO0 / C3上為GPIO9),輕按 EN/RST,放開 BOOT;檢查傳輸線是否支援資料傳輸;關閉任何佔用該序列埠的監控程式。在上傳前確認電路板已連接且知道連接埠(pio device list)。

當發生崩潰或重啟時

可貼上的序列輸出是關鍵證據。啟用 monitor_filters = esp32_exception_decoder 和 build_type = debug,以便將回溯追蹤解碼為檔案:行號。然後參考 references/panics-and-debug.md 了解:Guru Meditation 類型(LoadProhibited、StoreProhibited、IllegalInstruction、RISC-V 上 Load/Store 存取錯誤)、堆疊金絲雀、任務/中斷看門狗、rst: 碼、布朗輸出、啟動迴圈、JTAG 除錯(S3/C3/C6 上使用 debug_tool = esp-builtin)。

參考文件

檔案何時閱讀
references/platformio-setup.md建立/修正 platformio.ini、選擇 platform/core 版本、Arduino 2.x→3.x API 變更、PSRAM、USB-CDC 序列埠、分割區與檔案系統、在 PlatformIO 中使用 ESP-IDF、sdkconfig
references/pins-and-variants.md選擇或審查腳位、比較 ESP32/S2/S3/C3/C6、ADC、觸控、深眠喚醒腳位
references/rtos-memory-power.md任務、核心、ISR、佇列、看門狗、堆疊/堆積/PSRAM、IRAM、深/輕睡眠、電池
references/panics-and-debug.md任何崩潰、重置、看門狗、布朗輸出、啟動迴圈、上傳失敗、JTAG 除錯、核心傾印、重置原因
references/connectivity-ota-security.mdWi-Fi/BLE 穩定性、NVS/Preferences、OTA 更新與回滾、安全開機 / 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.

相關技能