板载 LED 为什么在 GPIO38 或 GPIO48
适用范围: ESP32-S3-DevKitC-1 官方板卡,两个 PCB 修订。
问题
“教程说板载 LED 在 GPIO48。我的从来不亮。是不是板坏了?”
几乎可以肯定不是。这块板有两个硬件修订,同一个 LED 用了不同的引脚。官方修订说明写道:
Both the initial and v1.1 versions of ESP32-S3-DevKitC-1 are available on the market. The main difference lies in the GPIO assignment for the RGB LED: the initial version uses GPIO48, whereas v1.1 uses GPIO38. (首发版与 v1.1 版同时在售;主要区别是 RGB LED 的 GPIO 分配:首发版用 GPIO48,v1.1 用 GPIO38。)
事实表
| PCB 修订 | LED GPIO | 排针位置 | 官方来源 |
|---|---|---|---|
| v1.0(首发版) | GPIO48 | J3 触点 16 | v1.0 用户指南 J3 表 |
| v1.1 | GPIO38 | J3 触点 10 | v1.1 用户指南 J3 表 |
两行都是板卡页上按修订区分的发布字段;交互式引脚图会按所选修订高亮 LED 引脚。
引脚为什么移动:文档没有说明。 修订说明只把 GPIO 重新分配当作事实陈述,没有给出任何电气层面的理由。任何用具体电压域或布局原因"解释"这一点的页面都是在猜测——请据此对待。
这个 LED 不是普通 LED
这件事比引脚号更重要。官方指南把它描述为可寻址 RGB LED(单线协议,WS2812 类):
Addressable RGB LED, driven by GPIO38. (可寻址 RGB LED,由 GPIO38 驱动。)
所以 digitalWrite(38, HIGH) 不会得到"灯亮了"——这个 LED 期望的是带时序的串行协议来传送颜色数据。请使用驱动:
Arduino(arduino-esp32 core):
#include <Adafruit_NeoPixel.h> // 或使用内建的 neopixelWrite()
Adafruit_NeoPixel led(1, 38, NEO_GRB + NEO_KHZ800);
void setup() {
led.begin();
led.setPixelColor(0, led.Color(16, 0, 0)); // dim red
led.show();
}
void loop() {}arduino-esp32 core 还内建了 neopixelWrite(pin, r, g, b),一行即可、无需库。
**ESP-IDF:**使用 led_strip 组件(见 ESP-IDF 的可寻址 LED blink 示例)。
不确定哪个 GPIO 驱动你的 LED? 一个最小 sketch 先在 GPIO48、再在 GPIO38 上设置同一颜色,几秒钟就能找出眼前这块板实际可用的 LED 引脚——全程无需任何外部接线。这个观察给 blink 代码正确的引脚号;但对来历不明或非参考设计的板,它本身不能证明 PCB 修订。官方识别路径是丝印、卖家与原理图——见我手上的是哪个 ESP32-S3-DevKitC-1?。
本页不能告诉你的
- GPIO 为什么移动——任何固定版本的官方文档都没有说明。此处记为未知,不做猜测。
- LED 具体型号与颜色顺序——指南没有给出具体 LED 料号。
NEO_GRB适用于常见器件,但如果你板上颜色不对,试试NEO_RGB;这是驱动细节,不是硬件事实。
来源
- ESP32-S3-DevKitC-1 v1.1 用户指南——“RGB LED” 元件行、J3 排针表、Hardware Revision Details(commit
5c06bf18) - ESP32-S3-DevKitC-1 v1.0 用户指南——J3 排针表(commit
5c06bf18) - MCUID 数据记录:ESP32-S3-DevKitC-1——按修订区分的
onboard_rgb_led.gpio字段及固定来源