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

Вот именно здесь новый Raspberry Pi Pico превосходит остальные творения Raspberry Pi Foundation. Он имеет множество отличных периферийных блоков, включая I2C, SPI, USB и многое другое. Pico содержит два быстрых ядра Arm Cortex-M0+ на специальном чипе, а также специальную подсистему, называемую Programmable I/O, или сокращенно PIO. Это позволяет программистам создавать специализированные конечные автоматы (до 8), которые могут обрабатывать задачи ввода/вывода с выводами без необходимости тонны взаимодействия с ЦП, тем самым освобождая два ядра для других задач.

Работать с Raspberry Pi Pico довольно просто, но здесь имеется несколько нюансов. Для начала при работе с этим контроллером желательно иметь SDK. Достаточно сложно просто загрузить текстовый редактор и начать программировать для платы даже с умеренно продвинутыми функциями. Комплект для разработки программного обеспечения (SDK) – это просто пакет библиотек, компилятора/компоновщика, отладчика, а иногда и фреймворка. Таким образом, вместо того, чтобы переключать определенные регистры в ассемблере и пытаться настроить ассемблер для компиляции, SDK может предоставить необходимые инструменты.
В этом руководстве рассматривается SDK C/C++, а не MicroPython, и предполагается, что разработка ведется в среде ОС на основе Debian или Ubuntu.
Итак, начните с создания нового каталога в какой-то пользовательской папке, например, в домашнем каталоге, с помощью следующей команды:
mkdir pico
Затем введите:
cd pico
Далее выполните следующие три команды для установки SDK и обновления библиотеки USB.
git clone -b master https://github.com/raspberrypi/pico-sdk.git
cd pico-sdk
git submodule update –init
Затем оставьте эту папку и перейдите в папку pico с помощью команды:
cd ..
И, наконец, клонируйте примеры в другую папку под названием pico-examples.
git clone -b master https://github.com/raspberrypi/pico-examples.git
Далее просто запустите следующие две команды, чтобы установить как CMake, так и GNU Embedded Toolchain для Arm, так код, который вы пишете, будет преобразован в машинные инструкции.
sudo apt update
sudo apt install cmake gcc-arm-none-eabi build-essential
Вот и все! Установив набор инструментов и SDK, пора начинать программировать Raspberry Pi Pico. И первое, с чего мы начнем – конечно же с мигания светодиодом. В папке pico введите:
cd pico-examples
Это нужно для просмотра примеров проектов. Затем создайте и войдите в каталог сборки с помощью:
mkdir build
cd build
Создайте переменную среды PICO_SDK_PATH:
export PICO_SDK_PATH=../../pico-sdk
И, наконец, запустите cmake с помощью:
cmake ..
По умолчанию CMake настроен на создание сборок выпуска, в которых нет информации, необходимой для отладки. Чтобы создать отладочную версию, запустите:
cmake -DCMAKE_BUILD_TYPE=Debug
Теперь мы можем запустить программу мигания. Введите:
cd blink
Это позволит перейти к папке с примерами мигания. Его содержимое должно выглядеть так:

Здесь есть два варианта сборки. Первый – просто запустить make или make -jT, где T – количество одновременных процессов (обычно количество ядер вашего процессора), поэтому в случае Raspberry Pi 4 вы должны запустить:
make -j4
И теперь вы должны увидеть файлы blink.elf и blink.uf2. Файл elf используется отладчиком, тогда как файл uf2 может быть скопирован на запоминающее устройство RP2040.

Теперь приступим к загрузке программы в устройство. Программировать Pico очень просто. Удерживая нажатой кнопку BOOTSEL на плате, подключите кабель micro USB.

Теперь вы должны увидеть устройство под названием RPI-RP2 со следующими файлами.

На рабочем столе перетащите файл uf2 из ранее использовавшейся папки build/blink на запоминающее устройство USB. Это закроет окно проводника и заставит Pico мигать своим встроенным светодиодом. Вы также можете подключить Pico таким же образом (удерживая кнопку BOOTSEL при подключении кабеля micro USB), а затем искать подключенный диск с помощью
dmesg | tail
А затем создать новый каталог для файловой системы:
sudo mkdir -p /mnt/pico
И смонтировать устройство.
sudo mount /dev/sdDp /mnt/pico
Здесь D – устройство (a, b, c и т. д.), а p – раздел (должно быть 1). Так что для Pico на sda это будет выглядеть так:
sudo mount /dev/sda1 /mnt/pico
Затем скопируйте файл с помощью:
sudo cp blink.uf2 /mnt/pico
sudo sync
А затем размонтируйте его с помощью:
sudo unmount /mnt/pico
Если у вас есть предыдущий опыт работы с C или C++, то вы знаете, что для копирования данных из одного массива в другой вам обычно требуется выполнить итерацию из исходного массива (прочитать его), а затем переместить те же данные в целевой массив. При работе с чем-то вроде Arduino Uno и цепочкой адресуемых светодиодов RGB Atmega 328p должен взять буфер данных о цвете и побитно передавать их через вывод GPIO, что означает, что ЦП больше ничего не может.
Вы также можете попробовать представить систему с двумя устройствами, одно из которых отправляет данные в Pico по некоторому протоколу, а затем Pico необходимо поместить эти данные в какой-то буфер в ОЗУ для последующего использования. Почему бы не иметь для этого выделенное оборудование, вместо того чтобы постоянно ждать поступления новых данных и затем сохранять их? Это основной принцип прямого доступа к памяти (DMA).
Вернитесь в папку pico/pico-examples/build, а затем войдите в папку dma с помощью:
cd ~/pico/pico-examples/build/dma
Вы должны увидеть три папки, относящиеся к различным примерам, а пока мы рассмотрим ту, которая называется hello_dma.
Если вы запустите здесь команду make, она соберет обычные файлы elf и uf2, которые вы можете загрузить на свою плату. Вы можете просмотреть вывод, подключив преобразователь UART к USB к контактам UART оборудования Pico и контакту заземления. Теперь посмотрим, как на самом деле работает код. Перейдите в папку с исходным кодом, введя
cd ~/pico/pico-examples/dma/hello_dma/
А затем выполните просмотр файла hello_dma.c в текстовом редакторе. Он выглядит так:

Вы можете видеть, что существует массив символов (chars), называемый src, который сохраняется во флэш-памяти, когда программа загружается на чип (потому что это const). Под ним находится указатель на место в памяти, называемое dst, в котором выделено такое же пространство, как и для постоянного массива. После вызова stdio_init_all(), который настраивает порт UART для таких функций, как printf, вы можете увидеть, что запрашивается канал DMA с именем chan. Затем со строки 27 по строку 30 создается структура dma_channel_config, которая настраивает на приращение указатель источника и назначения при каждой передаче, а также настраивается на передачу 8 бит за раз.
В вызове dma_channel_configure() устанавливаются указатели назначения и источника, а также количество передач. Как только вызов сделан, передача начинается немедленно и завершается после того, как будет передано правильное количество байтов. Поскольку в этом примере процессору больше нечего делать, dma_channel_wait_for_finish_blocking() просто ожидает завершения передачи и затем возвращается. Наконец, данные из целевого буфера распечатываются на периферийное устройство UART с помощью Put().
Raspberry Pi Pico обладает огромным потенциалом, и будет интересно увидеть, что люди могут создавать с помощью этого небольшого и дешевого устройства.
© digitrode.ru