Рассмотрим поближе программируемые модули ввода-вывода (PIO) Raspberry Pi RP2040


Популярность платы Raspberry Pico на базе микроконтроллера RP2040 велика. Поэтому поговорим о программируемых модулях ввода-вывода RP2040 — функции, которая отличает ее от большинства других плат микроконтроллеров.

Каждый из двух блоков PIO или, скажем так, аппаратных интерфейсов RP2040, имеет четыре конечных автомата. Эти два блока PIO могут одновременно выполнять программы для управления GPIO и передачи необработанных данных. Итак, что делают эти конечные автоматы? Конечные автоматы PIO выполняют программы, полученные из различных источников, к примеру из библиотеки PIO (UART, SPI или I2C) или пользовательского ПО.

Почему программируемый ввод-вывод?

Все платы обычно поставляются с аппаратной поддержкой протоколов цифровой связи, таких как I2C, SPI и UART. Однако, если вы планируете использовать больше этих интерфейсов, чем доступно на плате, вы можете использовать программируемые входы-выходы, предусмотренные в микроконтроллере RP2040.

Это дает больше возможностей, чем можно подумать. Допустим, вы хотите выводить видео с разрешением DPI или «использовать последовательное устройство с AliExpress» и это теперь возможно с помощью программируемого ввода-вывода. Из названия «программируемый» следует, что его можно запрограммировать напрямую для поддержки нескольких интерфейсов, включая интерфейс SD-карты, выход VGA и более высокую скорость передачи данных. И! Самая интересная часть обзора — «Как запрограммировать эти программируемые входы/выходы, чтобы облегчить вашу работу».

Как начать работу с программированием PIO RP2040?

Pico SDK (Software Development Kit) предоставляет разъемы, библиотеки и систему сборки, необходимые для написания программ для устройств на базе RP2040, таких как Raspberry Pi Pico, на языке C, C ++ или Arm.

Если вы планируете использовать Python для кодирования, вам потребуется только подходящий редактор (скажем, Thonny) и MicroPython, установленный на плате разработки. Но, в случае C/C ++ вам потребуется файл CMake, который сообщает Pico SDK, как превратить файл C в двоичное приложение для платы микроконтроллера на базе RP2040, как описано в нашем недавнем руководстве по MicroPython и C для Raspberry Pi Pico.

PIO ассемблер анализирует исходный файл PIO и выводит собранную версию, готовую для включения в приложение RP2040. Сюда входят приложения C и C ++, созданные на основе Pico SDK, и программы Python, работающие на порту MicroPython RP2040.

Чтобы начать программирование конечного автомата для вашего PIO-приложения, есть три компонента для программы на C/C ++.

  • Программа PIO
  • Программное обеспечение на языке C для запуска демонстрации.
  • Файл CMake, описывающий, как эти два элемента объединяются в образ программы для загрузки на плату разработки на базе RP2040.

Инструкции по сборке PIO

Теперь, когда дело доходит до программирования этих интерфейсов ввода-вывода, существует девять инструкций сборки «JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ и SET». Хотя большинство людей могут быть заинтересованы в программировании интерфейсов PIO на языке C / C ++ или Python, давайте рассмотрим некоторые инструкции на языке ассемблера, используемые для интерфейсов ввода-вывода.

  • JMP: эта инструкция «перехода» может быть условной или не условной. При этом он передает поток выполнения, изменяя регистр указателя команд. Проще говоря, с оператором «jmp» поток выполнения переходит к другой части кода.
  • WAIT: эта инструкция останавливает выполнение кода. Каждая инструкция занимает один цикл, если она не остановлена ​​(с использованием инструкций WAIT).
  • OUT: Эта инструкция перемещает данные из выходного регистра сдвига в другие места назначения, по 1… 32 бита за раз.
  • PULL: Эта инструкция выталкивает 32-битные слова из TX FIFO в выходной регистр сдвига.
  • IN: Эта инструкция сдвигает в регистр 1… 32 бита за раз. I
  • PUSH: Эта инструкция для записи содержимого ISR в RX FIFO.

Более подробная информация об инструкциях на ассемблере доступна в спецификациях RP2040.

Пример программирования PIO RP2040 на C / C ++ и MicroPython Чтобы упростить задачу, мы рассмотрим программу hello_world, которая отвечает за мигание встроенного светодиода, используя программируемые входы-выходы и 32-битные данные TX FIFO (инструкции PULL).

Программа на C / C ++ выглядит примерно так:

Приведенный выше код C / C ++ мигает светодиодом с одним полным циклом в 1 секунду. Светодиод запрограммирован таким образом, что он будет гореть 500 мс, а затем выключаться на 500 мс. Но, прежде чем конечный автомат сможет запустить программу, нам нужно загрузить программу в эту память команд. «Функция pio_add_program () находит свободное место для нашей программы в памяти инструкций данного PIO и загружает его». Таким образом, мы настраиваем конечный автомат для вывода данных на встроенный светодиод.

Код сборки для файла .pio, показанный ниже, содержит все вспомогательные функции C для установки кода C / C ++.

Помимо этого, вам также потребуется файл CMake, который описывает, как файлы .pio и .c встраиваются в двоичный файл, подходящий для загрузки на плату разработки Raspberry Pi Pico.

Эквивалентного образца, написанного с помощью MicroPython, не существует, но мы можем увидеть более простой код PIO MicroPython, используемый для мигания встроенного светодиода:

В этом случае нет отдельного файла .pio, и и MicroPython, и код сборки помещаются в файл .py.

Обратите внимание, что хотя PIO можно запрограммировать с помощью MicroPython, в документации Python SDK говорится, что он в настоящее время нестабилен / находится в стадии разработки, поэтому рекомендуется C / C ++.

В код можно внести множество изменений, добавив цвет, который вы хотите отображать, с помощью шестнадцатеричного формата в RGB. Однако есть много примеров из реальной жизни, таких как PWM, UART или даже взаимодействие NeoPixels. Для тех, кто заинтересован, вы можете найти множество примеров программирования PIO в репозиториях GitHub для образцов C и MicroPython.

Заключение

Программируемые модули ввода-вывода RP2040 могут одновременно выполнять программы для поддержки таких интерфейсов, как выход VGA. Вы можете ознакомиться с главой 3 в документации SDK для C/C++ и Python, чтобы узнать больше о программируемых ввода-вывода RP2040.

Выражаем свою благодарность источнику из которого взята и переведена статья, сайту cnx-software.com.

Оригинал статьи вы можете прочитать здесь.

3 2 votes
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Inline Feedbacks
View all comments