Быстрый старт Raspberry Pi Pico на Linux Печать
Добавил(а) microsin   

Скачайте документ с описанием быстрого старта [1]. Далее будут инструкции, которые описаны в разделе "Manually Configure your Environment" этого документа.

[Скачайте SDK и примеры]

1. Репозиторий Pico Examples предоставляет несколько примеров приложений, написанных с помощью SDK. Для клонирования этих репозиториев создайте директорию pico в любом месте на диске, где вы намереваетесь хранить свои файлы, связанные с Raspberry Pi Pico. Описанные ниже команды предполагают, что вы создали подкаталог с именем pico в вашей домашней директории:

$ mkdir ~/pico

2. Выполните клонирование git-репозиториев pico-sdk и pico-examples в созданную папку pico:

$ cd ~/pico
$ git clone https://github.com/raspberrypi/pico-sdk.git --branch master
$ cd pico-sdk
$ git submodule update --init
$ cd ..
$ git clone https://github.com/raspberrypi/pico-examples.git --branch master

[Установите тулчейн]

3. Чтобы выполнить сборки приложений в каталоге pico-examples, вам нужно установить некоторые дополнительные инструменты. Чтобы собрать проекты, вам нужен CMake, кроссплатформенная среда для сборки кода, а также ARM GNU Toolchain. Запустите следующую команду для установки этих зависимостей:

$ sudo apt update
$ sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential

Пользователям Ubuntu и Debian может дополнительно понадобиться выполнить установку (на моей установленной Ubuntu 24.04 это не понадобилось):

$ apt install g++ libstdc++-arm-none-eabi-newlib

[Сборка программы Blink]

4. Из созданной ранее директории pico перейдите в её подкаталог pico-examples и создайте в нем директорию build:

$ cd pico-examples
$ mkdir build
$ cd build

5. Установите переменную окружения PICO_SDK_PATH, предполагая, что вы клонировали pico-sdk и pico-examples в одну и ту же директорию:

$ export PICO_SDK_PATH=pico-sdk

Примечание: в этом руководстве мы используем относительный путь pico-sdk в директорию репозитория SDK для переменной окружения PICO_SDK_PATH. По какой-нибудь причине у вас может быть другая структура каталогов. Поэтому в зависимости от места расположения вашего репозитория вы можете заменить этот путь на другой, в том числе и абсолютный.

6. Выполните команду для подготовки к сборке:

$ cmake ..
Using PICO_SDK_PATH from environment ('pico-sdk')
PICO_SDK_PATH is ~/pico/pico-sdk
Defaulting platform (PICO_PLATFORM) to 'rp2040' since not specified.
...

$ cmake ..
Using PICO_SDK_PATH from environment ('pico-sdk')
PICO_SDK_PATH is ~/pico/pico-sdk
Defaulting platform (PICO_PLATFORM) to 'rp2040' since not specified.
Defaulting target board (PICO_BOARD) to 'pico' since not specified.
Using board configuration from ~/pico/pico-sdk/src/boards/include/boards/pico.h
Pico Platform (PICO_PLATFORM) is 'rp2040'.
-- Defaulting build type to 'Release' since not specified.
Defaulting compiler (PICO_COMPILER) to 'pico_arm_cortex_m0plus_gcc'
 since not specified.
Configuring toolchain based on PICO_COMPILER 'pico_arm_cortex_m0plus_gcc'
Defaulting PICO_GCC_TRIPLE to 'arm-none-eabi'
-- The C compiler identification is GNU 13.2.1
-- The CXX compiler identification is GNU 13.2.1
-- The ASM compiler identification is GNU
-- Found assembler: /usr/bin/arm-none-eabi-gcc
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/arm-none-eabi-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/arm-none-eabi-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
Build type is Release
-- Found Python3: ~/.pyenv/shims/python3 (found version "3.13.0") found
 components: Interpreter TinyUSB available at
 ~/pico/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040;
  enabling build support for USB.
BTstack available at ~/pico/pico-sdk/lib/btstack
cyw43-driver available at ~/pico/pico-sdk/lib/cyw43-driver
lwIP available at ~/pico/pico-sdk/lib/lwip
mbedtls available at ~/pico/pico-sdk/lib/mbedtls
CMake Warning at ~/pico/pico-sdk/tools/Findpicotool.cmake:30 (message):
  No installed picotool with version 2.1.1 found - building from source
