本文へ移動
cccskills
無料GitHub で公開

esp32c6-lcd147

Firmware development for the Waveshare ESP32-C6-LCD-1.47 board (ESP32-C6FH4, QFN32) — its 1.47" 172x320 ST7789 LCD, WS2812 RGB LED, microSD/TF slot, USB-Serial-JTAG console, Wi-Fi 6/BLE/802.15.4 radio, and the ESP-IDF + PlatformIO setup around them. Use when working on this board or the ESP32-C6-LCD-1.47-M variant (SKU 28563 / 30381, WS-28563): project setup, platformio.ini and sdkconfig, pin mapping and strapping pins, LCD or SD bring-up on the shared SPI bus, backlight brightness, display frame rate, flashing over Type-C, or debugging why something on the board does not work.

インストール方法を見る

含まれるファイル(24)

  • SKILL.md11.9 KB
  • assets/IMAGE.md438 B
  • reference/board-hardware.md24.0 KB
  • reference/esp32-family.md21.8 KB
  • reference/esp32c6-soc.md81.1 KB
  • reference/recipes.md12.6 KB
  • template/.gitignore122 B
  • template/CMakeLists.txt113 B
  • template/include/board.h2.2 KB
  • template/include/effects.h883 B
  • template/include/font12x24.h40.8 KB
  • template/include/gfx.h2.5 KB
  • template/include/rgb_led.h705 B
  • template/platformio.ini824 B
  • template/README.md3.5 KB
  • template/scripts/genfont.py3.1 KB
  • template/sdkconfig.defaults487 B
  • template/src/CMakeLists.txt174 B
  • template/src/effects.c9.9 KB
  • template/src/gfx.c7.8 KB
  • template/src/main.c2.9 KB
  • template/src/rgb_led.c1.7 KB
  • template/variants/minimal/main.c1.7 KB
  • template/variants/new-project.sh1.6 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Waveshare ESP32-C6-LCD-1.47

Board-specific firmware knowledge. Most failure modes on this board are silent — the firmware runs, the panel lights up, and something is subtly wrong — so read the reference file rather than guessing.

  • reference/board-hardware.md — the complete board reference: pin table, reset-time pin states, strapping analysis, free pins, peripheral availability, power budget, memory and partitions, the display's quirks (Part I), plus a development guide (Part II: §10 toolchain, §11 sdkconfig, §12 flashing, §13 peripheral cookbook, §14 symptom → cause → fix table).
  • reference/recipes.md — copy-paste code: platformio.ini, sdkconfig.defaults, board.h, LCD bring-up, LEDC backlight, frame presentation, partial redraw, the WS2812 driver, TF card on the shared bus, ADC, the BOOT button, font generation.
  • reference/esp32c6-soc.md — the ESP32-C6 silicon datasheet digest, for chip-level questions: IO MUX and LP IO tables, boot straps, memory, every peripheral's feature list, electrical and RF characteristics.
  • reference/esp32-family.md — the rest of the family, for "should this be a different ESP32?" questions: what does and does not port between chips, radio and USB capability per chip, the RMT generation table (WS2812 under Wi-Fi load), deep-sleep memory and ULP/LP-core availability, and a chip-selection table.
  • template/ — a project that builds clean, in two variants, plus a scaffold script. See template/README.md.

Confirm the board first

Waveshare also sells the ESP32-C6-Touch-LCD-1.47 — same vendor, same 1.47" 172×320 panel, different board. If the screen responds to a finger, or there is no WS2812 next to the panel, it is that one: a JD9853 controller instead of the ST7789, an 8 MB C6FH8 instead of the 4 MB C6FH4, a 22-pin header instead of 18, and a pin map in which only LCD_CS, LCD_DC and TF_CS match this board's. Use the esp32c6-touch-lcd147 skill and do not port pin numbers between them — the wrong map gives a dark screen, not an error.

Orientation

