Home

Awesome

Raspberry Pi Pico SDK Examples

Getting started

See Getting Started with the Raspberry Pi Pico and the README in the pico-sdk for information on getting up and running.

First Examples

AppDescriptionLink to prebuilt UF2
hello_serialThe obligatory Hello World program for Pico (Output over serial version)
hello_usbThe obligatory Hello World program for Pico (Output over USB version)https://rptl.io/pico-hello-usb
blinkBlink an LED on and off.https://rptl.io/pico-blink

ADC

AppDescription
hello_adcDisplay the voltage from an ADC input.
joystick_displayDisplay a Joystick X/Y input based on two ADC inputs.
adc_consoleAn interactive shell for playing with the ADC. Includes example of free-running capture mode.
onboard_temperatureDisplay the value of the onboard temperature sensor.
microphone_adcRead analog values from a microphone and plot the measured sound amplitude.

Clocks

AppDescription
hello_48MHzChange the system clock frequency to 48 MHz while running.
hello_gpoutUse the general purpose clock outputs (GPOUT) to drive divisions of internal clocks onto GPIO outputs.
hello_resusEnable the clock resuscitate feature, "accidentally" stop the system clock, and show how we recover.

CMake

AppDescription
build_variantsBuilds two version of the same app with different configurations

DMA

AppDescription
hello_dmaUse the DMA to copy data in memory.
control_blocksBuild a control block list, to program a longer sequence of DMA transfers to the UART.
channel_irqUse an IRQ handler to reconfigure a DMA channel, in order to continuously drive data through a PIO state machine.
sniff_crcUse the DMA engine's 'sniff' capability to calculate a CRC32 on a data buffer.

Flash

AppDescription
cache_perfctrRead and clear the cache performance counters. Show how they are affected by different types of flash reads.
nukeObliterate the contents of flash. An example of a NO_FLASH binary (UF2 loaded directly into SRAM and runs in-place there). A useful utility to drag and drop onto your Pico if the need arises.
programErase a flash sector, program one flash page, and read back the data.
xip_streamStream data using the XIP stream hardware, which allows data to be DMA'd in the background whilst executing code from flash.
ssi_dmaDMA directly from the flash interface (continuous SCK clocking) for maximum bulk read performance.

GPIO

AppDescription
hello_7segmentUse the GPIOs to drive a seven segment LED display.
hello_gpio_irqRegister an interrupt handler to run when a GPIO is toggled.
dht_sensorUse GPIO to bitbang the serial protocol for a DHT temperature/humidity sensor.

See also: blink, blinking an LED attached to a GPIO.

HW divider

AppDescription
hello_dividerShow how to directly access the hardware integer dividers, in case AEABI injection is disabled.

I2C

AppDescription
bus_scanScan the I2C bus for devices and display results.
bmp280_i2cRead and convert temperature and pressure data from a BMP280 sensor, attached to an I2C bus.
lcd_1602_i2cDisplay some text on a generic 16x2 character LCD display, via I2C.
lis3dh_i2cRead acceleration and temperature value from a LIS3DH sensor via I2C
mcp9808_i2cRead temperature, set limits and raise alerts when limits are surpassed.
mma8451_i2cRead acceleration from a MMA8451 accelerometer and set range and precision for the data.
mpl3115a2_i2cInterface with an MPL3115A2 altimeter, exploring interrupts and advanced board features, via I2C.
mpu6050_i2cRead acceleration and angular rate values from a MPU6050 accelerometer/gyro, attached to an I2C bus.
ssd1306_i2cConvert and display a bitmap on a 128x32 or 128x64 SSD1306-driven OLED display
pa1010d_i2cRead GPS location data, parse and display data via I2C.
pcf8523_i2cRead time and date values from a real time clock. Set current time and alarms on it.
ht16k33_i2cDrive a 4 digit 14 segment LED with an HT16K33.
slave_mem_i2ci2c slave example where the slave implements a 256 byte memory

Interpolator

AppDescription
hello_interpA bundle of small examples, showing how to access the core-local interpolator hardware, and use most of its features.

Multicore

AppDescription
hello_multicoreLaunch a function on the second core, printf some messages on each core, and pass data back and forth through the mailbox FIFOs.
multicore_fifo_irqsOn each core, register and interrupt handler for the mailbox FIFOs. Show how the interrupt fires when that core receives a message.
multicore_runnerSet up the second core to accept, and run, any function pointer pushed into its mailbox FIFO. Push in a few pieces of code and get answers back.

