The Feather RP2040 has many pins, ports and features. This page takes you on a tour of the board!
PrettyPins PDF on GitHub.
- USB C connector - This is used for power and data. Connect to your computer via a USB C cable to update firmware and edit code.
- LiPoly Battery connector - This 2-pin JST PH connector allows you to plug in lipoly batteries to power the Feather. The Feather is also capable of charging batteries plugged into this port via USB.
- GND - This is the common ground for all power and logic.
- BAT - This is the positive voltage to/from the 2-pin JST jack for the optional Lipoly battery.
- USB - This is the positive voltage to/from the USB C jack, if USB is connected.
- EN - This is the 3.3V regulator's enable pin. It's pulled up, so connect to ground to disable the 3.3V regulator.
- 3.3V - These pins are the output from the 3.3V regulator, they can supply 500mA peak.
I2C and SPI on RP2040
The RP2040 is capable of handling I2C, SPI and UART on many pins. However, there are really only two peripherals each of I2C, SPI and UART: I2C0 and I2C1, SPI0 and SPI1, and UART0 and UART1. So while many pins are capable of I2C, SPI and UART, you can only do two at a time, and only on separate peripherals, 0 and 1. I2C, SPI and UART peripherals are included and numbered below.
PWM on RP2040
The RP2040 supports PWM on all pins. However, it is not capable of PWM on all pins at the same time. There are 8 PWM "slices", each with two outputs, A and B. Each pin on the Feather is assigned a PWM slice and output. For example, A0 is PWM5 A, which means it is first output of the fifth slice. You can have up to 16 PWM objects on the Feather RP2040. The important thing to know is that you cannot use the same slice and output more than once at the same time. So, if you have a PWM object on pin A0, you cannot also put a PWM object on D10, because they are both PWM5 A. The PWM slices and outputs are indicated below.
The RP2040 has four ADCs. These pins are the only pins capable of handling analog, and they can also do digital.
- A0/GP26 - This pin is ADC0. It is also SPI1 SCK, I2C1 SDA and PWM5 A.
- A1/GP27 - This pin is ADC1. It is also SPI1 MOSI, I2C1 SCL and PWM5 B.
- A2/GP28 - This pin is ADC2. It is also SPI1 MISO, I2C1 SDA and PWM6 A.
- A3/GP29 - This pin is ADC3. It is also SPI1 CS, I2C0 SCL and PWM6 B.
These are the digital I/O pins. They all have multiple capabilities.
- D24/GP24 - Digital I/O pin 24. It is also UART1 TX, I2C0 SDA, and PWM4 A.
- D25/GP25 - Digital I/O pin 25. It is also UART1 RX, I2C0 SCL, and PWM4 B.
- SCK/GP18 - The main SPI0 SCK. It is also I2C1 SDA and PWM1 A.
- MO/GP19 - The main SPI0 MOSI. It is also I2C1 SCL and PWM1 B.
- MI/GP20 - The main SPI0 MISO. It is also UART1 TX, I2C0 SDA and PWM2 A.
- RX/GP01 - The main UART0 RX pin. It is also I2C0 SDA, SPI0 CS and PWM0 B.
- TX/GP00 - The main UART0 TX pin. It is also I2C0 SCL, SPI0 MISO and PWM0 A.
- D4/GP06 - Digital I/O pin 4. It is also SPI0 SCK, I2C1 SDA and PWM3 A.
- D13/GP13 - Digital I/O pin 13. It is also SPI1 CS, UART0 RX, I2C0 SCL and PWM6 B.
- D12/GP12 - Digital I/O pin 12. It is also SPI1 MISO, UART0 TX, I2C0 SDA and PWM6 A.
- D11/GP11 - Digital I/O pin 11. It is also SPI1 MOSI, I2C1 SCL and PWM5 B.
- D10/GP10 - Digital I/O pin 10. It is also SPI1 SCK, I2C1 SDA and PWM5 A.
- D9/GP09 - Digital I/O pin 9. It is also SPI1 CS, UART1 RX, I2C0 SCL and PWM4 B.
- D6/GP08 - Digital I/O pin 6. It is also SPI1 MISO, UART1 TX, I2C0 SDA and PWM4 A.
- D5/GP07 - Digital I/O pin 5. It is also SPI0 MOSI, I2C1 SCL and PWM3 B.
- SCL/GP03 - The main I2C1 clock pin. It is also SPI0 MOSI, I2C1 SCL and PWM1 B.
- SDA/GP02 - The main I2C1 data pin. It is also SPI0 SCK, I2C1 SDA and PWM1 A.
CircuitPython Pins vs GPxx Pins
There are pin labels on both sides of the Feather RP2040. Which should you use? In CircuitPython, use the pin labels on the top of the board (such as A0, D4, SCL, RX, etc.). If you're looking to work with this board and the RP2040 SDK, use the pin labels on the bottom of the board (GP00 and GP01, etc.).
CircuitPython I2C, SPI and UART
Note that in CircuitPython, there is a board object each for I2C, SPI and UART that use the pins labeled on the Feather. You can use these objects to initialise these peripherals in your code.
Primary pins based on Feather RP2040 silk are bold.
- I2C0 SCL: A3, D25, RX, D13, D9
- I2C0 SDA: A2, D24, MISO, TX, D12, D6
- I2C1 SCL: SCL, A1, MOSI, D11, D5
- I2C1 SDA: SDA, A0, SCK, D4, D10
- SPI0 SCK: SCK, D4, SDA
- SPI0 MOSI: MOSI, D5, SCL
- SPI0 MISO: MISO, TX
- SPI0 CS: RX
- SPI1 SCK: A0, D10
- SPI1 MOSI: A1, D11
- SPI1 MISO: A2, D24, D12, D6
- SPI1 CS: A3, D25, D13, D9
- UART0 TX: TX, A2, D12
- UART0 RX: RX, A3, D13
- UART1 TX: D24, MISO, D6
- UART1 RX: D25, D9
- PWM0 A: TX
- PWM0 B: RX
- PWM1 A: SCK, SDA
- PWM1 B: MOSI, SCL
- PWM2 A: MISO
- PWM2 B: (none)
- PWM3 A: D4
- PWM3 B: D5
- PWM4 A: D24, D6
- PWM4 B: D25, D9
- PWM5 A: A0, D10
- PWM5 B: A1, D11
- PWM6 A: A2, D12
- PWM6 B: A3, D13
The square towards the middle is the RP2040 microcontroller, the "brains" of the Feather RP2040 board.
The square near the BOOTSEL button is the QSPI Flash. It is connected to 6 pins that are not brought out on the GPIO pads. This way you don't have to worry about the SPI flash colliding with other devices on the main SPI connection.
QSPI is neat because it allows you to have 4 data in/out lines instead of just SPI's single line in and single line out. This means that QSPI is at least 4 times faster. But in reality is at least 10x faster because you can clock the QSPI peripheral much faster than a plain SPI peripheral
The Feather RP2040 has two buttons.
The BOOTSEL button is used to enter the bootloader. To enter the bootloader, press and hold BOOTSEL and then power up the board (either by plugging it into USB or pressing RESET). The bootloader is used to install/update CircuitPython.
The RESET button restarts the board and helps enter the bootloader. You can click it to reset the board without unplugging the USB cable or battery.
The RST pin is can be used to reset the board. Tie to ground manually to reset the board.
Above the pin labels for A0 and A1 is the status NeoPixel LED. In CircuitPython, the NeoPixel is
board.NEOPIXEL and the library for it is here and in the bundle. The NeoPixel is powered by the 3.3V power supply but that hasn't shown to make a big difference in brightness or color. In CircuitPython, the LED is used to indicate the runtime status.
Below the USB C connector is the CHG LED. This indicates the charge status of a connected lipoly battery, if one is present and USB is connected. It is amber while charging, and green when fully charged. Note, it's normal for this LED to flicker when no battery is in place, that's the charge circuitry trying to detect whether a battery is there or not.
Above the USB C connector is the D13 LED. This little red LED is controllable in CircuitPython code using
board.LED. Also, this LED will pulse when the board is in bootloader mode.
The Feather RP2040 comes with a built in STEMMA QT connector! This means you can connect up all sorts of I2C sensors and breakouts, no soldering required! This connector uses the SCL and SDA pins for I2C, which ends up being the RP2040's I2C1 peripheral. In Arduino it is
For advanced debugging or to reprogram your Feather RP2040, there is a footprint to solder a 2*5 pin 0.05" standard SWD header on the board. The image above shows the "pin 1" location by marking it with a triangle. This orientation places the connector key facing towards the end of the board where the USB connector is. This allows you to use something like a Segger J-Link and a 1.27mm SWD cable to connect from your PC to the Feather.
On the back of the board are pads for the SWCLK and SWDIO pins. They provide access to the internal Serial Wire Debug multi-drop bus, which provides debug access to both processors, and can be used to download code.