SoCESP32-C6FH4, RISC-V RV32IMAC @ 160 MHz + LP core @ 20 MHz, QFN32, 22 GPIOs
Memory4 MB in-package flash (1 MB default app partition), 512 KB HP SRAM (~320 KB linkable), 16 KB LP SRAM
DisplayST7789 172×320 on SPI2 — MOSI GPIO6, SCLK GPIO7, CS GPIO14, DC GPIO15, RST GPIO21, BL GPIO22. Write-only, no MISO
StoragemicroSD on the same SPI2 bus, CS GPIO4, MISO GPIO5. SPI 1-bit mode only
LEDone WS2812-family RGB LED on GPIO8 (a strapping pin — safe at factory eFuse settings)
ButtonsBOOT GPIO9, pressed = low · RESET acts on CHIP_PU, not a GPIO
USBType-C straight to the SoC's USB-Serial-JTAG (GPIO12/13). No bridge chip, no debug header — console, flashing and JTAG all share it
Free pinsGPIO0, 1, 2, 3, 18, 19, 20, 23. GPIO0–3 are also the only ADC channels and the only deep-sleep wake pins left
RadioWi-Fi 6 / BLE 5 / 802.15.4, onboard ceramic antenna, nothing to configure
ToolchainPlatformIO 6.1.19 + platform-espressif32 7.0.1 + ESP-IDF 6.0.1, board = esp32-c6-devkitc-1

Rules that prevent the expensive mistakes

Each of these produces a failure that looks like something else.

  1. CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y in sdkconfig.defaults. Without it the console defaults to UART0 on GPIO16/17, which is wired to nothing on this board: the monitor is silent while the firmware runs perfectly, and you debug blind.
  2. board_upload.flash_size = 4MB + CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y. There is no PlatformIO board definition for this board, so it borrows esp32-c6-devkitc-1, which claims 8 MB. Both lines are needed — they feed different tools — or an oversized image links happily and fails to boot.
  3. esp_lcd_panel_invert_color(panel, true). The IPS panel ships inverted. Without it every colour is a photographic negative, which reads as "my RGB565 packing is broken" and sends you off debugging the wrong thing.
  4. esp_lcd_panel_set_gap(panel, 34, 0). The 172-pixel glass is centred in the ST7789's 240-column RAM: (240 − 172) / 2 = 34. Without it the image is shifted and wraps at the edge.
  5. .data_endian = LCD_RGB_DATA_ENDIAN_BIG in the panel config, and byte-swap RGB565 once, at compile time in the colour macro. Swapping per pixel at runtime costs more than the effect being drawn.
  6. .miso_io_num = -1 for the panel. It is write-only. A project that also wants the SD card must initialise the shared bus with miso_io_num = 5 instead.
  7. The backlight is PWM, never gpio_set_level(). Waveshare's own warning: above 50 % duty for extended periods the panel overheats and develops permanent dark shadows. Drive GPIO22 from an LEDC channel and clamp at 50 %. This is a hardware-damage rule, not a style preference.
  8. The LCD and the TF card share MOSI (GPIO6) and SCLK (GPIO7) and are separated only by chip select. Initialise SPI2 once; a second spi_bus_initialize() returns ESP_ERR_INVALID_STATE. Adding any SPI device means adding a third CS from the free pins, not a second bus.
  9. 40 MHz is the pixel-clock ceiling and it is a wiring fact. The board wires MOSI/SCLK onto the pads the IO MUX assigns to SCLK/MOSI, so SPI2 is routed through the GPIO Matrix at roughly half the 80 MHz IO-MUX ceiling. No software change recovers it.
  10. A full-screen flush is 22 ms → ~45 fps, hard. 172 × 320 × 2 B = 110,080 B at 40 MHz. If an animation looks slow this is the wall, not the CPU. See below.
  11. GPIO4–GPIO7 are gone, and they were the interesting ones. They carry all four JTAG pads (so pad-JTAG is impossible — debug over the Type-C port), ADC1_CH4-6, and the fixed pins of LP UART and LP I2C (so neither LP peripheral is available while the card slot and display exist).
  12. Never burn EFUSE_UART_PRINT_CONTROL or EFUSE_JTAG_SEL_ENABLE. Both hand a boot-time decision to a pin that already has a job here — the RGB LED's idle level (GPIO8) and the LCD's D/C line (GPIO15). eFuse bits are one-time programmable.
  13. The WS2812 wire order is GRB, not RGB, and the LED is far brighter than its numbers suggest — it sits under clear acrylic beside the panel. Divide by ~10.
  14. Deep-sleep is 7 µA for the SoC, not for the board. The LDO's quiescent draw, the backlight driver and the LED's standby current all add on top. Do not quote the datasheet figure for this board.