Pico Board

AppDescription
blinkyBlink "hello, world" in Morse code on Pico's LED
buttonUse Pico's BOOTSEL button as a regular button input, by temporarily suspending flash access.

Pico W Networking

These examples are for the Pico W, and are only available for PICO_BOARD=pico_w

AppDescription
picow_access_pointStarts a WiFi access point, and fields DHCP requests.
picow_blinkBlinks the on-board LED (which is connected via the WiFi chip).
picow_iperf_serverRuns an "iperf" server for WiFi speed testing.
picow_ntp_clientConnects to an NTP server to fetch and display the current time.
picow_tcp_clientA simple TCP client. You can run python_test_tcp_server.py for it to connect to.
picow_tcp_serverA simple TCP server. You can use python_test_tcp_client.py to connect to it.
picow_tls_clientDemonstrates how to make a HTTPS request using TLS.
picow_wifi_scanScans for WiFi networks and prints the results.
picow_udp_beaconA simple UDP transmitter.

FreeRTOS examples

These are examples of integrating Pico W networking under FreeRTOS, and require you to set the FREERTOS_KERNEL_PATH to point to the FreeRTOS Kernel.

AppDescription
picow_freertos_iperf_server_nosysRuns an "iperf" server for WiFi speed testing under FreeRTOS in NO_SYS=1 mode. The LED is blinked in another task
picow_freertos_iperf_server_sysRuns an "iperf" server for WiFi speed testing under FreeRTOS in NO_SYS=0 (i.e. full FreeRTOS integration) mode. The LED is blinked in another task
picow_freertos_ping_nosysRuns the lwip-contrib/apps/ping test app under FreeRTOS in NO_SYS=1 mode.
picow_freertos_ping_sysRuns the lwip-contrib/apps/ping test app under FreeRTOS in NO_SYS=0 (i.e. full FreeRTOS integration) mode. The test app uses the lwIP socket API in this case.

Pico W Bluetooth

These examples are for the Pico W, and are only available for PICO_BOARD=pico_w. They are examples from the Blue Kitchen Bluetooth stack, see here for a full description.

By default, the Bluetooth examples are only built in one "mode" only (background, poll, or freertos), with the default being background. This can be changed by passing -DBTSTACK_EXAMPLE_TYPE=poll etc. to CMake, or all examples can be built (which may be slow) by passing -DBTSTACK_EXAMPLE_TYPE=all Freertos versions can only be built if FREERTOS_KERNEL_PATH is defined.

