Raspberry Pi Pico Arduino core, for all RP2040 and RP2350 boards
This is a port of Arduino to the RP2040 (Raspberry Pi Pico processor) and RP2350 (Raspberry Pi Pico 2 processor). It uses the bare Raspberry Pi Pico SDK and a custom GCC 14.2/Newlib 4.3 toolchain and supports ARM and RISC-V cores.
Transparent use of PSRAM globals and heap (RP2350 only)
ARM or RISC-V (Hazard3) support for the RP2350
Semihosted serial and file system access
GPROF profiling support
The RP2040 PIO state machines (SMs) are used to generate jitter-free:
Servos
Tones
I2S Input
I2S Output
Software UARTs (Serial ports)
Software SPIs
Installing via Arduino Boards Manager
Windows-specific Notes
Please do not use the Windows Store version of the actual Arduino application
because it has issues detecting attached Pico boards. Use the “Windows ZIP” or plain “Windows”
executable (EXE) download direct from https://arduino.cc. and allow it to install any device
drivers it suggests. Otherwise the Pico board may not be detected. Also, if trying out the
2.0 beta Arduino please install the release 1.8 version beforehand to ensure needed device drivers
are present. (See #20 for more details.)
Linux-specific Notes
Installing Arduino using flatpak (often used by “App Stores” in various Linux
distributions) will mean it has restricted access to the host. This might cause uploads to fail
with error messages such as the following:
Scanning for RP2040 devices
...
No drive to deploy.
If you encounter this, you will need to either install Arduino in a different manner, or override
the flatpak sandboxing feature using the following command, then restarting Arduino.
Windows Users: Before installing via git on Windows, please read and follow the directions in
this link.
If Win32 long paths are not enabled, and git not configured to use them then there
may be errors when attempting to clone the submodules.
To install via GIT (for latest and greatest versions):
mkdir -p ~/Arduino/hardware/pico
git clone https://github.com/earlephilhower/arduino-pico.git ~/Arduino/hardware/pico/rp2040
cd ~/Arduino/hardware/pico/rp2040
git submodule update --init
cd pico-sdk
git submodule update --init
cd ../tools
python3 ./get.py
Uploading Sketches
To upload your first sketch, you will need to hold the BOOTSEL button down while plugging in the Pico to your computer.
Then hit the upload button and the sketch should be transferred and start to run.
After the first upload, this should not be necessary as the arduino-pico core has auto-reset support.
Select the appropriate serial port shown in the Arduino Tools->Port->Serial Port menu once (this setting will stick and does not need to be
touched for multiple uploads). This selection allows the auto-reset tool to identify the proper device to reset.
Them hit the upload button and your sketch should upload and run.
In some cases the Pico will encounter a hard hang and its USB port will not respond to the auto-reset request. Should this happen, just
follow the initial procedure of holding the BOOTSEL button down while plugging in the Pico to enter the ROM bootloader.
Uploading Filesystem Images
The onboard flash filesystem for the Pico, LittleFS, lets you upload a filesystem image from the sketch directory for your sketch to use. Download the needed plugin from
If you have built a Raspberry Pi Picoprobe, you can use OpenOCD to handle your sketch uploads and for debugging with GDB.
Under Windows a local admin user should be able to access the Picoprobe port automatically, but under Linux udev must be told about the device and to allow normal users access.
To set up user-level access to Picoprobes on Ubuntu (and other OSes which use udev):
echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="0004", MODE="660", GROUP-"plugdev"' | sudo tee -a /etc/udev/rules.d/98-PicoProbe.rules
echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="000a", MODE="660", GROUP="plugdev"' | sudo tee -a /etc/udev/rules.d/98-PicoProbe.rules
echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="000f", MODE="660", GROUP="plugdev"' | sudo tee -a /etc/udev/rules.d/98-PicoProbe.rules
sudo udevadm control --reload
sudo udevadm trigger -w -s usb
The first line creates a device file in /dev matching the USB vendor and product ID of the Picoprobe, and it enables global read+write permissions. The second line causes udev to load this new rule. The third line requests the kernel generate “device change” events that will cause our new udev rule to run.
If for some reason the device file does not appear, manually unplug and re-plug the USB connection and check again. The output from dmesg can reveal useful diagnostics if the device file remains absent.
Once Picoprobe permissions are set up properly, then select the board “Raspberry Pi Pico (Picoprobe)” in the Tools menu and upload as normal.
Debugging with Picoprobe, OpenOCD, and GDB
The installed tools include a version of OpenOCD (in the pqt-openocd directory) and GDB (in the pqt-gcc directory). These may be used to run GDB in an interactive window as documented in the Pico Getting Started manuals from the Raspberry Pi Foundation. Use the command line ./system/openocd/bin/openocd -f ./lib/rp2040/picoprobe_cmsis_dap.tcl or ./system/openocd/bin/openocd -f ./lib/rp2350/picoprobe_cmsis_dap.tcl from the git installation directory.
Arduino-Pico
Raspberry Pi Pico Arduino core, for all RP2040 and RP2350 boards
This is a port of Arduino to the RP2040 (Raspberry Pi Pico processor) and RP2350 (Raspberry Pi Pico 2 processor). It uses the bare Raspberry Pi Pico SDK and a custom GCC 14.2/Newlib 4.3 toolchain and supports ARM and RISC-V cores.
Documentation
See https://arduino-pico.readthedocs.io/en/latest/ along with the examples for more detailed usage information.
Contributing
Read the Contributing Guide for more information on submitting pull requests and porting libraries or sketches to this core.
Supported Boards
Features
The RP2040 PIO state machines (SMs) are used to generate jitter-free:
Installing via Arduino Boards Manager
Windows-specific Notes
Please do not use the Windows Store version of the actual Arduino application because it has issues detecting attached Pico boards. Use the “Windows ZIP” or plain “Windows” executable (EXE) download direct from https://arduino.cc. and allow it to install any device drivers it suggests. Otherwise the Pico board may not be detected. Also, if trying out the 2.0 beta Arduino please install the release 1.8 version beforehand to ensure needed device drivers are present. (See #20 for more details.)
Linux-specific Notes
Installing Arduino using flatpak (often used by “App Stores” in various Linux distributions) will mean it has restricted access to the host. This might cause uploads to fail with error messages such as the following:
If you encounter this, you will need to either install Arduino in a different manner, or override the flatpak sandboxing feature using the following command, then restarting Arduino.
Installation
Open up the Arduino IDE and go to File->Preferences.
In the dialog that pops up, enter the following URL in the “Additional Boards Manager URLs” field:
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
Hit OK to close the dialog.
Go to Tools->Boards->Board Manager in the IDE
Type “pico” in the search box and select “Add”:
Installing via GIT
Windows Users: Before installing via
git
on Windows, please read and follow the directions in this link. If Win32 long paths are not enabled, andgit
not configured to use them then there may be errors when attempting to clone the submodules.To install via GIT (for latest and greatest versions):
Uploading Sketches
To upload your first sketch, you will need to hold the BOOTSEL button down while plugging in the Pico to your computer. Then hit the upload button and the sketch should be transferred and start to run.
After the first upload, this should not be necessary as the
arduino-pico
core has auto-reset support. Select the appropriate serial port shown in the Arduino Tools->Port->Serial Port menu once (this setting will stick and does not need to be touched for multiple uploads). This selection allows the auto-reset tool to identify the proper device to reset. Them hit the upload button and your sketch should upload and run.In some cases the Pico will encounter a hard hang and its USB port will not respond to the auto-reset request. Should this happen, just follow the initial procedure of holding the BOOTSEL button down while plugging in the Pico to enter the ROM bootloader.
Uploading Filesystem Images
The onboard flash filesystem for the Pico, LittleFS, lets you upload a filesystem image from the sketch directory for your sketch to use. Download the needed plugin from
To install, follow the directions in
For detailed usage information, please check the ESP8266 repo documentation (ignore SPIFFS related notes) available at
Uploading Sketches with Picoprobe/Debugprobe
If you have built a Raspberry Pi Picoprobe, you can use OpenOCD to handle your sketch uploads and for debugging with GDB.
Under Windows a local admin user should be able to access the Picoprobe port automatically, but under Linux
udev
must be told about the device and to allow normal users access.To set up user-level access to Picoprobes on Ubuntu (and other OSes which use
udev
):The first line creates a device file in
/dev
matching the USB vendor and product ID of the Picoprobe, and it enables global read+write permissions. The second line causesudev
to load this new rule. The third line requests the kernel generate “device change” events that will cause our newudev
rule to run.If for some reason the device file does not appear, manually unplug and re-plug the USB connection and check again. The output from
dmesg
can reveal useful diagnostics if the device file remains absent.Once Picoprobe permissions are set up properly, then select the board “Raspberry Pi Pico (Picoprobe)” in the Tools menu and upload as normal.
Debugging with Picoprobe, OpenOCD, and GDB
The installed tools include a version of OpenOCD (in the pqt-openocd directory) and GDB (in the pqt-gcc directory). These may be used to run GDB in an interactive window as documented in the Pico Getting Started manuals from the Raspberry Pi Foundation. Use the command line
./system/openocd/bin/openocd -f ./lib/rp2040/picoprobe_cmsis_dap.tcl
or./system/openocd/bin/openocd -f ./lib/rp2350/picoprobe_cmsis_dap.tcl
from thegit
installation directory.Licensing and Credits
-Earle F. Philhower, III
earlephilhower@yahoo.com