When the task is display performance

The bus, not the CPU, is the limit: 110,080 bytes at 40 MHz is 22.0 ms on the wire, and gfx_present() blocks on the transfer-done semaphore so that nothing scribbles over the framebuffer mid-DMA. That gives a hard ~45 fps for full-screen redraws.

Three moves, in order of payoff:

  1. Redraw less. esp_lcd_panel_draw_bitmap() takes a rectangle. A 172×40 status strip is 2.75 ms instead of 22 ms — an 8× win for the common case where only part of the UI changed. Coordinates are (x_start, y_start, x_end, y_end) with the end exclusive, and the source buffer's stride must equal the rectangle width, so full-width bands are just an offset into the framebuffer.
  2. Double-buffer, if you have the RAM: another 110 KB out of ~320 KB. It overlaps CPU and DMA but does not raise the 45 fps ceiling.
  3. Nothing else — do not go looking for a faster clock (rule 9).

Keep per-pixel loops integer-only. The RISC-V core here has no FPU; float belongs in one-time init paths (palette and lookup-table generation), never in a frame loop.

When the task is memory

A full framebuffer is 110,080 B — about a third of the ~320 KB the linker actually hands out. The template's full variant links at 123 KB. A Wi-Fi stack is another ~50 KB, a second framebuffer another 110 KB, LVGL more again. Framebuffer + Wi-Fi + double-buffering does not fit — pick two.

Starting a new project

Do not hand-assemble one. template/ builds clean; scaffold from it:

~/.claude/skills/esp32c6-lcd147/template/variants/new-project.sh <target-dir> [--full|--minimal]
cd <target-dir> && pio run
  • --minimal — RGB LED sweep + console heartbeat, no display, no SPI bus. 167,888 B flash, 11,052 B RAM. Flash this first on a new board: it proves the toolchain, the flashing route and the console while the display cannot confuse the diagnosis, and its two outputs (log line, LED) fail independently.
  • --full (default) — ST7789 effect carousel, 12×24 ASCII + Cyrillic font, LEDC backlight, RGB LED accent. 245,214 B flash, 123,052 B RAM.

Both build as-is with ESP-IDF 6.0.1 (verified). Nothing is generated and no paths are embedded, so copying the tree by hand works identically. template/README.md maps files to subsystems so a --full scaffold can be stripped back cleanly.

When the user already has a project, prefer bringing it in line with the template's platformio.ini, sdkconfig.defaults and board.h over rewriting their code.

Flashing

Nothing to press:

pio run -t upload -t monitor        # or: idf.py -p <port> flash monitor

The USB Serial/JTAG controller supports host-controlled reset and download-mode entry, so esptool drives the whole cycle over the Type-C cable. The board appears as CDC-ACM (/dev/cu.usbmodem*, /dev/ttyACM*, or a COM port).

When firmware has wedged USB, or a console config change broke enumeration: hold BOOT, tap RESET, release BOOT → Joint Download Boot. ROM code enumerates with no valid application present, so bad firmware cannot brick this board. If it still fails, esptool.py -p <port> erase_flash — a 4 MB erase takes 20–60 s, so it is probably not hung.

