Instalacja środowiska niezbędnego do tworzenia oprogramowania dla Raspberry Pi Pico w języku C w środowisku Windows jest możliwe, ale problematyczne. Proponuję inne rozwiązanie: zainstalować w systemie Windows podsystem WSL, a w nim zainstalować narzędzia niezbędne do programowania w języku C i C++ dla Raspberry Pi Pico. O tym jak zainstalować WSL pisałem już wcześniej (środowiska graficznego nie trzeba instalować). Aby działać swobodniei bez obaw o interferencje z innym oprogramowaniem, proponuję działać w specjalnie do tego celu przeznaczonej piaskownicy.
Po uruchomieniu instancji Linuxa przeznaczonej dla zestawu narzędzi do tworzenia programów dla Pico należy dokonać instalacji niezbędnych programów. Zaczynamy od aktualizacji środowiska:
sudo apt update
sudo apt upgrade
a następnie cały zestaw niezbędnych składników:
sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential libstdc++-arm-none-eabi-newlib
Należy pobrać także zestaw SDK. Proponuję umieścić go w folderze /opt/pico-sdk
:
sudo git clone https://github.com/raspberrypi/pico-sdk.git /opt/pico-sdk
cd /opt/pico-sdk
sudo git submodule update --init
echo 'export PICO_SDK_PATH=/opt/pico-sdk' | sudo tee -a /etc/profile.d/pico-sdk.sh
Aby zmiana w profilu zadziałała należy wylogować się i zalogować się ponownie.
Proponuję kod programów umieszczać w strukturze folderów widocznej zarówno z systemu Windows jak też z Linuxa uruchomionego pod WSL. Jeśli takim folderem będzie np.: D:\Projects\
to będzie on widoczny także jako /mnt/d/Projects/
.
W wybranym folderze należy umieścić dwa pliki:
main.c
:
#include <stdio.h>
#include "pico/stdlib.h"
void blinkLed(uint pin, uint32_t ms) {
printf("Blinking led on pin %d - %d ms\r\n", pin, ms);
gpio_put(pin, true);
sleep_ms(ms);
gpio_put(pin, false);
}
int main() {
const uint led1_pin = 25; // onboard led
const uint led2_pin = 22; // external led
gpio_init(led1_pin);
gpio_set_dir(led1_pin, GPIO_OUT);
gpio_init(led2_pin);
gpio_set_dir(led2_pin, GPIO_OUT);
stdio_init_all();
while (true) {
printf("new loop\r\n");
blinkLed(led1_pin, 500);
for(uint i = 0; i < 3; i++) {
blinkLed(led2_pin, 300);
sleep_ms(200);
}
blinkLed(led1_pin, 500);
blinkLed(led2_pin, 500);
}
}
oraz CMakeLists.txt
:
cmake_minimum_required(VERSION 3.13)
include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)
project(HelloWorld C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
pico_sdk_init()
add_executable(${PROJECT_NAME} main.c)
pico_add_extra_outputs(${PROJECT_NAME})
target_link_libraries(${PROJECT_NAME} pico_stdlib)
pico_enable_stdio_usb(${PROJECT_NAME} 1)
pico_enable_stdio_uart(${PROJECT_NAME} 0)
Kompilacja odbywa się w folderze build
. Przed pierwszą kompilacją należy w folderze, w którym znajduje się main.c
, wykonać:
mkdir build && cd build
cmake ..
make -j$(nproc)
Następne kompilacje wymagają ponownego wykonania w folderze build
polecenia:
make -j$(nproc)
Nazwa projektu znajduje się w pliku CmakeLists.txt
w deklaracji project()
np.:
project(HelloWorld C CXX ASM)
Wynikiem kompilacji będzie m.in. plik HelloWorld.uf2
. Plik ten należy umieścić w pamięci Pico. Aby to było możliwe, należy połączyć Pico z komputerem przytrzymując wciśnięty przycisk BOOTSEL w chwili włączania zasilania Pico. Po tej czynności Pico będzie widoczne dla komputera jako pamięć masowa, do której należy wgrać wynikowy plik .uf2
. Wgranie pliku spowoduje restart Pico i uruchomienie wgranego programu.