Pin numbers, GPIO numbers and pin functions — three different things
Question this page answers: “The pin table says J3-10, the code says GPIO38, the silk says FSPIWP — are these the same pin?”
Three numbering systems, three questions
| System | Answers | Belongs to |
|---|---|---|
| Header position (J3 contact 10) | “where physically?” | the board and its layout |
| GPIO number (GPIO38) | “which chip I/O line?” | the chip, routed through the board |
| Function/silk name (FSPIWP, U0TXD, GP25-LED) | “what is it wired to / good for?” | chip alternate-functions + board wiring |
A pin link on any MCUID board page carries all three: the SVG block is the header position, the claim row names the GPIO, the function column lists the official alternate functions.
The revision lesson: same device, new GPIO
The clearest example is the ESP32-S3-DevKitC-1 RGB LED: on v1.0 it is driven by GPIO48 (J3 contact 16), on v1.1 by GPIO38 (J3 contact 10). The board layout barely changed — a revision re-routed which GPIO drives the same LED. So “the LED pin” is not a fact until you name the revision. See why the LED is GPIO38 or GPIO48.
The silk-name lesson: a function name is not a GPIO number
- On the ESP32-DevKitC, pins marked D0, D1, D2, D3, CMD, CLK are the SPI flash lines — the names describe an internal function that never goes away, on every variant.
- On the Pico, GP25 is simultaneously “GPIO 25” and “the user LED” — the board wiring makes that one pin special; the chip does not know about the LED.
The software-default lesson
“Pico UART0 is on GP0/GP1” comes from the pico-sdk board header — a software convention. You can change it, but only onto another legal mux pin for that peripheral (the RP2040 IO bank also puts UART0 TX/RX on GP12/13 and GP16/17 — not on GP7); the hardware fact is which mux pins each peripheral exists on, and the default is what the SDK’s board config happens to choose. The Pico 2’s pico2.h header chooses the same UART0/I2C0 defaults on RP2350 — a default is still only a default; RP2350’s own legal mux sets are a datasheet fact, not covered by the RP2040 table. Same class of distinction for the ESP32’s U0TXD/U0RXD: the chip routes UART0 to fixed pins by default (GPIO43/44 on DevKitC-1’s header table), and the matrix can remap most functions.
What this page cannot tell you
- Full alternate-function tables per chip — owned by chip datasheets; MCUID publishes per-board header tables with the function column quoting official documentation.
- Clone boards may print different silk names for the same positions — verify against the board’s own documentation, not the reference board’s.
Sources
- MCUID data records: ESP32-S3-DevKitC-1 (revision-scoped LED claims), ESP32-DevKitC (flash-line pins), Pico / Pico 2 (GP25 LED, board-header defaults)
- pico-sdk board header pico.h (tag 2.3.1) — the software-default convention, cited as convention
- pico-sdk io_bank0.h — the fixed hardware mux pins each peripheral exists on (commit
079c6f39)