К1986ВК025 — RISC-V от Миландра

Я упоминал К1986ВК025, и вот появилось настроение написать про него отдельную статью с примером проекта в Visual Studio Code, примерами заливки прошивки во Flash и RAM, а также собственной малогабаритной отладочной платой. Получил я семплы, собственно:

RISK-V :D Да, об этом писали на хабре уже, но всё равно забавная опечатка при заказе опытной партии.

Хорошее описание возможностей и назначения данного МК можно прочитать в официальной статье на хабре Отечественный микроконтроллер К1986ВК025 , я не вижу смысла повторяться, приведу только структурную схему МК из той же статьи для базового понимания (если лень ходить по ссылке), что доступно из периферии:

Схемотехника отладочной платы

В плане обвязки данный МК довольно прост (кликабельно):

Помимо стандартных кварцевых резонаторов (8…16 МГц и 32,768 кГц) и развязывающих емкостей по питанию я дополнительно предусмотрел место под источник опорного напряжения REF3325AIDBZR, дающий +2,5 В, которые, помимо того что идут на пин AREF самого МК, заведены на внешний разъём. По всем входам обоих АЦП стоят простейшие RC фильтры.

На основном листе схемы располагаются пользовательские светодиоды, кнопка (которая дополнительно заведена на BOOT пины), USB-UART на основе малогабаритной программируемой CP2102N-A01-GQFN20, схема подачи питания VBAT и малошумящий LDO TPS73501DRBR (схема кликабельна) :

Немало пинов МК вообще не выведено никуда или подведены только к светодиодам, UART, кнопке, так сделано намеренно, чтобы не увеличивать габариты ПП и не усложнять разводку (основная цель — вывести всё основное, вместить на 2-слойную ПП с габаритами, сравнимыми с Black Pill).

Разводка платы и собранный экземпляр

Размещение компонентов произведено практически полностью на одном (Top) слое, за исключением JTAG разъёма, что дало некоторую свободу на Bottom слое и ощутимо упрощает монтаж. При разводке руководствовался аналогичным правилом: сначала разводится всё максимально на слое компонентов, а уже при крайней необходимости дорожки перекидываются на другой слой, что даёт максимально неразрывный полигон общего провода на втором слое и возможность провести толстые дорожки питания по всей плате:

Внешний вид 3D-рентера:

Получившийся pinout платы с доступной периферией на разъёмах:

И да, при монтаже платы довольно удобно сделать подобный сборочный чертёж, который сильно ускоряет расстановку ЭРИ, если это опытный образец или совсем небольшая партия, паяемая с паяльной пастой и в печке\феном:

Собранный образец (правда, необходимых конденсаторов типоразмера 0201 для RC фильтров АЦП не оказалось под рукой, колхозить уже не стал, запаяю позже):

Подготовка проекта

В целом, создание проекта под К1986ВК025 ничем не отличается от того же GD32VF103RBT6, скелет проекта полностью аналогичен, используемые инструменты тоже. Папка проекта выглядит вот так:

Если вкратце:

  • Папка .vscode — всё аналогично Visual Studio Code — написание и отладка прошивок для RISC-V;
  • Папка _Info_ — различная сопроводительная документация, расчёты и т. п.;
  • Папка Drivers — сюда я положил SPL драйвера от производителя и обрезанную NMSIS;
  • Папка DriversExt — здесь хранятся драйвера для подключаемой периферии, типа дисплеев или датчиков;
  • Папки Inc, Src — пользовательский код;
  • Папка JLink — скрипты для консоли, скрипты для GDB, SVD-файлы;
  • В корне проекта же лежит Makefile и скрипты для линкера под флешку и память.

Несколько наспех написан Makefile, но работает, и сборка проекта осуществляется сразу с двумя скриптами для линкера, после сборки вы можете увидеть две статистики:

