В 2012 году организация Raspberry Pi Foundation представила миру свой одноплатный компьютер Raspberry Pi, который первоначально предназначался для обучения детей основам компьютерной техники и программирования, но позже для него нашлось и множество других применений. Спустя 9 лет после этого, в 2021 году, свет увидела микроконтроллерная плата Raspberry Pi Pico. По сути, это достаточно бюджетный микроконтроллер, цены на который начинаются от $4. Однако несмотря на низкую цену он содержит в своем составе двухъядерный ARM процессор и цифровые/аналоговые контакты ввода/вывода, способные выполнять еще и ряд специальных функций. Поэтому данный микроконтроллер отлично подходит для применения во встраиваемых системах.
В данной статье мы рассмотрим основы программирования платы Raspberry Pi Pico с помощью C/C++ SDK (Software Development Kit – набор инструментальных средств разработки программного обеспечения). Также на нашем сайте вы можете посмотреть всю серию обучающих статей по Raspberry Pi Pico.
Краткое введение в Raspberry Pi Pico
Сердцем платы Raspberry Pi Pico является двухъядерный ARM процессор на ядре Cortex M0+, который может быть разогнан до частоты 133MHz. Плата содержит 264 Кб ОЗУ (SRAM) и 2 Мб встроенной флеш-памяти, которую можно увеличить до 16 Мб с помощью внешнего модуля памяти, подключаемой через шину Quad-SPI.
Плата Raspberry Pi Pico содержит 26 многофункциональных контактов ввода/вывода (GPIOs), которые работают с цифровыми уровнями напряжения 3.3v, три из этих контактов могут работать в качестве аналоговых входов, то есть выполнять функции АЦП в плате. Плата может получать питание через разъем micro-USB, внешних источников питания или батареек. Также важным достоинством платы является то, что не требуется никакого внешнего программатора для ее программирования поскольку она поддерживает технологию “Drag-and-Drop” и автоматически определяется компьютером при ее подключении по USB (технология mass storage).
Внешний вид платы Raspberry Pi Pico с обозначением элементов на ней показан на следующем рисунке.
Как мы видим из представленного рисунка, плата Raspberry Pi Pico имеет 40 контактов, 26 из которых являются многофункциональными контактами ввода/вывода (GPIOs). Также плата содержит встроенный светодиод, подключенный к контакту GPIO25. Одним из недостатков платы является отсутствие у нее кнопки сброса, но зато у нее есть контакт RUN, который выполняет функцию контакта сброса если мы замыкаем его на землю (Ground).
Назначение контактов (распиновка) платы Raspberry Pi Pico представлено на следующем рисунке.
Установка C/C++ SDK для Raspberry Pi Pico на Linux систему
Для установки C/C++ SDK для программирования платы Raspberry Pi Pico автор данного проекта (ссылка на оригинал приведена в конце статьи) использовал операционную систему Ubuntu 20.04 LTS.
Организация Raspberry Pi Foundation поставляет скрипт установки для операционных систем Linux и Raspberry Pi OS, который автоматически создает и устанавливает все необходимые компоненты для C/C++ SDK и кросс-платформенной IDE Visual Studio Code. Для скачивания скрипта установки (setup script) C/C++ SDK выполните следующую последовательность команд:
1 2 3 4 5 |
mkdir ~/raspberry-pi-pico cd ~/raspberry-pi-pico wget https://raw.githubusercontent.com/raspberrypi/pico-setup/master/pico_setup.sh chmod +x pico_setup.sh ./pico_setup.sh |
Примечание: на своей операционной системе Ubuntu 20.04 LTS - 64Bit автор проекта столкнулся с проблемой, суть которой заключалась в том, что скрипт установки скачивал и устанавливал Visual Studio Code IDE. Поэтому он блокировал загрузку VSCode IDE и потом скачивал и устанавливал IDE отдельно.
Также, как и скрипт установки, мы можем установить компоненты SDK и IDE последовательно, один за другим, используя приведенные ниже команды.
Установка необходимых компонентов
Для этого выполните следующую последовательность команд.
1 2 3 |
sudo apt update sudo apt install git cmake gcc-arm-none-eabi gcc g++ libstdc++-arm-none-eabi-newlib sudo apt install automake autoconf build-essential texinfo libtool libftdi-dev libusb-1.0-0-dev |
Скачивание C/C++ SDK с репозитория и обновление путей для SDK
Для этого выполните следующую последовательность команд.
1 2 3 4 5 6 7 8 9 10 11 |
mkdir ~/raspberry-pi-pico cd ~/raspberry-pi-pico mkdir pico cd pico git clone -b master https://github.com/raspberrypi/pico-sdk.git cd pico-sdk git submodule update --init cd .. git clone -b master https://github.com/raspberrypi/pico-examples.git git clone -b master https://github.com/raspberrypi/pico-examples.git git clone -b master https://github.com/raspberrypi/pico-examples.git |
После скачивания SDK и репозитория с примерами настало время обновить Environment variable (переменную среды) для каждого пути репозитория (repository’s path) используя параметры PICO_SDK_PATH”, “PICO_EXAMPLES_PATH”, “PICO_EXTRAS_PATH”, “PICO_PLAYGROUND_PATH”. Также пользователи могут обновить environment variable когда они работают на Raspberry Pi Pico.
1 2 3 4 |
export PICO_SDK_PATH=/home/<user-name>/raspberry-pi-pico/pico/pico-sdk export PICO_EXAMPLES_PATH=/home/<user-name>/raspberry-pi-pico/pico/pico-examples export PICO_EXTRAS_PATH=/home/<user-name>/raspberry-pi-pico/pico/pico-extras export PICO_PLAYGROUND_PATH=/home/<user-name>/raspberry-pi-pico/pico/pico-playground |
Скачивание и установка Picotool и Picoprobe
Нам необходимо скачать и установить Picotool чтобы извлекать информацию из двоичного кода Raspberry Pi Pico.
1 2 3 4 5 6 7 8 9 |
cd ~/raspberry-pi-pico/pico git clone -b master https://github.com/raspberrypi/picotool.git cd picotool mkdir build cd build export PICO_SDK_PATH=/home/<user-name>/raspberry-pi-pico/pico/pico-sdk cmake ../ make sudo cp picotool /usr/local/bin/ |
После установки Picotool можно приступать к скачиванию и установке Picobrobe. С помощью программного обеспечения Picoprobe мы сможем использовать плату Raspberry Pi Pico в качестве устройства для программирования/отладки другой платы Raspberry Pi Pico.
1 2 3 4 5 6 7 8 |
cd ~/raspberry-pi-pico/pico git clone -b master https://github.com/raspberrypi/picotool.git cd picoprobe mkdir build cd build export PICO_SDK_PATH=/home/<user-name>/raspberry-pi-pico/pico/pico-sdk cmake ../ make |
Скачивание и установка компилятора OpenOCD
После выполнения предыдущих шагов настало время для скачивания и установки компилятора OpenOCD, который будет использоваться для отладки программ (debugging) для Raspberry Pi Pico.
1 2 3 4 5 6 7 |
cd ~/raspberry-pi-pico/pico git clone https://github.com/raspberrypi/openocd.git --branch rp2040 --depth=1 cd openocd ./bootstrap ./configure --enable-picoprobe --enable-ftdi --enable-sysfsgpio --enable-bcm2835gpio make sudo make install |
Скачивание и установка Visual Studio Code IDE
После скачивания и установки всех необходимых компонентов SDK и отладчика можно приступать к установке кросс-платформенной IDE Visual Studio Code для быстрой и простой разработки программ. Поскольку автор проекта использовал операционную систему Ubuntu 20.04LTS - 64 bit, он скачал файл code_1.xx.xx_amd64.deb с официального веб-сайта Visual Studio и с его помощью установил VSCode IDE. После того, как установка VSCode IDE будет завершена, нам необходимо установить ряд расширений для IDE (интегрированной среды разработки), чтобы мы могли производить отладку программ для Raspberry Pi Pico из VSCode IDE.
1 2 3 4 5 |
cd ~/raspberry-pi-pico/pico sudo apt install libx11-xcb1 libxcb-dri3-0 libdrm2 libgbm1 libegl-mesa0 code --install-extension marus25.cortex-debug code --install-extension ms-vscode.cmake-tools code --install-extension ms-vscode.cpptools |
Компиляция первого проекта (мигание светодиодом)
Теперь, когда у нас все готово для работы, давайте попробуем скомпилировать наш первый проект – программу мигания светодиодом для платы Raspberry Pi Pico используя язык C, чтобы проверить что все необходимые нам установленные компоненты (IDE, компилятор и библиотека) работают корректно. Более подробно работу проекта можно посмотреть на видео, приведенном в конце статьи.
Создайте подкаталог “pico_workspace” внутри каталога ~/raspberry-pi-pico/ и откройте VisualStudio Code. Затем нажмите на вкладку Explorer” в верхнем левом углу или нажмите Ctrl+Shift+E и затем нажмите на “Open Folder” под вкладкой explorer. В окне Open Folder проследуйте по пути ~/raspberry-pi-pico/pico_workspace и создайте там каталог с именем “blink-led”, после чего нажмите на кнопку OK.
После создания и импортирования каталога проекта мигания светодиода (blink-led project folder) создайте файл выбрав пункт меню “File->New File или Ctrl+N” и затем нажмите Ctrl+S чтобы сохранить его как “main.c”. После сохранения файла напишите код программы мигания светодиодом в файле “main.c”.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/** * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. * * SPDX-License-Identifier: BSD-3-Clause */ #include "pico/stdlib.h" int main() { #ifndef PICO_DEFAULT_LED_PIN #warning blink example requires a board with a regular LED #else const uint LED_PIN = PICO_DEFAULT_LED_PIN; gpio_init(LED_PIN); gpio_set_dir(LED_PIN, GPIO_OUT); while (true) { gpio_put(LED_PIN, 1); sleep_ms(250); gpio_put(LED_PIN, 0); sleep_ms(250); } #endif } |
C/C++ SDK для Raspberry Pi Pico поставляется вместе с инструментом автоматизации CMake. Поэтому, после создания .C файла проекта нам необходимо создать файл “CMakeLists.txt”, который содержит инструкции, описывающие исходные файлы проекта (sources files) и цели (выполнимые файлы, библиотеки).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# Set minimum required version of CMake cmake_minimum_required(VERSION 3.12) #include build functions from Pico SDK include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake) # Set name of project (as PROJECT_NAME) and C/C++ Standards project(blink-led C CXX ASM) set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_STANDARD 17) # Creates a pico-sdk subdirectory in our project for the libraries pico_sdk_init() # point out the CMake, where to find the executable source file add_executable(${PROJECT_NAME} main.c ) # create map/bin/hex/uf2 files. pico_add_extra_outputs(${PROJECT_NAME}) # Pull in our pico_stdlib which pulls in commonly used features (gpio, timer-delay etc) target_link_libraries(${PROJECT_NAME} pico_stdlib ) |
После этого перезапустите Visual Studio Code для установки расширения Cmake для автоматической конфигурации нашего проекта мигания светодиодом. После перезапуска вы увидите лог CMake в выходном окне внизу.
1 2 3 |
[cmake] -- Configuring done [cmake] -- Generating done [cmake] -- Build files have been written to: /home/<user-name>/raspberry-pi-pico/pico_workspace/blink-led/build |
Затем нажмите на иконку Build внизу строки текущего состояния (status bar) чтобы скомпоновать проект мигания светодиодом и создать файл .uf2. Процесс компоновки проекта будет отображаться в выходном окне логов. После успешной компоновки проекта статус компоновки также будет показан в этом окне.
1 2 3 |
[build] [100%] Linking CXX executable blink-led.elf [build] [100%] Built target blink-led [build] Build finished with exit code 0 |
Примечание: убедитесь в том, что вы выбрали правильные инструментальные средства (toolchain) для кросс-компиляции “GCC x.x.x arm-none-eabi”. Если инструментальные средства неправильные, то нажмите на иконку Wrench+ScrewDriver внизу строки текущего состояния (status bar) и выберите правильный toolchain из списка как показано на следующем рисунке.
Загрузка кода программы в плату Raspberry Pi Pico
Как нам уже известно, нам не нужен никакой внешний программатор для программирования платы Raspberry Pi Pico поскольку она поддерживает технологию drag and drop. Для программирования платы нам необходимо подключить ее по USB к компьютеру и нажать на ней кнопку BOOTSEL – эту кнопку необходимо удерживать до тех пор, пока плата не определится системой, после этого кнопку можно отпустить.
Кнопка BOOTSEL на плате Raspberry Pi Pico служит для перевода платы в режим Bootloader Mass-storage system, чтобы в нее можно было загружать новую программу. После того как плата будет переведена в режим загрузки (bootloader mode), с помощью технологии Mass-storage она будет смонтирована в системе как носитель с именем RPI-RP2. Нажмите на этот смонтированный носитель RPI-RP2 и откройте его.
Теперь можно приступать к загрузке нашей программы мигания светодиодом в плату. Когда мы компоновали (build) проект, в каталоге ~/raspberry-pi-pico/pico_workspace/blink-led/build был создан двоичный файл UF2. После того, как плата Raspberry Pi Pico была смонтирована (определена) в системе, нам необходимо скопировать этот файл blink-led.uf2 на смонтированный носитель RPI-RP2, после чего плата Raspberry Pi Pico самостоятельно автоматически перезагрузится и встроенный в плату светодиод начнет мигать.
Более подробно все вопросы, рассмотренные в статье, вы можете посмотреть в представленном в конце статьи видео.
Исходный код программы на C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/** * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. * * SPDX-License-Identifier: BSD-3-Clause */ #include "pico/stdlib.h" int main() { #ifndef PICO_DEFAULT_LED_PIN #warning blink example requires a board with a regular LED #else const uint LED_PIN = PICO_DEFAULT_LED_PIN; gpio_init(LED_PIN); gpio_set_dir(LED_PIN, GPIO_OUT); while (true) { gpio_put(LED_PIN, 1); sleep_ms(250); gpio_put(LED_PIN, 0); sleep_ms(250); } #endif } |
Добрый день. Подскажите пожалуйста, у меня возникла следующая ошибка:
При выполнении команды:
robot-user@robotdesktop:~/raspberry-pi-pico/pico/picoprobe/build$ cmake ../
Ошибка:
CMake Error at FreeRTOS_Kernel_import.cmake:57 (message):
Directory '/home/robot-user/raspberry-pi-pico/pico/picoprobe/freertos' does
not contain an RP2040 port here: portable/ThirdParty/GCC/RP2040
Call Stack (most recent call first):
CMakeLists.txt:6 (include)
Точно не знаю, но попробуйте посмотреть вот это - https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/portable/ThirdParty/GCC/RP2040/README.md