2021-01-26 13:56:30 +00:00
# Raspberry Pi Pico SDK
2021-01-20 16:44:27 +00:00
2021-01-31 22:25:55 +00:00
The Raspberry Pi Pico SDK (henceforth the SDK) provides the headers, libraries and build system
necessary to write programs for the RP2040-based devices such as the Raspberry Pi Pico
2021-01-20 16:44:27 +00:00
in C, C++ or assembly language.
2021-05-02 20:14:17 +00:00
The SDK is designed to provide an API and programming environment that is familiar both to non-embedded C developers and embedded C developers alike.
2021-01-21 16:48:00 +00:00
A single program runs on the device at a time and starts with a conventional `main()` method. Standard C/C++ libraries are supported along with
2021-01-31 22:25:55 +00:00
C level libraries/APIs for accessing all of the RP2040's hardware include PIO (Programmable IO).
2021-01-20 16:44:27 +00:00
2021-01-26 13:56:30 +00:00
Additionally the SDK provides higher level libraries for dealing with timers, synchronization, USB (TinyUSB) and multi-core programming
2021-01-20 16:44:27 +00:00
along with various utilities.
2021-01-31 22:25:55 +00:00
The SDK can be used to build anything from simple applications, to fully fledged runtime environments such as MicroPython, to low level software
such as RP2040's on-chip bootrom itself.
2021-01-20 16:44:27 +00:00
2021-01-26 13:56:30 +00:00
Additional libraries/APIs that are not yet ready for inclusion in the SDK can be found in [pico-extras ](https://github.com/raspberrypi/pico-extras ).
2021-01-20 16:44:27 +00:00
# Documentation
See [Getting Started with the Raspberry Pi Pico ](https://rptl.io/pico-get-started ) for information on how to setup your
hardware, IDE/environment and for how to build and debug software for the Raspberry Pi Pico
2021-01-31 22:25:55 +00:00
and other RP2040-based devices.
2021-01-20 16:44:27 +00:00
2021-01-26 13:56:30 +00:00
See [Raspberry Pi Pico C/C++ SDK ](https://rptl.io/pico-c-sdk ) to learn more about programming using the
2021-01-31 22:25:55 +00:00
SDK, to explore more advanced features, and for complete PDF-based API documentation.
2021-01-20 16:44:27 +00:00
2021-01-31 22:25:55 +00:00
See [Online Raspberry Pi Pico SDK API docs ](https://rptl.io/pico-doxygen ) for HTML-based API documentation.
2021-01-20 16:44:27 +00:00
# Example code
See [pico-examples ](https://github.com/raspberrypi/pico-examples ) for example code you can build.
# Quick-start your own project
2021-01-31 22:25:55 +00:00
These instructions are extremely terse, and Linux-based only. For detailed steps,
2021-01-26 13:56:30 +00:00
instructions for other platforms, and just in general, we recommend you see [Raspberry Pi Pico C/C++ SDK ](https://rptl.io/pico-c-sdk )
2021-01-20 16:44:27 +00:00
2021-01-31 21:31:40 +00:00
1. Install CMake (at least version 3.13), and GCC cross compiler
2021-01-20 16:44:27 +00:00
```
2021-01-21 16:41:50 +00:00
sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi
2021-01-20 16:44:27 +00:00
```
2021-01-26 13:56:30 +00:00
1. Set up your project to point to use the Raspberry Pi Pico SDK
2021-02-17 13:46:24 +00:00
* Either by cloning the SDK locally (most common) :
2021-01-26 13:56:30 +00:00
1. `git clone` this Raspberry Pi Pico SDK repository
2021-01-20 16:44:27 +00:00
1. Copy [pico_sdk_import.cmake ](https://github.com/raspberrypi/pico-sdk/blob/master/external/pico_sdk_import.cmake )
from the SDK into your project directory
2. Set `PICO_SDK_PATH` to the SDK location in your environment, or pass it (`-DPICO_SDK_PATH=`) to cmake later.
3. Setup a `CMakeLists.txt` like:
```cmake
2021-01-31 21:31:40 +00:00
cmake_minimum_required(VERSION 3.13)
2021-01-20 16:44:27 +00:00
# initialize the SDK based on PICO_SDK_PATH
# note: this must happen before project()
include(pico_sdk_import.cmake)
project(my_project)
2021-01-26 13:56:30 +00:00
# initialize the Raspberry Pi Pico SDK
2021-01-20 16:44:27 +00:00
pico_sdk_init()
# rest of your project
```
2021-02-17 13:46:24 +00:00
* Or with the Raspberry Pi Pico SDK as a submodule :
2021-01-20 16:44:27 +00:00
1. Clone the SDK as a submodule called `pico-sdk`
1. Setup a `CMakeLists.txt` like:
```cmake
2021-01-31 21:31:40 +00:00
cmake_minimum_required(VERSION 3.13)
2021-01-20 16:44:27 +00:00
2021-01-26 13:56:30 +00:00
# initialize pico-sdk from submodule
2021-01-20 16:44:27 +00:00
# note: this must happen before project()
include(pico-sdk/pico_sdk_init.cmake)
project(my_project)
2021-01-26 13:56:30 +00:00
# initialize the Raspberry Pi Pico SDK
2021-01-20 16:44:27 +00:00
pico_sdk_init()
# rest of your project
```
2021-03-02 21:37:27 +00:00
* Or with automatic download from GitHub :
2021-01-20 16:44:27 +00:00
1. Copy [pico_sdk_import.cmake ](https://github.com/raspberrypi/pico-sdk/blob/master/external/pico_sdk_import.cmake )
from the SDK into your project directory
1. Setup a `CMakeLists.txt` like:
```cmake
2021-01-31 21:31:40 +00:00
cmake_minimum_required(VERSION 3.13)
2021-01-20 16:44:27 +00:00
2021-01-26 13:56:30 +00:00
# initialize pico-sdk from GIT
2021-01-20 16:44:27 +00:00
# (note this can come from environment, CMake cache etc)
set(PICO_SDK_FETCH_FROM_GIT on)
# pico_sdk_import.cmake is a single file copied from this SDK
# note: this must happen before project()
include(pico_sdk_import.cmake)
project(my_project)
2021-01-26 13:56:30 +00:00
# initialize the Raspberry Pi Pico SDK
2021-01-20 16:44:27 +00:00
pico_sdk_init()
# rest of your project
```
2021-02-17 13:46:24 +00:00
1. Write your code (see [pico-examples ](https://github.com/raspberrypi/pico-examples ) or the [Raspberry Pi Pico C/C++ SDK ](https://rptl.io/pico-c-sdk ) documentation for more information)
2021-01-20 16:44:27 +00:00
About the simplest you can do is a single source file (e.g. hello_world.c)
```c
#include < stdio.h >
#include "pico/stdlib.h"
int main() {
setup_default_uart();
printf("Hello, world!\n");
return 0;
}
```
And add the following to your `CMakeLists.txt` :
```cmake
add_executable(hello_world
hello_world.c
)
# Add pico_stdlib library which aggregates commonly used features
target_link_libraries(hello_world pico_stdlib)
# create map/bin/hex/uf2 file in addition to ELF.
pico_add_extra_outputs(hello_world)
```
2021-01-26 13:56:30 +00:00
Note this example uses the default UART for _stdout_ ;
if you want to use the default USB see the [hello-usb ](https://github.com/raspberrypi/pico-examples/tree/master/hello_world/usb ) example.
2021-01-20 16:44:27 +00:00
2021-02-17 13:46:24 +00:00
1. Setup a CMake build directory.
For example, if not using an IDE:
```
$ mkdir build
$ cd build
$ cmake ..
```
1. Make your target from the build directory you created.
2021-01-20 16:44:27 +00:00
```sh
$ make hello_world
```
2021-02-17 13:46:24 +00:00
1. You now have `hello_world.elf` to load via a debugger, or `hello_world.uf2` that can be installed and run on your Raspberry Pi Pico via drag and drop.