Здравствуйте, уважаемые читатели! Сегодня я, aquaratixc, автор блога LightHouse Software , покажу, как можно практически безболезненно погрузиться в мир архитектуры RISC-V и начать использовать микроконтроллер на ее базе. Оговорюсь сразу, что мы будем использовать не аппаратный микроконтроллер. Вместо этого мы возьмем уже готовое soft-ядро и загрузим его в FPGA-плату BlackIce II , уже знакомую читателям данного блога.
Для начала необходимо скачать свежую среду Arduino IDE под Linux . Поскольку я сам часто использую Linux (а именно, Manjaro Linux i3), то вся инструкция по сборке будет описываться для системы на базе Arch Linux . Однако при необходимости она может быть доработана и для любой другой Linux-системы.
После скачивания Arduino IDE требуется поставить в нее ряд расширений, для чего переходим в меню File → Preferences… В открывшемся диалоге находим пункт Additional Board Manager URL’s и вставляем туда следующие репозитории:
https://raw.githubusercontent.com/lawrie/MuraxArduino/master/package_⏎
murax_core_index.json
https://grumpyoldpizza.github.io/arduino-STM32L4/package_STM32L4_boar⏎
ds_index.json
https://raw.githubusercontent.com/f32c/fpgarduino/master/package_f32c⏎
_core_index.json
После внесения настроек, нужно установить необходимые пакеты расширенной поддержки плат. Для этого переходим в Tools → Boards manager… В появившемся перед нами диалоге в строке поиска последовательно один за другим вбиваем следующие названия: STM32L4, MyStorm, FPGArduino, MuraxArduino — и устанавливаем найденное нажатием кнопки Install.
Данным действием мы поставили поддержку микроконтроллера STM32L4, компилятор C/C++ для RISC-V, а также поддержку Arduino-совместимого soft-микроконтроллера MuraxArduino . Автором проекта MuraxArduino является Lawrie Griffiths .
В комплекте поддержки STM32L4 присутствует программа перепрошивки DFU-устройств (Device Firmware Upgrade) под названием dfu-util . С ее помощью можно модифицировать стандартный iceboot, зашитый в плату BlackIce II. Модификация iceboot нужна для того, чтобы использовать в проектах встроенный в STM32 АЦП , а то в FPGA на BlackIce II АЦП отсутствует.
Fun fact! Механизм, позволяющий использовать АЦП STM32 из FPGA, очень прост. STM32 непрерывно пересылает по QSPI данные со всех каналов АЦП. Вы же, как и авторы Arduino-библиотек, просто используете analogRead
, не думая о том, что существует какой-то мост между FPGA и микроконтроллером.
Однако поставляемая в пакете MyStorm утилита dfu-util не умеет правильно работать с BlackIce II. Дело в том, что она не имеет патча с исправлением сигнатур DFU-устройств. То есть, утилита не узнает микроконтроллер на плате. Для того, чтобы устранить этот недостаток, соберем dfu-util из исходников, которые возьмем из GitHub-репозитория создателей BlackIce II.
Fun fact! В AUR есть пакет dfu-util, но он также не имеет необходимого для BlackIce II патча.
Сборка dfu-util осуществляется серией команд:
git clone https: // github.com / mystorm-org / dfu-util.git
cd dfu-util
. / autogen.sh
. / configure —prefix = / usr / local
make
Не спешите выполнять команду make install
— она не приведет ни к чему хорошему. Дело в том, что пакет MyStorm обращается к dfu-util, установленному в скрытый каталог Arduino IDE. Поэтому необходимо перенести собранную утилиту в этот каталог:
~ / .arduino15 / packages / millerresearch / tools / dfu-util / 0.9.0-mystorm
После этого требуется создать правило udev для dfu-util, для чего в терминале набираем команду:
… и в открывшийся редакторе вставляем следующее:
uct}==»df11″, TAG+=»uaccess»
# On older systems, a user group like «plugdev» can be given access:
# ACTION==»add», SUBSYSTEM==»usb», ATTRS{idVendor}==»0483″, ATTRS{idPr⏎
oduct}==»df11″, MODE=»664″, GROUP=»plugdev»
Также добавляем пользователя в группу uucp:
После этого сохраняем файл и осуществляем повторный вход в систему. Ну или перезагружаем компьютер.
Полдела сделано. Теперь необходимо склонировать репозиторий MuraxArduino, содержащий уже синтезированную версию soft-ядра RISC-V со всей периферией. Для этого необходимо выполнить в терминале следующую команду:
cd MuraxArduino
Берем в руки BlackIce II. Вынимаем из платы джампер, стоящий между 14 и 16 пином, тем самым переключая плату в режим DFU. Затем подключаем оба выхода USB к компьютеру.
Запускаем Arduino IDE. В меню File → Open… открываем файл <местоположение папки MuraxArduino>/MuraxArduino/firmware/QSPIAnalog/QSPIanalog/QSPIanalog.ino
. Далее открываем пункт Tools → Boards и находим там плату myStorm BlackIce, нажимаем кнопку Upload.
Теперь, если все было сделано правильно, произойдет прошивка обновленного iceboot. После этого отключаем плату от компьютера и возвращаем джампер на его законное место. Снова подключаем оба USB-выхода к компьютеру.
Заливаем в плату синтезированное ядро. Для этого, находясь в каталоге MuraxArduino, выполняем серию команд:
sudo stty -F / dev / ttyACM0 raw
cat toplevel.bin > / dev / ttyACM0
На этом мучения с установкой и настройкой soft-микроконтроллера закончены и можно приступать к самому интересному: использованию полученного RISC-V микроконтроллера в Arduino.
Запускаем среду Arduino и открываем простейший пример Blink. Переменную LED_BUILTIN заменяем на значение 3. Это пин, к которому подключен третий светодиод на плате. Полную распиновку вы можете увидеть в README проекта MuraxArduino на GitHub. Затем в меню Tools → Boards выбираем BlackIce Murax FPGA Board.
А теперь неочевидный момент. Чтобы загрузить скомпилированный проект из Arduino IDE в BlackIce II надо нажать кнопку RESET на плате, после чего запустить загрузку на плату кнопкой Upload самой среды.
Если данная инструкция вас не утомила и вы все проделали грамотно, то после нажатия заветной кнопки Upload вы увидите мигание зеленого светодиода. Теперь у вас под рукой самый настоящий RISC-V процессор частотой 50 МГц с аппаратно ускоренной периферией и программируемый из Arduino IDE!
Дополнение: VisionFive 2: одноплатный компьютер на базе RISC-V