Raspberry Pi Pico 2 W — Reference & Migration Guide¶
Source: raspberrypi.com/documentation/microcontrollers/pico-series.html
Hardware Specifications¶
| Spec | Pico 2 W (RP2350) | Pico W (RP2040) |
|---|---|---|
| Chip | RP2350 | RP2040 |
| CPU | Dual-core ARM Cortex-M33 @ 150MHz | Dual-core ARM Cortex-M0+ @ 133MHz |
| Alt CPU | Dual-core Hazard3 RISC-V @ 150MHz | None |
| RAM | 520KB SRAM | 264KB SRAM |
| Flash | 4MB onboard QSPI | 2MB onboard QSPI |
| Wi-Fi | 802.11n 2.4GHz (Infineon CYW43439) | Same |
| Bluetooth | BLE 5.2 | Same |
| USB | Micro-USB 1.1 (device and host) | Same |
| GPIO | 26 multi-function pins (same header) | Same |
| ADC | 4 external + 1 internal (12-bit) | 3 external + 1 internal |
| SPI | 2x SPI controllers (SPI0, SPI1) | Same |
| Security | ARM TrustZone, secure boot, OTP | None |
| Dimensions | 51 x 21 x 3.9mm | Same |
| Operating temp | -20C to +85C | Same |
| Power input | 1.8V-5.5V via VSYS, or 5V via micro-USB | Same |
Pin Compatibility¶
Drop-in replacement
The Pico 2 W has an identical 40-pin header to the Pico W. All Dilder wiring (e-Paper SPI1, joystick buttons, power) works without any changes. You can swap boards and keep the same wiring.
The GPIO assignments, SPI controllers, and pin multiplexing are the same. Dilder uses the same board_config.h pin definitions for both boards.
Critical Gotchas: RP2350 vs RP2040¶
These are the issues we hit while porting Dilder. Save yourself the debugging time.
1. BOOTSEL Drive Shows as RP2350, Not RPI-RP2¶
When you hold BOOTSEL and plug in the Pico 2 W, the USB mass storage drive appears as RP2350 instead of RPI-RP2.
Any scripts or tools that look for RPI-RP2 by name will fail silently. The DevTool and setup.py have been updated to search for both labels.
2. No Hardware RTC¶
The RP2040 has a hardware Real-Time Clock (RTC) peripheral. The RP2350 removed it entirely.
#include "hardware/rtc.h"does not exist on RP2350rtc_init(),rtc_set_datetime(),rtc_get_datetime()are gonepico/util/datetime.h(which definesdatetime_t) was also removed
Solution: We created rtc_compat.h in dev-setup/hello-world/lib/Config/ that:
- On RP2040: includes the real hardware RTC headers (zero overhead)
- On RP2350: defines
datetime_tourselves and provides softwarertc_*()functions usingtime_us_64()
All 18 program main.c files now use #include "rtc_compat.h" instead of #include "hardware/rtc.h".
The CMakeLists.txt files conditionally link hardware_rtc only on RP2040:
3. CMake Cache Poisoning When Switching Boards¶
If you previously built for pico_w (RP2040) and then try to build for pico2_w (RP2350) in the same build directory, CMake will fail:
PICO_PLATFORM is specified to be 'rp2040', but PICO_BOARD='pico2_w'
uses 'rp2350' which is incompatible.
The CMake cache stores PICO_PLATFORM=rp2040 from the first build. Even if you pass -DPICO_BOARD=pico2_w, the cached platform wins.
Solution: Delete the build/ directory (or use separate build directories per board). The setup.py and DevTool now auto-detect stale caches by checking both PICO_BOARD and PICO_PLATFORM in CMakeCache.txt and wipe the build directory when they mismatch.
4. Pico SDK Version Requirement¶
The Pico 2 W requires Pico SDK 2.0 or later. Earlier SDK versions do not include pico2_w board definitions.
Check your SDK version:
If it says 1.x, update:
5. Compiler Targets Cortex-M33, Not Cortex-M0+¶
The RP2350 uses ARM Cortex-M33 cores. The GCC flags change from -mcpu=cortex-m0plus to -mcpu=cortex-m33 -mthumb -march=armv8-m.main+fp+dsp. This is handled automatically by the Pico SDK when you set PICO_BOARD=pico2_w -- no manual flag changes needed.
6. Docker Builds Need PICO_BOARD Environment Variable¶
The Dockerfile was updated to accept a PICO_BOARD env var (defaults to pico_w). When building for Pico 2 W via Docker, pass:
The DevTool does this automatically based on the board selector dropdown.
Build & Flash Workflow¶
The workflow is identical to Pico W -- the only differences are the CMake board flag and the BOOTSEL drive name.
Build¶
Flash¶
- Hold BOOTSEL, plug in USB, release
RP2350drive appears (notRPI-RP2)- Copy the
.uf2file to the drive - Board reboots automatically
Serial Monitor¶
Same as Pico W -- shows as /dev/ttyACM0 at 115200 baud.
DevTool Support¶
Select "Pico 2 W (RP2350)" from the board dropdown in the DevTool toolbar. Everything adapts automatically:
- Flash utility detects
RP2350BOOTSEL drive - Build commands use
-DPICO_BOARD=pico2_w - Docker builds pass
PICO_BOARD=pico2_w - Pin viewer shows the correct header (identical pins, updated title)
- Flash size reported as 4MB (4096 KB)
- All documentation and connection wizard text updates to show Pico 2 W
Setup CLI Support¶
python3 setup.py --board pico2 # Pico 2 W setup steps
python3 setup.py --board pico2 --step 7 # Jump to build step
The setup steps are identical to Pico W (same SDK, same toolchain) but use the correct PICO_BOARD=pico2_w flag and detect the RP2350 BOOTSEL drive.