There is no debug header. JTAG is the same Type-C port, via the built-in USB Serial/JTAG controller — but not with the openocd PlatformIO installs for this board. platform-espressif32's platform.json pins tool-openocd-esp32 to ~2.1100.0 (installed: 2.1100.20220706), and that build predates the ESP32-C6 entirely: it ships board/esp32c3-builtin.cfg and board/esp32s3-builtin.cfg but no esp32c6-builtin.cfg and no target/esp32c6.cfg anywhere in the package. pio debug / a bare openocd -f board/esp32c6-builtin.cfg fails with "Can't find board/esp32c6-builtin.cfg" on this toolchain, which reads like a typo rather than a missing chip target. Use a current upstream openocd-esp32 release (Espressif's fork, not PlatformIO's pinned copy) or an ESP-IDF export'd environment's own idf.py openocd, either of which does carry ESP32-C6 support.

Reporting

Say what is verified on hardware and what is derived. In this skill the display path (pin map, 40 MHz clock, gap 34, colour inversion, big-endian RGB565, the 45 fps ceiling) ran on a real board. The LEDC backlight and the WS2812 driver are compile-verified and derived from the vendor documents — the original firmware drove the backlight as a plain GPIO and never touched the RGB LED. Recipes marked "⚠︎ compile-checked only" in reference/recipes.md (TF card, ADC, BOOT button) are in the same category. Everything marked ⚠︎ Inference in reference/board-hardware.md is a conclusion combining the Waveshare wiki with the Espressif datasheet, not a printed vendor statement — flag it as such rather than presenting it as fact.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Firmware development for the Arduino Nano (A000005, ATmega328P @ 16 MHz, 5 V) — its 30 KB usable flash, 2 KB SRAM, 1 KB EEPROM, 8-channel 10-bit ADC, six 8-bit PWM pins across three timers, UART shared with the USB-serial chip, I2C on A4/A5, SPI on D10–D13, sleep modes, and the Arduino AVR core + PlatformIO setup around them. Use when working on this board or any ATmega328P Nano clone (FTDI or CH340 USB): project setup, platformio.ini, old-vs-new bootloader uploads, pin mapping, A6/A7 restrictions, timer/Servo/tone conflicts, the 2 KB SRAM budget, analog references, powering from VIN, ICSP recovery, or debugging why something on the board does not work.

日本語の概要は準備中です。原文の説明を表示しています。

alexex1993/mcu-skills182026年9月25日 更新

Firmware development for the Beetle — the CJMCU / DFRobot "Mini Arduino Leonardo" USB board (ATmega32U4 @ 16 MHz, 5 V, 21×28 mm, castellated pads) — its native USB (CDC serial + HID keyboard/mouse/joystick), Caterina bootloader and 1200 bps touch upload, ten exposed I/O pads, four PWM pins across Timer0/Timer1, five ADC channels, I2C on D2/D3, SPI on the back-side ICSP pads, 28 KB usable flash and 2.5 KB SRAM, and the PlatformIO + Arduino AVR core (`board = leonardo`) setup around them. Use when working on this board or any ATmega32U4 Leonardo/Micro/Pro-Micro-class clone: project setup, platformio.ini, why the board shows up as two different serial ports, uploads that fail or hang, recovering a bricked or HID-spamming board by shorting the ICSP reset pads, pin mapping and which pads are missing, PWM/timer conflicts, Servo and tone, USB HID keyboard projects, the SRAM budget, powering from the + pad, or debugging why something on the board does not work.

日本語の概要は準備中です。原文の説明を表示しています。

alexex1993/mcu-skills182026年9月25日 更新