It is recommended to build and install picotool separately, or to set PICOTOOL_FETCH_FROM_GIT_PATH to a common directory for all your SDK projects Call Stack (most recent call first): ~/pico/pico-sdk/tools/CMakeLists.txt:138 (find_package) ~/pico/pico-sdk/tools/CMakeLists.txt:493 (pico_init_picotool) ~/pico/pico-sdk/src/cmake/on_device.cmake:56 (picotool_postprocess_binary) blink/CMakeLists.txt:13 (pico_add_extra_outputs)
Downloading Picotool Only building blink_any for non W boards as PICO_CYW43_SUPPORTED is not set Skipping encrypted example which is unsupported on this platform Skipping hello_dcp example which is unsupported on this platform Skipping runtime_flash_permissions example which is unsupported on this platform Skipping dvi_out_hstx_encoder example which is unsupported on this platform Skipping spi_lcd example which is unsupported on this platform Skipping multicore_doorbell example which is unsupported on this platform Skipping hello_otp example which is unsupported on this platform Skipping boot_info example which is unsupported on this platform Skipping universal examples as PICO_RISCV_TOOLCHAIN_PATH and PICO_ARM_TOOLCHAIN_PATH are not defined Skipping TinyUSB dual examples, as TinyUSB hw/mcu/raspberry_pi/Pico-PIO-USB submodule unavailable Skipping SHA256 examples as pico_sha256 or pico_mbedtls unavailable Skipping FreeRTOS examples as FREERTOS_KERNEL_PATH not defined -- Configuring done (3.8s) -- Generating done (1.4s) -- Build files have been written to: ~/pico/pico-examples/build

Важное замечание: SDK по умолчанию собирает бинарники для Raspberry Pi Pico. Чтобы выполнить сборку для другой платы, передайте опцию -DPICO_BOARD=board для CMake, заменив board на имя платы, которую вы хотите использовать. Для сборки бинарного кода для Pico 2 передайте -DPICO_BOARD=pico2. Для сборки бинарника для Pico W передайте -DPICO_BOARD=pico_w. Также вы можете указать сеть Wi-Fi и пароль для неё, что понадобится для примеров Pico W, путем передачи опций -DWIFI_SSID="ваша_сеть"-DWIFI_PASSWORD="ваш_пароль".

7. Теперь вы можете выполнить сборку всех примеров приложений. Ниже будут показаны команды для сборки проекта blink (его код находится в файле pico-examples/blink/blink.c). Чтобы выполнить сборку для определенного подкаталога примеров, перейдите в соответствующий подкаталог перед запуском make.

Для нашего случая мы будем выполнять сборку только blink, поэтому сначала перейдем в каталог blink, а затем запустим make.

$ cd blink
$ make -j4

Примечание: в этом примере для команды make используется опция -j4, что ускорит сборку путем выполнения четырех заданий параллельно. Если вы выполняете сборку на хосте Raspberry Pi 5, то вполне можете использовать её 4 ядра.

Результатом сборки будут следующие файлы в каталоге pico-examples/build/blink:

Файл Описание
blink.bin Сырой двоичный код программы.
blink.dis Дизассемблированный код программы.
blink.elf Код, используемый отладчиком.
blink.elf.map Карта памяти программы.
blink.hex Двоичный код программы в HEX-формате.
blink.uf2 Файл UF2 [4] для копирования на флешку (USB Mass Storage Device), которой представится наш микроконтроллер Raspberry Pi при подключении платы к USB.

[Загрузка и запуск скомпилированного примера]

8. Для загрузки скомпилированной программы в плату с микроконтроллером Raspberry Pi подключите её через USB к компьютеру, смонтируйте его устройство как USB Mass Storage Device и скопируйте файл *.uf2 на эту флешку. Моя платка Raspberry Pi Pico 2020 на Ubintu смонтировалась в каталог /media/user/RPI-RP2.

Raspberry Pi Pico2020 connected USB

Нажмите и удерживайте кнопку BOOTSEL, когда подключаете вашу платку кабелем micro-USB, чтобы заставить загрузчик активировать USB Mass Storage Mode.