Бинарные файлы Firmware — это обычный вариант для флешки, Firmware_RAM — альтернативный вариант для запуска из оперативной памяти, полностью минуя необходимость прошивать флешку, но не всякая прошивка влезет в RAM, а также отладка не работает, если прошивка запущена из RAM.

Сам же Makefile я попробовал чуть облагородить и добавить условий, сделать более понятным в сравнении с примером для GD32VF103RBT6:

После сборки также обновляется файл JLink\gdb_writefile.txt, который содержит данные о размере и адресе бинарного файла для прошивки во флешку:

Сделано так, потому что этот МК не совсем обычно прошивается (как и стирается), по крайней мере, у меня вышло только через GDB сервер и самописный скрипт JLink\gdb_write_flash.txt, кусочек, отвечающий за прошивку:

И вот с этим есть одна проблема — работает оно далеко не так быстро, как хотелось бы (точнее дииииико медленно, можно ждать минуту и более для заливки тестового проекта)… Зато заливка и запуск прошивки в RAM работают мгновенно и не требуют GDB сервера, там всё просто, записал в память по нужному адресу, выставил Program Counter в регистре = начальному адресу RAM, куда была залита прошивка и всё.

Таски, требующие запущенного GDB сервера, я пометил:

И да, можно просто запустить GDB сервер на заднем фоне, он абсолютно не мешает работе и запуске прошивки в RAM:

Примечание: единственный момент, на скорости 8 МГц этот МК у меня категорически отказывается работать, а на скорости 12 МГц иногда нормально работает, а иногда (особенно чтение памяти) даже подключаться не хочет. Возможно, это проблемы EDU-варианта отладчика, но с GD32 и STM32 таких проблем не возникает…

Тестовый проект для примера работы я решил просто перенести из статьи про GD32VF103RBT6, адаптировав под новый МК. Всё бы ничего, но т. к. SPL для этого МК находится в стадии написания, то далеко не всё работает в SPL, некоторые вещи получается запустить благодаря изучению спецификации (АЦП), а некоторые нет (DMA, прерывания), и сейчас основной цикл выглядит уныло:

Структура настроек АЦП, которая потом передаётся в ADC_Init, не полностью используется, и далеко не всё инициализируется, после чего я просто выставил нужные биты в регистре CFG после вызова ADC_Init. Потом я думал использовать DMA, но он не дописан, и доступные исходники, как и описание в спецификации, мне не помогли. Потом я переключился на прерывания, но даже разового захода в обработчик прерывания от АЦП или DMA я так и не получил. В итоге я наговнокодил всё в ардуиностайле, полингом. :D Но пока разбирался с регистрами АЦП и прерыванием по завершению оцифровки, нашел в SPL ещё типичные ошибки копипасты:

А я ещё думал, куда это ADC_STATUS_ECOIF_IE делся…

Тестируем

Для проверки работоспособности я взял готовую плату с микрофоном на MAX9814, просто подключив её выход к AIN3 благодаря фиксированному значению сдвига в 1,25 В:

Дисплей я взял всё тот же ST7735 с разрешением 80*160, подключил к SSP2 и некоторым пинам порта D. Компилируем проект, заливаем в RAM:

Практически мгновенная заливка и старт. Всё работает!

Примечание: В SPL ещё много багов и недопиленности, но пока что доступен только предварительный вариант SPL и спецификации, фактически нет никаких примеров по работе с периферией, есть большие вопросы по прошивке флешки (уж больно медленно прошивается, хотя, может быть, это просто у меня руки оч кривые), но работать с МК довольно интересно, есть перспективы, особенно если выпустят не специализированный МК для электросчётчиков, а аналог того же К1986ВЕ92 с похожим набором периферии (c USB, SPI, I2C, ADC, UART) в таком же корпусе (QFN) для создания вспомогательных и бытового назначения устройств.

На этом всё. :) Спасибо, что прочитали!

Ссылки

Добавить комментарий

Please log in using one of these methods to post your comment:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s