Разработка прошивок для BE-U1000 (Baikal Electronics / Байкал Электроникс, три ядра RISC-V: BR-350 и BM-310) на отладочных платах EVU-BA-2.1, EVU-BA-2.0 и EVU-BA-1.2 — её eFlash и QSPI flash, UART0/BootROM CLI, PWMA (захват и импульсы), АЦП с DMA, CAN FD, SPI, WDT, CLIC, а также SDK Байкала и его система сборки на make. Use when working on this board or any BE-U1000 / BMCU_U project (SDK 2.1/2.3, riscv32-none-elf, dfu-util, OpenOCD): настройка проекта, Makefile и MEM_REG_ROM, карта выводов и разъёмы XP1/XP8/XP9/XP10, режимы начальной загрузки и страповые выводы, прошивка по UART XMODEM либо USB DFU, работа с eFlash и TCM, прерывания и CLIC, отладка по JTAG — и разбор, почему плата молчит, не стартует, зависает или почему периферия «настроилась», а обмена нет.

日本語の概要は準備中です。原文の説明を表示しています。

alexex1993/mcu-skills182026年9月25日 更新

Firmware development for the 30-pin ESP32-WROOM-32 development board — the DOIT ESP32 DevKit V1 / ESP32 CH340 Type-C / NodeMCU-ESP32 30-pin form factor, 15 pins per side, CH340G or CP2102 USB-UART bridge, AMS1117 LDO, user LED on GPIO2. Use when working on a 30-pin ESP32 devkit (ESP32-D0WDQ6 / ESP32-D0WD-V3, ESP-WROOM-32 module): project setup, platformio.ini and sdkconfig for ESP-IDF or Arduino, pin mapping and which GPIOs are safe, strapping pins, ADC1 vs ADC2 with Wi-Fi, SPI speed and IO_MUX pins, I2C, deep sleep and RTC wake pins, flashing over the CH340 bridge, BOOT/EN recovery, brownouts, or debugging why something on the board does not work.

日本語の概要は準備中です。原文の説明を表示しています。

alexex1993/mcu-skills182026年9月25日 更新

Firmware development for the 36-pin ESP32-WROOM-32 development board — the original DOIT ESP32 DevKit V1 with 18 pins per side, i.e. the 30-pin layout plus the six in-package flash pins (SD0 SD1 SD2 SD3 CMD CLK = GPIO6-11) broken out at the USB end, CH340G or CP2102 bridge, AMS1117 LDO, user LED on GPIO2, GPIO0 not on the header. Use when working on a 36-pin ESP32 devkit (ESP32-D0WDQ6 / ESP32-D0WD-V3, ESP-WROOM-32 module), or when identifying which ESP32 board size you have: project setup, platformio.ini and sdkconfig for ESP-IDF or Arduino, pin mapping and which GPIOs are safe, the flash-pin trap, strapping pins, ADC1 vs ADC2 with Wi-Fi, SPI speed and IO_MUX pins, deep sleep and RTC wake pins, flashing, BOOT/EN recovery, brownouts, or debugging why something on the board does not work.

日本語の概要は準備中です。原文の説明を表示しています。

alexex1993/mcu-skills182026年9月25日 更新

Firmware development for the 38-pin ESP32-WROOM-32 development board — Espressif ESP32-DevKitC V4, Ai-Thinker NodeMCU-32S, DOIT ESP32 DevKit V1 38-pin and their CH340/CP2102 clones, 19 pins per side, with GPIO0 and the six in-package flash pins (GPIO6-11, labelled D0 D1 D2 D3 CMD CLK or SD0-SD3) broken out. Use when working on a 38-pin ESP32 devkit (ESP32-D0WDQ6 / ESP32-D0WD-V3, ESP-WROOM-32 or ESP32-WROVER module): project setup, platformio.ini and sdkconfig for ESP-IDF or Arduino, pin mapping and which GPIOs are safe, the flash-pin and IO0 traps, WROVER GPIO16/17 PSRAM conflict, strapping pins, ADC1 vs ADC2 with Wi-Fi, SPI speed and IO_MUX pins, deep sleep and RTC wake pins, flashing, BOOT/EN recovery, brownouts, or debugging why something on the board does not work.

日本語の概要は準備中です。原文の説明を表示しています。

alexex1993/mcu-skills182026年9月25日 更新

alexex1993 のスキルをすべて見る

このスキルの問題を報告する