Содержимое "флешки", которой представилась наша плата:

$ ls -la /media/$USER/RPI-RP2/
total 28
drwxr-xr-x  2 user      user      16384 янв  1  1970 .
drwxr-x---+ 3 root      root       4096 апр 11 10:56 ..
-r--r--r--  1 user      user        241 сен  5  2008 INDEX.HTM
-r--r--r--  1 user      user         62 сен  5  2008 INFO_UF2.TXT

9. Скопируйте файл *.uf2 на вашу платку:

$ cp blink.uf2 /media/$USER/RPI-RP2

После выполнения этой команды устройство немедленно запустит программу, и зеленый светодиод на плате начнет мигать.

Примечание: вы можете использовать утилиту picotool для загрузки бинарника UF2 в свою платку Pico, см. "Appendix B" документа [1].

В зависимости от платформы, на которой вы выполняете компиляцию двоичного кода, вам может понадобиться вручную смонтировать USB-устройство флешки платки (mass storage device, USB MSD):

$ dmesg | tail
[ 371.973555] sd 0:0:0:0: [sda] Attached SCSI removable disk
$ sudo mkdir -p /mnt/pico
$ sudo mount /dev/sda1 /mnt/pico

Если вы можете видеть файлы в каталоге /mnt/pico, то USB Mass Storage Device смонтировалось корректно:

$ ls /mnt/pico/
INDEX.HTM INFO_UF2.TXT

Копирование вашего файла blink.uf2 в устройство:

$ sudo cp blink.uf2 /mnt/pico
$ sudo sync

Примечание: последняя команда sudo sync может не понадобиться.

После этого микроконтроллер автоматически отключит USB Mass Storage Device и запустит ваш код, но для полной безопасности следует также вручную отмонтировать устройство флешки:

$ sudo umount /mnt/pico

Примечание: отключение питания (кабеля micro-USB) не удалит код вашей программы из памяти устройства. При восстановлении питания платы, если не удерживать при этом кнопку BOOTSEL, программа снова запустится, и светодиод начнет мигать.

[Использование других плат]

В некоторых случаях на плате может не быть кнопки BOOTSEL. Тогда понадобятся другие способы загрузки вашего кода, что должно быть описано в руководстве вашей платы:

• На большинстве плат Pico есть интерфейс SWD (см. "Appendix A: Debugprobe" [1]) который сбросит плату и загрузит код без необходимости нажатия на кнопку.
• Может быть другой способ прошивки, путем подтяжки к лог. 0 вывода flash CS (это как раз то, что делает кнопка BOOTSEL на платах Pico), для этого может быть предусмотрена отдельная перемычка.
• На некоторых платах есть кнопка сброса RESET, но нет кнопки BOOTSEL; может понадобиться двойное нажатие кнопки сброса для активизации загрузчика.

Во всех случаях лучше всего проконсультироваться с документацией производителя платы, где должен описываться самый лучший способ загрузки firmware в вашу плату.

[Создание вручную вашего собственного проекта]

1. Создайте каталог проекта test рядом с каталогом pico-sdk:

$ cd ~/pico
$ ls -la
total 16
drwxr-xr-x 7   user user 224 6 Apr 10:41 ./
drwx------@ 27 user user 864 6 Apr 10:41
drwxr-xr-x 10  user user 320 6 Apr 09:29 pico-examples/
drwxr-xr-x 13  user user 416 6 Apr 09:22 pico-sdk/
$ mkdir test
$ cd test

2. Создайте в этом каталоге файл test.c:

#include < stdio.h>
#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "pico/binary_info.h"

const uint LED_PIN = 25;①

int main() { bi_decl(bi_program_description("This is a test binary."));② bi_decl(bi_1pin_with_name(LED_PIN, "On-board LED")); stdio_init_all(); gpio_init(LED_PIN); gpio_set_dir(LED_PIN, GPIO_OUT);
while (1) { gpio_put(LED_PIN, 0); sleep_ms(250); gpio_put(LED_PIN, 1); puts("Hello World\n"); sleep_ms(1000); } }

Примечания:

① Установленный на плате LED подключен к GP25 на Pico и Pico 2. Если вы выполняете сборку для Pico W, то LED подключен к CYW43_WL_GPIO_LED_PIN. Для дополнительной информации см. пример Pico W blink в Github репозитории Pico Examples (файл picow_blink.c).
② Эти строки кода добавят строки к бинарнику, и они будут видны с помощью picotool, см. Appendix B [1].

Файл CMakeLists.txt:

cmake_minimum_required(VERSION 3.13)include(pico_sdk_import.cmake)
project(test_project C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
pico_sdk_init()
add_executable(test
   test.c
)
pico_enable_stdio_usb(test 1)①
pico_enable_stdio_uart(test 1)②
pico_add_extra_outputs(test)
target_link_libraries(test pico_stdlib)

① Разрешает вывод через USB.
② Разрешает вывод через UART.

Затем скопируйте файл pico_sdk_import.cmake из папки external в вашу папку проекта test, находящуюся в инсталляции pico-sdk:

$ cp pico-sdk/external/pico_sdk_import.cmake .

Вы должны увидеть в папке проекта что-то подобное:

$ ls -la
total 24
drwxr-xr-x  5 user user 160  6 Apr 10:46 ./
drwxr-xr-x  7 user user 224  6 Apr 10:41
-rw-r--r--@ 1 user user 394  6 Apr 10:37 CMakeLists.txt
-rw-r--r--  1 user user 2744 6 Apr 10:40 pico_sdk_import.cmake
-rw-r--r--  1 user user 383  6 Apr 10:37 test.c

Теперь вы можете выполнить сборку точно так же, как это делалось в проекте "Hello World".

$ mkdir build
$ cd build
$ export PICO_SDK_PATH=pico-sdk
$ cmake ..
$ make

По умолчанию SDK выполнит сборку бинарного кода для Raspberry Pi Pico. Чтобы выполнить сборку для другой платы, передайте CMake опцию -DPICO_BOARD=board, заменив board на имя платы, которую используете. Для Pico 2 передайте -DPICO_BOARD=pico2, для Pico W передайте -DPICO_BOARD=pico_w. Чтобы указать сеть Wi-Fi и пароль для неё, к которой должна подключаться Pico W, передайте -DWIFI_SSID="ваша_сеть" -DWIFI_PASSWORD="ваш_пароль".

Процесс make сгенерирует несколько разных файлов. В следующей таблице перечислены некоторые из них, имеющие определенное назначение.

Расширение файла Описание
.bin Двоичный файл, где содержатся код и данные программы.
.elf Полный вывод программы, содержащий отладочную информацию (этот файл использует отладчик).
.uf2 Код и данные программы в формате UF2 [4], который предназначен для записи на "флешку" загрузчика, когда он монтирует в системе свое устройство USB MSD.
.dis Дизассемблированный код скомпилированного бинарника.
.hex Двоичный код программы в HEX-формате.
.map Файл карты памяти, соответствующий файлу .elf. В карте памяти описываются сегменты в памяти, куда линкер помещает информацию кода программы.

Замечания:

• UF2 (USB Flashing Format) это разработанный Microsoft формат файла, используемый микроконтроллерами Raspberry Pi для прошивки с помощью загрузчика и USB. Для дополнительной информации см. репозиторий спецификации Microsoft UF2 [4].
• Можно выполнить сборку так, чтобы код размещался в SRAM вместо памяти Flash. Для этого вы можете либо настроить сборку cmake передачей -DPICO_NO_FLASH=1, либо вы можете добавить pico_set_binary_type(TARGET_NAME no_flash) для управления сборкой в ваш файл CMakeLists.txt. Вы можете загрузить бинарный код RAM для микроконтроллера Raspberry Pi через UF2. Например, если на вашей плате нет микросхемы flash, то вы можете загрузить бинарник, который работает в RAM микроконтроллера, используя UF2, простым указанием адресов, где должны располагаться данные. Обратите внимание, что вы можете загружать код программы только в RAM или только в FLASH, но не в оба этих места памяти.

[Ссылки]

1. Getting started with Raspberry Pi Pico-series.
2. FreeRTOS: SMP Demos for the Raspberry Pi Pico Board.
3. FreeRTOS / FreeRTOS-SMP-Demos - репозиторий GitHub.
4. microsoft / uf2 - стандарт файла загрузчика для записи на USB MSD.