AppDescription
picow_bt_example_a2dp_sink_demoA2DP Sink - Receive Audio Stream and Control Playback.
picow_bt_example_a2dp_source_demoA2DP Source - Stream Audio and Control Volume.
picow_bt_example_ancs_client_demoLE ANCS Client - Apple Notification Service.
picow_bt_example_att_delayed_responseLE Peripheral - Delayed Response.
picow_bt_example_audio_duplexAudio Driver - Forward Audio from Source to Sink.
picow_bt_example_avrcp_browsing_clientAVRCP Browsing - Browse Media Players and Media Information.
picow_bt_example_dut_mode_classicTesting - Enable Device Under Test (DUT.c) Mode for Classic.
picow_bt_example_gap_dedicated_bondingGAP bonding
picow_bt_example_gap_inquiryGAP Classic Inquiry.
picow_bt_example_gap_le_advertisementsGAP LE Advertisements Scanner.
picow_bt_example_gap_link_keysGAP Link Key Management (Classic.c).
picow_bt_example_gatt_battery_queryGATT Battery Service Client.
picow_bt_example_gatt_browserGATT Client - Discover Primary Services.
picow_bt_example_gatt_counterGATT Server - Heartbeat Counter over GATT.
picow_bt_example_gatt_device_information_queryGATT Device Information Service Client.
picow_bt_example_gatt_heart_rate_clientGATT Heart Rate Sensor Client.
picow_bt_example_gatt_streamer_serverPerformance - Stream Data over GATT (Server.c).
picow_bt_example_hfp_ag_demoHFP AG - Audio Gateway.
picow_bt_example_hfp_hf_demoHFP HF - Hands-Free.
picow_bt_example_hid_host_demoHID Host Classic.
picow_bt_example_hid_keyboard_demoHID Keyboard Classic.
picow_bt_example_hid_mouse_demoHID Mouse Classic.
picow_bt_example_hog_boot_host_demoHID Boot Host LE.
picow_bt_example_hog_host_demoHID Host LE.
picow_bt_example_hog_keyboard_demoHID Keyboard LE.
picow_bt_example_hog_mouse_demoHID Mouse LE.
picow_bt_example_hsp_ag_demoHSP AG - Audio Gateway.
picow_bt_example_hsp_hs_demoHSP HS - Headset.
picow_bt_example_le_credit_based_flow_control_mode_clientLE Credit-Based Flow-Control Mode Client - Send Data over L2CAP.
picow_bt_example_le_credit_based_flow_control_mode_serverLE Credit-Based Flow-Control Mode Server - Receive data over L2CAP.
picow_bt_example_led_counterHello World - Blinking a LED without Bluetooth.
picow_bt_example_le_mitmLE Man-in-the-Middle Tool.
picow_bt_example_le_streamer_clientPerformance - Stream Data over GATT (Client.c).
picow_bt_example_mod_playerAudio Driver - Play 80's MOD Song.
picow_bt_example_nordic_spp_le_counterLE Nordic SPP-like Heartbeat Server.
picow_bt_example_nordic_spp_le_streamerLE Nordic SPP-like Streamer Server.
picow_bt_example_sdp_general_querySDP Client - Query Remote SDP Records.
picow_bt_example_sdp_rfcomm_querySDP Client - Query RFCOMM SDP record.
picow_bt_example_sine_playerAudio Driver - Play Sine.
picow_bt_example_sm_pairing_centralLE Central - Test Pairing Methods.
picow_bt_example_sm_pairing_peripheralLE Peripheral - Test Pairing Methods.
picow_bt_example_spp_and_gatt_counterDual Mode - SPP and LE Counter.
picow_bt_example_spp_and_gatt_streamerDual Mode - SPP and LE streamer.
picow_bt_example_spp_counterSPP Server - Heartbeat Counter over RFCOMM.
picow_bt_example_spp_flowcontrolSPP Server - RFCOMM Flow Control.
picow_bt_example_spp_streamer_clientPerformance - Stream Data over SPP (Client.c).
picow_bt_example_spp_streamerPerformance - Stream Data over SPP (Server.c).
picow_bt_example_ublox_spp_le_counterLE u-blox SPP-like Heartbeat Server.

Some Standalone Bluetooth examples (without all the common example build infrastructure) are also available:

AppDescription
picow_ble_temp_sensorReads from the on board temperature sensor and sends notifications via BLE
picow_ble_temp_sensor_with_wifiSame as above but also connects to Wi-Fi and starts an "iperf" server
picow_ble_temp_readerConnects to on of the above "sensors" and reads the temperature

PIO

AppDescription
hello_pioAbsolutely minimal example showing how to control an LED by pushing values into a PIO FIFO.
apa102Rainbow pattern on on a string of APA102 addressable RGB LEDs.
differential_manchesterSend and receive differential Manchester-encoded serial (BMC).
hub75Display an image on a 128x64 HUB75 RGB LED matrix.
i2cScan an I2C bus.
ir_necSending and receiving IR (infra-red) codes using the PIO.
logic_analyserUse PIO and DMA to capture a logic trace of some GPIOs, whilst a PWM unit is driving them.
manchester_encodingSend and receive Manchester-encoded serial.
pio_blinkSet up some PIO state machines to blink LEDs at different frequencies, according to delay counts pushed into their FIFOs.
pwmPulse width modulation on PIO. Use it to gradually fade the brightness of an LED.
spiUse PIO to erase, program and read an external SPI flash chip. A second example runs a loopback test with all four CPHA/CPOL combinations.
squarewaveDrive a fast square wave onto a GPIO. This example accesses low-level PIO registers directly, instead of using the SDK functions.
st7789_lcdSet up PIO for 62.5 Mbps serial output, and use this to display a spinning image on a ST7789 serial LCD.
quadrature_encoderA quadrature encoder using PIO to maintain counts independent of the CPU.
uart_rxImplement the receive component of a UART serial port. Attach it to the spare Arm UART to see it receive characters.
uart_txImplement the transmit component of a UART serial port, and print hello world.
ws2812Examples of driving WS2812 addressable RGB LEDs.
additionAdd two integers together using PIO. Only around 8 billion times slower than Cortex-M0+.

PWM

AppDescription
hello_pwmMinimal example of driving PWM output on GPIOs.
led_fadeFade an LED between low and high brightness. An interrupt handler updates the PWM slice's output level each time the counter wraps.
measure_duty_cycleDrives a PWM output at a range of duty cycles, and uses another PWM slice in input mode to measure the duty cycle.

Reset

AppDescription
hello_resetPerform a hard reset on some peripherals, then bring them back up.

RTC

AppDescription
hello_rtcSet a date/time on the RTC, then repeatedly print the current time, 10 times per second, to show it updating.
rtc_alarmSet an alarm on the RTC to trigger an interrupt at a date/time 5 seconds into the future.
rtc_alarm_repeatTrigger an RTC interrupt once per minute.

SPI

AppDescription
bme280_spiAttach a BME280 temperature/humidity/pressure sensor via SPI.
mpu9250_spiAttach a MPU9250 accelerometer/gyoscope via SPI.
spi_dmaUse DMA to transfer data both to and from the SPI simultaneously. The SPI is configured for loopback.
spi_flashErase, program and read a serial flash device attached to one of the SPI controllers.
spi_master_slaveDemonstrate SPI communication as master and slave.
max7219_8x7seg_spiAttaching a Max7219 driving an 8 digit 7 segment display via SPI
max7219_32x8_spiAttaching a Max7219 driving an 32x8 LED display via SPI

System

AppDescription
hello_double_tapAn LED blink with the pico_bootsel_via_double_reset library linked. This enters the USB bootloader when it detects the system being reset twice in quick succession, which is useful for boards with a reset button but no BOOTSEL button.
narrow_io_writeDemonstrate the effects of 8-bit and 16-bit writes on a 32-bit IO register.
unique_board_idRead the 64 bit unique ID from external flash, which serves as a unique identifier for the board.

Timer

AppDescription
hello_timerSet callbacks on the system timer, which repeat at regular intervals. Cancel the timer when we're done.
periodic_samplerSample GPIOs in a timer callback, and push the samples into a concurrency-safe queue. Pop data from the queue in code running in the foreground.
timer_lowlevelExample of direct access to the timer hardware. Not generally recommended, as the SDK may use the timer for IO timeouts.

UART

AppDescription
hello_uartPrint some text from one of the UART serial ports, without going through stdio.
lcd_uartDisplay text and symbols on a 16x02 RGB LCD display via UART
uart_advancedUse some other UART features like RX interrupts, hardware control flow, and data formats other than 8n1.

USB Device

TinyUSB Examples

Most of the USB device examples come directly from the TinyUSB device examples directory here. Those that are supported on RP2040 devices are automatically included as part of the pico-examples build as targets named tinyusb_dev_<example_name>, e.g. https://github.com/hathach/tinyusb/tree/master/examples/device/hid_composite is built as tinyusb_dev_hid_composite.

At the time of writing, these examples are available:

Whilst these examples ably demonstrate how to use TinyUSB in device mode, their CMakeLists.txt is set up in a way tailored to how TinyUSB builds their examples within their source tree.

For a better example of how to configure CMakeLists.txt for using TinyUSB in device mode with the Raspberry Pi SDK see below:

SDK build example

AppDescription
dev_hid_compositeA copy of the TinyUSB device example with the same name, but with a CMakeLists.txt which demonstrates how to add a dependency on the TinyUSB device libraries with the Raspberry Pi Pico SDK

Low Level example

AppDescription
dev_lowlevelA USB Bulk loopback implemented with direct access to the USB hardware (no TinyUSB)

USB Host

All the USB host examples come directly from the TinyUSB host examples directory here. Those that are supported on RP2040 devices are automatically included as part of the pico-examples build as targets named tinyusb_host_<example_name>, e.g. https://github.com/hathach/tinyusb/tree/master/examples/host/cdc_msc_hid is built as tinyusb_host_cdc_msc_hid.

At the time of writing, there is only one host example available:

USB Dual Mode

USB Dual Mode uses PIO as a USB host controller and the RP2040 USB device controller as a device controller. All the USB dual examples come directly from the TinyUSB dual examples directory here. Those that are supported on RP2040 devices are automatically included as part of the pico-examples build as targets named tinyusb_dual_<example_name>, e.g. https://github.com/hathach/tinyusb/tree/master/examples/dual/host_hid_to_device_cdc is built as tinyusb_dual_host_hid_to_device_cdc.

At the time of writing, there is only one dual example available:

Watchdog

AppDescription
hello_watchdogSet the watchdog timer, and let it expire. Detect the reboot, and halt.