Я — самодельщик-ардуинщик со стажем. Люблю пихать ардуины во всякие подходящие и не очень места. Как-то раз я уже показывал свою коллекцию Arduino-совместимых плат, и с тех пор она только росла и ширилась. Теперь в ней случилось особенное пополнение: русская (пока не) народная «Ардуина» ELBEAR от сибирской компании «Элрон» на базе отечественного микроконтроллера MIK32 «Амур», о существовании которой я узнал несколько дней назад из статьи на Хабре.

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

К тому же, я не самый обычный ардуинщик. Вкусы мои специфичны: я не сделал ни одной метеостанции, мой дом глуп как пробка, и даже мои часы на Arduino — стрелочные. Вместо этого я делаю вещи, так или иначе связанные с электронными и видеоиграми, демосценой, звуком и музыкой с уклоном в ретро. И разнообразные ардуины мне нужны и интересны именно в этом контексте. А значит, есть шанс, что будет интересно.

▍ Рвало на Родину


Для начала хочется рассказать, чем, когда и обо что нужно удариться, чтобы одним прекрасным днём решить выложить из собственного отечественного кармана 6209 отечественных рублей за отечественную плату, уступающую по возможностям китайским платам за 600.

ZX Spectrum зарубежного и местного разлива

Впервые я столкнулся с компьютерной техникой в тот переходный период, когда в домах ещё встречались БК-шки, РК-шки, и может быть даже Векторы, а в школах стояли УКНЦ. Но всё больше и больше всё это заменяли Спектрумы, Денди, Сеги и IBM PC. В эпоху открытия границ разница между отечественным и зарубежным была весьма наглядной: тут тебе и цвет, и звук, и музыка, и увлекательные сюжеты в играх.

Всё это, однако, стоило немалых денег, и не было мне доступно. Немало времени тогда было уделено чтению советских книжек и справочников по радиоэлектронике, разглядыванию схем компьютеров типа ЮТ-88, Специалист, Радио-86РК, и вялым попыткам их собрать. Заложенная этим идея, что недоступный компьютер можно сделать своими силами, сохранилась на многие годы. Позже я слегка успел прикоснуться к остаткам советской техники, к элементам ЕС и СМ ЭВМ, принтерам, дисководам и терминалам. Весь этот опыт заложил основу будущей ностальгии и тёплых чувств к отечественной аппаратуре.

Моё первое знакомство с устройством компьютера — ПК «Специалист» в журнале «Моделист-Конструктор»

Появление интернета по карточкам и преодоление языкового барьера открыли мне ранее недоступное море информации по увлечениям. Я узнал про историю компьютерной техники множество интересных вещей, увидел лучшее, что было создано в мире. Тогда в воздухе ещё витал миф про особую мощь отечественных программистов, и я находил тому подтверждения: вот же наша демосцена, вот отечественные программы, творящие невиданные ранее вещи на 8-битном железе. Этим я стремился поделиться с миром, обратно, чтобы кто-нибудь в Японии или США тоже мог поудивляться тому, что было создано в наших краях.

Процессор моего детства

В те же времена стала более доступна новая, современная элементная база, снова подогрев мой интерес к радиоэлектронике. Я смотрел на зарубежные и отечественные самоделки на разных AVR, PIC, ARM и прочих Altera, пробовал делать что-то сам на ATtiny и ATmega, в том числе пытался изобрести самодельное игровое устройство или компьютер. Но по старой памяти всегда хотелось соорудить что-нибудь интересное именно из отечественных компонентов. И я примерялся к советской номенклатуре: ВМ80, ВМ1, ВЕ49 и вот это всё. Увы, это были остатки древней, более развитой цивилизации, а не что-то, что могло пригодиться в новом тысячелетии.

R100-XP компании «Русь-Телеком». Фото из Интернета

Тогда, в начале 2000-х годов, надежды на будущее отечественной микроэлектроники, ещё не полностью рассосались, и я периодически интересовался, не появилось ли чего-нибудь новенького. Я удивлялся новостям про R100-XP, созданный для весьма специфических нужд, и вроде как несущий на борту клон звукового чипа AY-3-8910. КоЕ-кто из коллег-спектрумистов успешно применял в своих разработках тогда свежий отечественный микроконтроллер КР1878ВЕ1 на оригинальном ядре «Тесей». И я примерялся к нему, но для моих затей он был слишком немощным.

КР1878ВЕ1 «Тесей» производства «Ангстрем». Фото из Интернета

Позже заглядывался на «Мультиклет Р1», весьма оригинальный и интересный, но крайне специфичный, сложный в запуске за отсутствием инфраструктуры, и также не очень-то доступный по деньгам. Все прочие позиции были из области фантастического чтива — доступ к ним можно было получить по коммерческому запросу с астрономическими суммами от лица серьёзной организации, и даже документация была секретной.

Демонстрационная плата MultiClet. Фото из Интернета

Шли годы. Я утратил надежды прикоснуться к свежим отечественным компьютерно-процессорным разработкам и перестал следить за новостями. И вдруг из статьи на Хабре я узнал, в кои-то веки есть кое-то в свободной продаже, что можно просто пойти и купить на Озоне. Ещё и в форм-факторе популярной Arduino Uno, и с готовой инфраструктурой, даже с поддержкой в Arduino IDE! И хотя внутри у ней неонка, то есть вполне знакомая уже архитектура RISC-V, прикоснуться к которой сейчас можно и за гораздо меньшие деньги, это было предложение, от которого просто невозможно отказаться.

Побежал и купил. Цена не просто кусалась, цена разрывала жабу на куски: 6209 отечественных рублей. Для энтузиаста это был сильный удар по карману. Но перспектива закрытия давнего гештальта перевесила боль финансовых потерь, и пока платки не кончились на Озоне, я заказал себе одну — самую дешёвую из имевшихся в наличии на тот момент. Справедливости ради, существуют и почти вдвое более дешёвые версии с меньшим объёмом памяти, но на момент приобретения их просто не было в наличии.

▍ Очная ставка


Плата прибыла в фирменной коробочке, которая была заботливо положена в прозрачный полиэтиленовый пакетик. Зная, как обходится с такими пакетиками Озон в процессе доставки, это было весьма самонадеянно. Но обошлось, плата успешно пережила путешествие.

Элмедведь в закрытой коробке

Фирменная коробочка состоит из картонки, рукава с шелкографией и фирменной символикой, пары поролоновых вставок, и собственно платы. Полагаю, сибирские платы статического электричества не боятся, потому что антистатический пакетик не предусмотрен. Больше совершенно ничего — никаких кабелей, гребёнок, или хотя бы какой-нибудь мало-мальской бумажки — в комплекте нет.

Я всё понимаю про экономику малых серий, но за такие деньги приятно было бы получить хотя бы значок, что я дурачок, и потратил кучу денег на поддержку отечественного производителя. Будучи издавна глубоко вовлечённым в разного рода DIY и самиздат, я знаю, что это вполне осуществимо, и подобные малосерийные дорогостоящие вещи снабжаются хотя бы какими-нибудь наклейками как раз, чтобы не расстраивать их покупателя.

Элмедведь в открытой коробке

Ну и ладно, главное, что в комплекте есть сама плата. Посмотрим же на неё скорее!

▍ Железо


И вот в моих руках платка ELBEAR ACE-UNO AC VER Flash 32MB. Похожа на платы формата Uno с другими контроллерами, радикально чёрного цвета, с логотипом с мордой медведя и некоторым количеством русских надписей в шелкографии, особенно на задней стороне. И, конечно, есть главная среди прочих надписей — «произведено в России».

Перед Элмедведя, общий вид

Самая интересная деталь на плате, и, вероятно, единственная отечественная, не считая текстолита — собственно микроконтроллер MIK32 «Амур» с обозначением К1948ВК018, выполненным почему-то явной латиницей.

Если честно, я не знал никаких подробностей про «Амур», его разработку и производство, только мельком видел новости и слышал краем уха о перспективах его внедрения в одной известной мне теме. Про производителя платы я и вовсе ничего не знал. Поэтому в качестве вводной могу только пересказать Википедию и официальный сайт.

K1948BK018 MIK32 Amur собственной персоной

Чип разработан и производится на мощностях АО «Микрон» в Зеленограде. Вроде как на данный момент это единственный микроконтроллер так называемого первого уровня локализации: разрабатывается, производится и корпусируется в России. Кристаллы делаются по техпроцессу 180 нм в Москве, корпусируются в Зеленограде (Москве) и Калининграде.

Сама плата разработана сибирской компанией «Элрон». К сожалению, находится она в Новосибирске, а не в более мемном Челябинске. Было бы весело — суровая челябинская Ардуина.

Что, где, когда на плате ACE-UNO

В линейке ELBEAR несколько плат. Помимо вариаций Uno-подобной ACE-UNO с разным объёмом памяти и наличием-отсутствием фирменного JTAG-программатора в комплекте есть ещё Nano-подобная ACE-NANO. AC VER обозначает версию, заточенную на работу в Arduino IDE.

Микроконтроллер «Амур» использует открытую архитектуру RISC-V, 32 бита, с довольно скромной для контроллеров этой архитектуры тактовой частотой 32 МГц. На кристалле расположен довольно небольшой по нынешним меркам объём ОЗУ, 16 килобайт. Из интересной периферии есть восемь каналов 12-битного АЦП, два канала 12-битного ЦАП, температурный сенсор, часы реального времени, шесть таймеров с поддержкой ШИМ, четыре канала DMA, криптоблок. Также, конечно, все стандартные интерфейсы: SPI, i2c, UART, каждого по две штуки.

Блок-схема чипа из официальной документации

Также на чипе есть EEPROM объёмом 8 килобайт. Это не память программ, как некоторые думают по беглому изучению характеристик. С ней всё интереснее: это внешняя Flash-память с интерфейсом QSPI. На платах «Элрона» она представлена объёмом от 8 до 32 мегабайт — больше, чем на базовых ESP32. Выполняется код по аналогичной ESP схеме, с подгрузкой из Flash, только вместо IRAM здесь используется кэш объёмом 1 килобайт. Это, конечно, влияет на производительность системы.

По сравнению с Uno-подобными платами на ATmega и разных других контроллерах на плате ELBEAR значительно больше мелких компонентов. Думаю, это объясняется тем, что это плата двойного назначения: не только Ардуина, но и девборда.

Назначение пинов платы ACE-UNO

Пины платы, а точнее, соответствие их расположения и функционального назначения, за небольшими отличиями совпадают с классической UNO, что очень удобно. Правда, питание и логические уровни трёхвольтовые, как у ESP и STM32, что нужно учитывать при выборе подключаемой периферии, но в современном мире это даже удобнее, не нужно лишний раз городить преобразователи уровней.

На плате также присутствуют разъём USB Type C для загрузки скетчей, перемычки выбора загрузчика BOOT0/BOOT1, разъём JTAG для перепрошивки контроллера, светодиоды индикации связи, пользовательский светодиод и кнопка.

Зад Элмедведя, общий вид

Плата снабжена стандартным для современных Arduino-совместимых плат чипом преобразователя USB-SERIAL CH340. Это, пожалуй, плюс, потому что это решение, проверенное временем, и у прошаренных ардуинщиков оно заработает из коробки.

▍ Первые шаги


Как известно, если ничего не получается — прочтите, наконец, инструкцию. Я решил действовать превентивно: не дожидаться проблем и сразу же прочесть инструкцию

Направление на инструкцию

Вместо бумажки на коробке есть QR код, берегущий сибирский лес, и обещающий получение документации в электронном виде. Учитывая, что прочитать QR код на компьютере затруднительно, первое знакомство с документацией должно произойти на телефоне. Я попытался открыть код и получил ссылку на документацию. Но только в виде текста, а не перехода на сайт. после копирования ссылки документация открылась. Я увидел, как она должна выглядеть, и попытался нагуглить её по увиденному названию страницы. Не удалось, нашлись только разные другие страницы сайта. Пришлось походить туда-сюда по ссылкам на сайте. Страницу документации я так и не нашёл, но нашёл раздел про настройку Arduino IDE — то, что мне и нужно.

Ставил, конечно, в привычной мне IDE версии 1.8, в которой работают все прочие нужные мне платы и библиотеки. Процесс добавления новой платы стандартный: копируем ссылку на установочный пакет в список источников в настройках, потом устанавливаем через Менеджер плат.

https://elron.tech/files/package_elbear_beta_index.json


Пакет весьма увесистый, около 360 мегабайт, установка тоже не быстрая, пришлось подождать.

Далее инструкция говорит: если в плате нет загрузчика, понадобится особый фирменный JTAG-программатор. я брал комплект без него, но так как версия AC VER предназначена именно для работы в роли Ардуины, я понадеялся, что загрузчик там установлен с завода, как на любых нормальных Arduino-совместимых платах. Надежда, впрочем, была какой-то неуверенной, и я даже уже начал вспоминать, где у меня лежат мои, нефирменные, JTAG программаторы, которые не пригождались уже очень давно.

Установленный в IDE пакет поддержки платы

Я подключил плату, и она сразу бодро замигала зелёным светодиодом, что намекало, что туда уже загружен стандартный blink, и это укрепило надежду. Драйвера для моста CH340 уже были установлены. Никаких особых сообщений про установку чего-либо Windows при подключении платы не выдал, соответствующий COM-порт появился. Я выбрал его и попытался загрузить какой-нибудь скетч. Инструкция предлагала загрузить стандартный же blink. Почему бы и нет.

▍ ССЗБ и Windows 7


Первая попытка загрузки скетча

Первая компиляция прошла успешно, но загрузка не удалась: произошла ошибка при загрузке скетча. Какая? Науке неизвестно, IDE не уточняет. Впрочем, паниковать было рано, опыт возни с десятками других плат говорил, что квест загрузки первого скетча бывает весьма замысловатым, и пока ничего особенного не произошло.

Версия с возможной неработоспособностью платы была сразу отметена: порт появляется, и монитор порта видит, что выводит в порт загруженный скетч. Спасибо разработчикам, что предусмотрели такой вывод! Остались сомнения по наличию правильного загрузчика в плате, но скорее всего он был правильным.

Первый привет из платы

Попробовал погуглить такую проблему, и, конечно, столкнулся с прелестями импортозамещения: такая информация в интернете не ищется. Тогда решил идти традиционным путём, по всем граблям. Включил подробный лог компиляции и загрузки. Это мало что дало:

То есть по какой-то причине просто не работает сама программа-загрузчик скетча в плату, и уточнять она ничего не собирается. Тогда пошёл туда, куда послал меня лог: посмотреть, что за elbear_uploader такой. Запустил его отдельно, и всё стало ясно.

Скетч использует 6608 байт (0%) памяти устройства. Всего доступно 33554432 байт.
Глобальные переменные используют 748 байт (4%) динамической памяти, оставляя 15636 байт для локальных переменных. Максимум: 16384 байт.
C:\Users\User\AppData\Local\Arduino15\packages\Elron\tools\elbear_uploader\0.2.2/elbear_uploader.exe C:\Users\User\AppData\Local\Temp\arduino_build_382412/Blink.ino.hex --com=COM17 --baudrate=230400
Произошла ошибка при загрузке скетча


Я, конечно, понимаю, что трудно ожидать, что в 2025 году у кого-то не будет на компьютере Windows 10 или 11, а будет аж Windows 7. Но в моей практике это первый случай, и какая такая необходимость у загрузчика в свежей версии Windows, мне понять было трудно. Это не случайность, в репозитории можно скачать свежую версию загрузчика, и он называется elbear_uploader_win10_v0_2_2.zip. Также есть загрузчик для Linux, что могло бы спасти ситуацию, но Linux у меня под рукой только в виде виртуалки, а прыгать между системами ради одной платы желания совершенно не было.

К счастью, исходный код загрузчика открыт, и его можно попытаться пересобрать. К сожалению, он написан на Python, и его нужно скомпилировать в исполняемый файл. Для этого мне пришлось обновить давно установленный Python. Тут-то и выяснилось, зачем загрузчику Windows 10: с версии 3.9 сам Python не работает на Windows 7.

Ошибка при запуске загрузчика намекает

Пришлось найти установочный файл для Python 3.8.9 и поставить. Дальше выяснилось, что загрузчику нужен пакет serial. Пакеты в Windows мне ставить ещё не приходилось. Я попробовал установить pip, и выяснил, что он работает исключительно от версии 3.9 и выше, которая не работает на Windows 7. Наметился замкнутый круг.

К счастью, круг оказался не очень прочным. В нём было целых две бреши. Во-первых, оказалось, что не один я такой ретроград: существуют сборки актуальных версий Python для Windows 7.

Во-вторых, нашлось кое-что получше свежих сборок Питона. Популярный 3D-редактор Blender, которым я сам активно пользуюсь, использует Python 3.9, и из-за этого тоже не работает на Windows 7. Его ретроградных пользователей такое положение дел тоже не устроило, и они изобрели необходимую для обратной совместимости DLL-лку, которую нужно просто положить в папку с исполняемым файлом. И она у меня уже была. Я положил, и загрузчик заработал.

Разумеется, все вышеописанные проблемы я создал себе сам применением антикварной версии Windows. Разработчики же вполне себе молодцы, по сути плата заработала из коробки, причём сразу и загрузка, и монитор порта — последним могут похвастаться далеко не все платы. Седых волос этот процесс не прибавил.

В итоге загрузка удалась, первый blink замигал с соответствующей частотой. С настройкой покончено, переходим к проверке платы и её поддержки в Arduino IDE на прочность в более сложных скетчах. И в качестве первого знакомства с особенностями и потенциалом платы я сделаю три маленьких проекта с типовыми для меня задачами.

▍ Светодиоды


Одиночным светодиодом я уже изрядно поморгал в процессе первоначальной настройки, и это было не так интересно. Гораздо интереснее попробовать что-то посерьёзнее, какие-то типовые задачи, имеющие практическую ценность. Например, поморгать 256-ю светодиодами одновременно.

Матрица 16 на 16 из адресных светодиодов

Сказано — сделано. У меня уже давно ожидала внедрения в недоделанный проект светодиодная матрица 16 на 16 диодов. Она-то и послужила подопытным кроликом.

Речь идёт про адресные светодиоды типа WS2812 — главную основу самоделок Алекса Гайвера нескольких прошлых лет. Их особенностью является простейший однопроводный каскадный последовательный интерфейс, позволяющий объединять в цепочку практически произвольное количество светодиодов, насколько позволит физика и здравый смысл.

В этом тесте вместо использования готовых библиотек я решил изобрести велосипед: реализовать его на низком уровне, чтобы познакомиться с новым железом поближе. Точнее, собственную реализацию я сделал уже давно, и нужно было лишь адаптировать её под новую плату.

Отдельно взятые адресные RGB-светодиоды крупным планом

Реализовать протокол я решил максимально просто, через bit banging. Для начала сделал простейший тест с digitalWrite, переключающий пин с 0 на 1 в глухом цикле. Это дало частоту меандра всего лишь около 53 килогерц, тогда как необходимая адресным светодиодам скорость передачи значительно выше, 800 КГц, да ещё и требует две разных ширины импульса. Стало очевидно, что нужна прямая работа с GPIO.

С помощью DeepSeek, поиска в Интернете, осциллографа и крепкого словца удалось за полчасика без особого поседения разобраться с этим вопросом и получить необходимую скорость. Тайминги подобрал методом тыка, вставляя NOP’ы и контролируя частоту по осциллографу. Это позволило узнать кое-что про устройство GPIO, а также убедиться, что ассемблерные вставки тоже доступны, что наверняка ещё пригодится в будущем.

Дальнейшее было уже рутиной. Сделал простейший текстовый скроллер с радужной палитрой, без особых оптимизаций по скорости и расходу памяти. Работает!

▍ Опять скрипит


Воодушевившись легко достигнутым первым результатом, я решил перейти к более интересному упражнению: портировать на плату мой упрощённый эмулятор звукового чипа AY-3-8910 в комплекте с проигрывателем музыки, о котором я рассказывал в одной из недавних публикаций. Как водится, ничто не предвещало проблем.

Интерес этой затеи в том, что у контроллера есть кое-что, чем не могут похвастаться ни классические Arduino на ATmega, ни даже платы на ESP32: сразу два канала ЦАП, аж 12-битные. Как раз пригодится для качественного стереофонического звука! Завести этот ЦАП с помощью примеров mik32-examples удалось практически без труда, и оба канала действительно заработали.

Блок-схема ЦАП из официальной документации

Неожиданные сложности возникли с таймерами и прерываниями. Чтобы реализовать звуковой поток таким же способом, как я делал на Nano/Uno и ESP8266, нужен таймер, генерирующий прерывания несколько тысяч раз в секунду — это будет частота дискретизации, на которой сгенерированные сэмплы выводятся в ЦАП.

По историческим и техническим причинам таймеры не представлены в базовой экосистеме Arduino (Wiring) и для них не предусмотрена кросс-платформенная прослойка. Для каждой платформы предлагается использовать местные средства, набор и возможности которых очень сильно различаются между разными микроконтроллерами.

Так, на классических 8-битных ATmega есть три таймера с разными возможностями, каждый из которых способен генерировать отдельное прерывание. Эти таймеры задействованы в рабочих интересах системы, но путём прямых манипуляций с регистрами их можно использовать для личных нужд. На чипах семейства ESP тоже всё неплохо, есть разное количество таймеров, в зависимости от конкретного чипа (ESP8266, ESP32, ESP32C3 и так далее), а работа с ними производится функциями из SDK, для каждого чипа функции свои.

Блок-схема 16-битного таймера из официальной документации

На «Амуре», конечно, тоже всё по своему, и довольно неплохо. Есть аж шесть таймеров, три 32-битных и три 16-битных. В реализации платформы Arduino задействованы все 16-битные таймеры: timer16_0 для IRremote, timer16_1 для tone, timer16_2 для Servo. Ничего из этого для проекта мне не нужно, поэтому можно задействовать любой в своих корыстных целях. Однако, как выяснилось, обработать прерывание от таймера не так-то просто. Пришлось покопаться в даташите и в исходниках BSP (пакета поддержки платы), чтобы разобраться.

В отличие от прочих систем, у «Амура» в текущем исполнении реализован всего один-единственный общий обработчик прерываний. В Wiring это функция trap_handler, в которой по приходу прерывания по очереди проверяются флаги всех возможных источников. В том числе предусмотрено и подключение пользовательских прерываний — определяемая пользователем функция ISR, в которой также предлагается по очереди проверять собственные источники прерываний.

Некоторое время пришлось поколдовать, чтобы реализовать систему с прерыванием по таймеру. В итоге и оно, и вывод в ЦАП заработали. Не заработал только сам эмулятор: он начал издавать странные звуки, никак не похожие на музыку. Я было подумал, что что-то сломалось в портабельном коде, и потратил некоторое время на попытки его оживить. Но ничего не помогало, пока я от балды не установил частоту дискретизации в 8 кГц вместо примерно 32 кГц, как было на Nano. И тогда музыка заиграла. Но очень плохо.

В попытках разобраться в этом явлении я сделал профайлинг элементов системы. Профайлер ожидаемо показал возможную скорость работы кода эмулятора выше чем на 8-битной 16-мегагерцовой ATmega — 67 тысяч отсчётов в секунду. Всё-таки и тактовая частота вдвое выше, и ядро 32-битное, а мой код использует некоторое количество 32-битной математики.

void __attribute__((noinline, section(".ram_text"), optimize("O3"))) trap_handler (void)  
{
    // custom interrupt
    ISR();
    // gpio interrupt
    if (EPIC_CHECK_GPIO_IRQ())
        gpio_interrupt_handler();
    // IRremote timer interrupt
    if (EPIC_CHECK_TIMER16_0())
        IRremote_interrupt_handler();
    // tone timer interrupt
    if (EPIC_CHECK_TIMER16_1())
        tone_interrupt_handler();
    // servo timer interrupt
    if (EPIC_CHECK_TIMER16_2())
        servo_interrupt_handler();
    // uart0 interrupt
    if (EPIC_CHECK_UART_0())
        serial_interrupt_handler(0);
    // uart1 interrupt
    if (EPIC_CHECK_UART_1())
        serial_interrupt_handler(1);
    // i2c0 interrupt
    if (EPIC_CHECK_I2C_0())
        wire_interrupt_handler(0);
    if (EPIC_CHECK_I2C_1())
        wire_interrupt_handler(1);
    // reset all interrupts
    EPIC_CLEAR_ALL();
}

Однако, когда в фоне было запущено прерывание таймера на 32 килогерцах, выводящее в ЦАП нули, профайлер в том же тесте показал всего 9 тысяч отсчётов. Отдельный тест показал, что запись в ЦАП работает достаточно быстро. Значит дело именно в обработчике прерывания таймера. И это неудивительно, ведь помимо моего пользовательского прерывания в нём каждый раз отрабатывает целая колбаса уже ненужных проверок. И отказаться от них из-за реализации системы в экосистеме Arduino прерываний нельзя: полное переопределение функции trap_handler не предусмотрено.

Я попробовал обойти проблему с помощью другой схемы: кольцевой буфер для сэмплов. Он заполняется новыми сэмплами в основном потоке всё время, пока в нём есть место. Прерывание таймера по быстрому забирает сэмплы из буфера и выводит в ЦАП. Такой подход неплохо показывает себя на контроллерах ESP, где код также исполняется из как-бы кэша (IRAM). Но здесь это не помогло, стало только хуже из-за накладных расходов на организацию буфера.

Таким образом, выяснилось, что таймер — не наш путь. К счастью, «Амур» предлагает другой, способный привести к более качественному решению задачи: DMA, работающее по таймеру. И в примерах даже есть демонстрация его работы как раз в связке ЦАП (mik32-examples/HAL_DMA_Timer32). Но для реализации этой схемы таки придётся лезть в самые дебри, городить очередь из буферов, и всё это становится всё меньше похоже на необременительное легкомысленное ардуинщество.

Да, пока что это фиаско. Сделаю лучше как-нибудь в другой раз. А пока насладимся натужными хрипами варианта с таймером на эпических 6 КГц. Отрицательный результат — тоже результат!

▍ Вижу фигу


Другая типичная задачка — вывести что-нибудь на дисплей. Желательно что-нибудь динамичное, бодро шевелящееся и переливающееся цветами, ведь статичные картинки — это скучно. Например, какую-нибудь длинную анимацию: ведь на приобретённой мной версии платы установлено аж 32 мегабайта Flash-памяти, и за каждый уплачено сполна из собственного кармана, и неплохо было бы найти им применение. Я даже было начал подумывать про версию Bad Apple.

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

Четыре вида дисплеев для теста: TFT 240x280, OLED 128x64, TFT 240x320, TFT 320x480

Для начала я выудил из коробки довольно необычный вариант, которому в моей практике до сих пор так и не нашлось применения: TFT с закруглёнными углами, диагональю 1.69 дюйма, необычным разрешением 240 на 280 пикселей, контроллером ST7789 и интерфейсом SPI.

На этот раз я решил всё же применить готовую библиотеку. Ведь дисплеев и их контроллеров существует великое множество, и каждый раз писать собственный драйвер под каждый тип дисплея мало кто захочет, а сила экосистемы Arduino всё-таки в готовых простых решениях. К тому же, хороший повод проверить, работают ли на ELBEAR стандартные решения из коробки. Спойлер: на сайте «Элрона» есть список уже проверенных библиотек, и искомая Adafruit ST7735 and ST7789 Library там указана как совместимая.

Экран и библиотека действительно запустились без каких-либо сложностей. Правда, при сборке проекта компилятор ругается на тип boolean, используемый в библиотеке, но хотя бы собирать код не отказывается, и на том спасибо.

Подключение дисплея к плате ELBEAR, аппаратный SPI

Обратите внимание, что дисплей я подключил напрямую к выводам платы, хотя в случае с классической Arduino Uno требуется преобразование уровней, хотя бы с помощью вязанки резисторов: контроллер ST7789 трёхвольтовый, а Uno пятивольтовая. Но ACE-UNO с МК «Амур» имеет трёхвольтовое питание и логические уровни, о чём есть соответствующая надпись сзади платы, поэтому преобразование уровней не требуется.

Далее я попробовал оценить скорость отрисовки. По предыдущим экспериментам я ожидал от платы неплохой производительности, как минимум на уровне LGT8F328P (дважды производительность Nano). Но простейший тест с попеременной очисткой экрана то в один, то в другой цвет, заставил удивиться: очень уж медленно это происходило, пара секунд на одну смену цвета.

Я попытался поднять скорость стандартными трюками, через установку окна и прямую передачу блока сырых данных в SPI. Это работает, но скорость всё равно очень низкая, порядка секунды на полную перерисовку экрана.

Было очевидно, что с такой скоростью никакой анимации не получится. Тогда я решил поумерить аппетиты, и вместо относительно большого цветного экрана с довольно большим объёмом кадра 130 килобайт взять популярный монохромный 1.3-дюймовый OLED на контроллере SH1106. Ведь его объём кадра всего лишь один килобайт, значит обновление экрана должно работать на два порядка быстрее.

Подключить и завести экран снова удалось без каких-либо проблем, на этот раз при помощи библиотеки Adafruit SH110X. Я снова накидал простенький тест для быстрого вывода графики из буфера на экранчик, и снова получил удивительно низкую скорость обновления экрана, несмотря на то, что использовал экран с интерфейсом SPI и подключил его через аппаратный SPI.

Тогда я сделал то, что нужно было бы сделать первым шагом: собрал и загрузил пример от Adafruit. И это снова фиаско: просто какое-то слайд-шоу. Настолько медленно библиотека не работает даже на 8-битной классической Ардуине.

Едва ли я делаю что-то не так, но, возможно, это очередная специфика платы. Например, неизведанная пока особенность местной реализации SPI, которую как-то можно обойти и получить адекватную скорость работы. Вероятно, нужно снова углубиться в дебри и задействовать DMA. Разобраться с этим я планирую в будущем.

А пока, раз уж с динамичной графикой не задалось, я решил вывести наглядный результат всего этого упражнения на самый большой экран из всех, что у меня есть, 4-дюймовый TFT с разрешением 480 на 320 пикселей и контроллером ILI9488. К сожалению, на этот раз возникли проблемки, ни одна библиотека для этого контроллера не заработала.

Пришлось опять урезать осетра и взять экран поменьше, 3.2-дюймовый с разрешением и контроллером ILI9341. С ним заработало. Сначала только через программный SPI, от чего скорость вывода картинки получилась просто умопомрачительная. Потом заработал и аппаратный SPI (нужно было просто подключить RST, а в примере кода этого не было). С ним скорость заметно выросла, но всё равно осталась крайне низкой.

▍ Впечатления


Самое главное: плата действительно работает, и в вопросе интеграции в Arduino IDE и простоты освоения у неё всё довольно неплохо — уже значительно лучше, чем можно найти в прошлогодних отзывах. Правда, поначалу я не нашёл в IDE примеров для конкретной этой платы, идущих с установочным пакетом. Но они есть, и на самом видном месте: в секции основного меню примеров, а не в подменю, как обычно. Там обнаружилось немало полезного. Ещё один плюс — некоторые популярные библиотеки и устройства заработали без проблем.

Потенциал MIK32 «Амур» мне пока оценить не удалось. Он определённо имеет интересные возможности — таймеры, ЦАП. Но я ожидал от платы производительности на уровне Blue Pill на STM32, а из-за особенностей системы прерываний и непонятной ситуации с шиной SPI, либо чем-то ещё, фактическая производительность в моих типовых задачах оказалась удивительно низкой. Думаю, дело в наивном подходе, и при правильном использовании возможностей контроллера эта проблема решится.

Отдельный нюанс — скорость загрузки скетчей. Уж не знаю, почему, но скетчи размером порядка сотни-другой килобайт могут загружаться удивительно долго. Полумегабайтный скетч загружается буквально четыре с половиной минуты. Не очень понимаю, зачем в такой ситуации на плате 32 мегабайта Flash-памяти, ведь они будут прошиваться год. Возможно, что-то не так на моей стороне, и всё работает медленнее, чем задумано.

Что касается краеугольного вопроса импортозамещения, пока, конечно, всё упирается в стоимость платы. Получится ли добавить в словосочетание «русская ардуина» прилагательное «народная» — очень сильно зависит от конкурентоспособной цены. Всё-таки сила Ардуины с точки зрения самодельщика-энтузиаста — в платках по цене шаурмы, которые не жалко пихать куда угодно в неограниченных количествах. В текущих же реалиях плату можно рассматривать как технологический демонстратор и девборду, чем она, по сути и является.

▍ Заключение


Первое знакомство состоялось, и, несмотря на определённые шероховатости, его можно считать вполне успешным. Правда, я толком не прикоснулся к особенностям применяемого на плате микроконтроллера и не смог раскрыть его потенциал. А значит, нужно углубляться.

В следующий подход к снаряду попробую сделать какой-нибудь небольшой максимально импортозамещённый проект на базе этой платы. Будет ли это электронная игрушка, видеоигра, или, может быть, музыкальный синтезатор? Посмотрим!

P.S. Исходники моих собственнных тестов, если они кому-то понадобятся, можно скачать в моём блоге на Бусти. Телеграм-канала по прежнему нет, извините.
P.P.S. Также смонтировал видео всех тестов из статьи под бодрую музычку.

© 2025 ООО «МТ ФИНАНС»

Telegram-канал со скидками, розыгрышами призов и новостями IT ?

Комментарии (84)


  1. fututu
    19.06.2025 16:39

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


    1. shiru8bit Автор
      19.06.2025 16:39

      Цены на голые чипы в рознице тоже не очень. В Чип и Дипе аж 3К за чип, на Озоне (где ж ещё чипы покупать) три штуки за 3К. То есть 1000 за голый чип. Если очень хотеть, то конечно можно, но пока действительно трудно сказать, что это разумный выбор для энтузиаста.


      1. AbitLogic
        19.06.2025 16:39

        Я в 10 раз дешевле с частотой в 10 раз выше беру, какой в этом камне по такой цене смысл я не понимаю, если бы он продавался рублей по 100-150, можно было кофеварку или сервопривод какой-нибудь на нём собирать, на большее он всё равно не потянет, а так не выгодно его в изделия пускать стоимостью меньше 15к, а это, простите э, уровень микро-пк, а не 32МГц, 16кБ ОЗУ


        1. NutsUnderline
          19.06.2025 16:39

          какой в этом камне по такой цене смысл я не понимаю

          а если Родина скажет: "НАДО" ;)


          1. Stealch
            19.06.2025 16:39

            Родина всегда готова обобрать гражданина. Дай только повод =)))


            1. NutsUnderline
              19.06.2025 16:39

              в данном случае Родина еще и пачку денег дает ;)


      1. fututu
        19.06.2025 16:39

        Мы последний раз закупали много automotive grade чипов ATmega328P, ~3$ за штуку. Обычные стоят как пачка сухариков, в таком же количестве, как сухариков в пачке. Ну и в целом, ландшафт популярных МК и около того не сильно кошмарит ценами с высоты сегодняшнего дня.


        1. jar_ohty
          19.06.2025 16:39

          Он помимо цены странный весьма. Уже то, что при такой цене и такой низкой производительности он требует внешнего флеша для программы, и что у него одно прерывание на все...


  1. angryman
    19.06.2025 16:39

    трудно ожидать, что в 2025 году у кого-то не будет на компьютере Windows 10 или 11, а будет аж Windows 7

    Вы не поверите, но во многих случаях нужна именно Windows 7. И 32-битная.


    1. shiru8bit Автор
      19.06.2025 16:39

      Верю, поэтому она у меня до сих пор и установлена.


    1. fututu
      19.06.2025 16:39

      Для таких историй почти всегда срабатывает ВМ с пробросом USB-устройства в виртуальную машину ;)


      1. Gryphon88
        19.06.2025 16:39

        Еще бы проброс всегда работал. Но еще бывает, когда оборудование подключается к pci/pcie плате от производителя оборудования, и тогда ВМ совсем не вопрос.


        1. fututu
          19.06.2025 16:39

          Проброс "физики" работает вообще всегда на сегодня и так же на древнее "вчера", даже видимокарты и пресловутое D3D/OGL(Vulkan, etc...). Вопрос в гипервизоре и в CPU хоста, наличия VT-d/x/AMD-Vi, SR-IOV, APICv, etc.

          Это не заменит "железяку", но вполне работает, если не нужны полноценные мощности нативного окружения.

          PCI/PCIe девайс прокинуть в ВМ обычное дело, вы точно что-то делаете не так.


      1. MaFrance351
        19.06.2025 16:39

        Минус в том, что могут быть неочевидные глюки. Такие, что всё как бы работает, но слишком медленно или просто периодически отваливается. К примеру, если какой-нибудь USB-UART прокидывается сравнительно без проблем (только лучше прокидывать не сам адаптер, а порт, на него назначенный), то вот что-то чуть-чуть более скоростное вроде SDR или логического анализатора уже начнёт подтупливать.

        Я так довольно долго мучился с прошивкой одного древнего телефона: почему-то на этапе бэкапа предыдущей прошивки этот самый прошивальщик где-то на полпути вылетал с неведомой ошибкой, а я упорно не понимал, что именно делаю не так. После где-то десяти неудачных попыток попробовал всё то же самое, но на настоящем ПК, и процесс прошёл успешно с первого раза.


        1. MaFrance351
          19.06.2025 16:39

          О. Вот ещё вспомнилось.

          Как раз пример в тему - надо подключить железку к древнему (проще запустить на системе, для которой он был актуален, чем долго и муторно всё это пересобирать) софту в ВМ.

          В настройках ВМ включён контроллер XHCI, SDR воткнут в USB 3.0 порт, активирован проброс в виртуалку, железка даже определяется софтом, но... ничего не работает. Пропускной способности этого канала не хватает, сигнал передаётся с прерываниями и телефоны его не ловят. При этом при подключении к обычному ПК всё работает без задержек.


          1. fututu
            19.06.2025 16:39

            Судя по скрину - это VirtualBox. Там буквально ничего не работает, а что работает, то падает.


            1. IsUnavailable
              19.06.2025 16:39

              Проброс "физики" работает вообще всегда на сегодня

              Тогда уж нужно уточнять, что работает всегда, но не везде)


              1. VT100
                19.06.2025 16:39

                Насколько знаю, для проброса железа в ВМ нужна поодержка IOMMU в чипсете.


            1. MaFrance351
              19.06.2025 16:39

              На VMware мы тоже пробовали. И результат был аналогичным.


      1. Soorin
        19.06.2025 16:39

        Ха, недавно я боролся со скачиванием, простите, MIDI-данных с древного устройства (Yamaha QY-70) в древнюю-же программу (QY Data Filer - запускается под Windows10). Приходилось пользоваться USB-MIDI адаптером неплохого производителя (т.к. подключение по RS-232 не заработало даже под Windows 7 c реальным COM-портом). Без ошибок не получалось передать данные ни под Windows 10, ни под Windows 7, ни под Windows XP на Atom 410 - до тех пор, пока я реально не воспользовался компьютером на P-4 под Windows XP.

        Этим-же компьютером (под DOS, c шиной ISA) я пользуюсь, когда нужно запустить такое устройство, как ARVID 1031.


        1. shiru8bit Автор
          19.06.2025 16:39

          Ох, как бы я хотел тоже позаниматься скачиванием с QY70 или QY100. Давно охочусь, они редко всплывают в продаже в наших краях. У меня для таких целей, для запуска сильно старых устройств, есть отдельный ПК на Pentium II и Windows ME, с ISA, COM, LPT, но и с USB тоже.


        1. NutsUnderline
          19.06.2025 16:39

          даже под Windows 7 c реальным COM-портом

          в виндах где то с 2000 немного поменяли api доступа к компортам если номер порта выше COM9 то может не работать надо немного допилить

          ARVID 1031.

          сразу представился ретро-обзор на эту штуку


          1. AKudinov
            19.06.2025 16:39

            Мне кажется, в Windows API всегда так было (даже в мануале из Win32 SDK об этом написано было), ну, либо, во всех NT-based: если номер порта двузначный, то при вызове CreateFileEx имя порта нужно указывать в виде "\\.\COMxx"


            1. NutsUnderline
              19.06.2025 16:39

              да я про это, я то это проходил в win98 которая не NT-based. И я не один такой был кто это не предусмотрел


          1. Gryphon88
            19.06.2025 16:39

            А еще то ли до win2k, то ли до хр можно было устраивать ногодрыг на lpt и com...


  1. Serge62
    19.06.2025 16:39

    Спасибо! Очень интересно всегда прочитать про Новое! Продолжайте!


  1. buratino
    19.06.2025 16:39

    MIK32 «Амур», о существовании которой я узнал несколько дней назад из статьи на Хабре.

    ну да, ну да...верим-верим


    1. shiru8bit Автор
      19.06.2025 16:39

      Про МК я слышал в этом году краем уха от коллег, что ожидается перспективная разработка с "отечественным RISC-V", но деталями не интересовался, так как думал, что речь опять про что-то недоставаемое. Про платы или не слышал, или не помню. Статья по ссылке попалась на глаза в день выхода, сразу купил и заменил другой свой готовящийся к публикации материал в надежде, что эта тема погорячее, чем мои обычные ретро-ковыряния, и наберёт какие-то просмотры.

      Скрытый текст


      1. buratino
        19.06.2025 16:39

        7 июня прочитать, купить, дождаться доставки, проделать все эти действия и написать статью немалого размера 19 июня.

        Вспоминается известная фраза Станиславского.


        1. shiru8bit Автор
          19.06.2025 16:39

          Ну я же всё-таки слегка профессионал, занимаюсь этим (текстами) четверть века. Статьи такого объёма на готовом материале я обычно пишу за день-два. Плата пришла 13 числа, для Озона это долго, обычно приходит на следующий день. Данная статья начата сразу при получении платы, закончена позавчера, потому что параллельно делались все тесты и набирался материал, и ещё день доснимал видео и фотки. И она сразу же попала в слот публикации, без ожидания.


          1. sepetov
            19.06.2025 16:39

            При таких показателя снимаю шляпу!

            Я у каждой статьи по несколько дней текст "вылизываю", чтобы получилось что-то читабельное. Ваш слог достаточно лёгкий. Спасибо!


  1. Moog_Prodigy
    19.06.2025 16:39

    Да, похоже это для мазохистов. Столько усилий и 50% кончились пшиком. Одна и та же вечная проблема у нашей микроэлектроники - документация и поддержка через пень-колоду + секретность на ровном месте.

    Ну хоть цена уже позволяет купить, все же не 100 тыщ за камушек или "отгружаем только партией от миллиона чипов".


    1. shiru8bit Автор
      19.06.2025 16:39

      Документация на чип, кстати, довольно неплохая и подробная. Но её надо тщательно курить. Я делал эти первые тесты в условиях ограниченного времени, и не успел нормально разобраться — но, думаю, это как раз и показательно, что реально ожидает смельчака, который это купит и пройдёт тот же начальный путь. Пока кажется, что при должном приложении усилий реально дожать и получить более адекватные результаты. Попробую это сделать через некоторое время, очень интересно, взлетит ли.


    1. checkpoint
      19.06.2025 16:39

      Да, похоже это для мазохистов. Столько усилий и 50% кончились пшиком.

      Не соглашусь. Попытка "в слепую" запустить 8-ми битные библиотеки от Arduino на 32-х битной платформе без адаптации дает такой вот результат.

      Стандартная HAL библиотека от производителя тоже не эффективна, содержит кучу избыточного неисполняемого кода который быстро пожирает крохотный EEPROM. В одном из проектов мне пришлось отказаться от HAL, работать с регистрами самостоятельно и компилировать с флагом -flto. Всё получилось.

      Ну хоть цена уже позволяет купить, все же не 100 тыщ за камушек или "отгружаем только партией от миллиона чипов".

      Микросхему пока еще можно купить без проблем в Чипдипе - 3000 руб за шт. Скорее всего они скоро закончатся, так как была произведена всего одна партия, AFAIK.


  1. Rusrst
    19.06.2025 16:39

    Было интересно. Но я бы если честно выкинул бы Arduino ide и взял бы компилятор и писал бы на голом си/си++. Как минимум проблемы с обработчиком прерывания от таймера (что там вообще может левый код делать, в куске, скорость выполнения которого критична) не было бы.

    Ну и 32 бита конечно смотрятся интересно, жаль что USB нет у чипа. С ним было бы гораздо удобнее наверняка.


    1. shiru8bit Автор
      19.06.2025 16:39

      Согласен, с голым C++ было бы эффективнее. Вероятно, это будет следующий шаг. А в BSP Arduino хорошо бы разработчикам предусмотреть переопределение trap_handler на пользовательский. Хотя бы чтобы после пользовательского ISR, если он исполнялся, мог быть сразу return. Типа, if(ISR()) return;


  1. fututu
    19.06.2025 16:39

    В этой истории меня интересует две вещи. Правда ли тут 12bit ADC? И можно ли частоту PWM программно задавать с шагом в 1Гц?


    1. shiru8bit Автор
      19.06.2025 16:39

      Пока у меня проверенных ответов нет, только информация из документации. Там обещан 12-битный АЦП, на резистивном ЦАП из двух каскадов по шесть бит, плюс компаратор и мультиплексор на 8 каналов, с частотой оцифровки до 800 кГц. ШИМ делается таймерами, два 32-битных (третий не умеет) и три 16-битных. Я пока не разбирался, как это работает в действительности. Подозреваю, что 32-битные таймеры могут дать шаг частоты ШИМ до 1 Гц, но это не точно.


    1. checkpoint
      19.06.2025 16:39

      Правда ли тут 12bit ADC?

      Я тестировал АЦП на MIK32, 12 бит там нет - снизу и сверху присутствует сильная нелинейность. Vref = 1.8V создает массу схемотехнических проблем.


  1. Nurked
    19.06.2025 16:39

    Мдя, если посмотреть на техпроцесс КР580ВМ80А, то можно увидеть, что раньше в СССР процессоры слизывались с аналогов, и хотя бы производились в стране.

    Но, если посмотреть на заводы: Выпускался на НПО «Кристалл» (г. Киев, Украина) и на заводах «Днепр» (г. Херсон, Украина), «Квантор» (Тернопольская обл., Украина), «Родон» (г. Ивано-Франковск, Украина), «Квазар» (г. Киев, Украина), «Электронприбор» (г. Фрязино, Россия). То станет очевидно, что даже такого мы не можем уже делать.

    Теперь мы скатились до переклейки шильдиков.


    1. NutsUnderline
      19.06.2025 16:39

      "мы" :) я даже сходил погулить какие производства есть во Флориде :) :)


      1. Nurked
        19.06.2025 16:39

        Оригинал с которого это было слизано


  1. alekseypro
    19.06.2025 16:39


    1. shiru8bit Автор
      19.06.2025 16:39

      Всё не так просто. Эта тема детально обсуждалась во времена выхода МК. Он совместим по пинам, в плату поставить можно вместо PIC16. Но архитектура у него несовместимая, нечто среднее между MCS-51 и PIC, и прошивку от PIC туда не залить.


      1. randomsimplenumber
        19.06.2025 16:39

        прошивку от PIC туда не залить

        Тогда это нифига не аналог.


        1. shiru8bit Автор
          19.06.2025 16:39

          Именно. Но смуту внёс сам Ангстрем, это у них на сайте было (и остаётся) написано, что аналог. Видимо, иначе тогда этого слона было не продать.


          1. randomsimplenumber
            19.06.2025 16:39

            cхе-хе. Купил как то на Али термостат. В интернетах писали, что вроде как на stm8. Думаю: о прикольная девборда за 1 бакс, с кнопками и индикатором. а вот и нет. там что-то 8051 совместимое, требуется необычный программатор..


            1. MaFrance351
              19.06.2025 16:39

              N76E003AT20? Он как раз в корпусе как у самой популярной STM8, но да, на 8051. Сейчас, насколько помню, энтузиасты сделали возможность его шить прогером на чипе CH341A.


              1. randomsimplenumber
                19.06.2025 16:39

                Возможно. Хитрые китайцы маркировку сошлифовали ;)


      1. jar_ohty
        19.06.2025 16:39

        Он аналог в смысле того, что сама идея архитектуры там 1 в 1 (и где там i51 вы увидели, пик пиком...). Ну, как MSP430 почти 1 в 1 слизана с PDP-11 (правда, ради увеличения числа регистров ее попортили...)


  1. vvzvlad
    19.06.2025 16:39

    На плате также присутствуют разъём USB Type C для загрузки скетчей, 

    Как там, CC-резистор стоит или опять забыли?


    1. shiru8bit Автор
      19.06.2025 16:39

      Два pull down резистора есть и на схеме (она выложена), и на той плате, что у меня.


      1. vvzvlad
        19.06.2025 16:39

        О, это хорошо. Где-то затесался разраб с макбуком, видимо.


  1. vladkorotnev
    19.06.2025 16:39

    Антистатик-пакетика может не быть потому, что используется чёрный антистатический поролон. В идеале, конечно, и то и то, но с точки зрения дизайна мб решили что пакетик в поролоне не смотрится, или просто сэкономили. Можно проверить поролон тестером в режиме омметра.


    1. jar_ohty
      19.06.2025 16:39

      Не любой антистатический материал будет проводящим. Тем более при проверке тестером в режиме омметра. У розового поролона прекрасные антистатические свойства, а сопротивление -- гигаомы.


      1. Moog_Prodigy
        19.06.2025 16:39

        Хм, а если проверять такой поролон емкостным методом, зажав между двумя листами текстолита с медью например? И сравнивать с "обычным", не?


  1. Ilia_Mitin
    19.06.2025 16:39

    Респект за Bad Apple, понастальгировал


    1. checkpoint
      19.06.2025 16:39

      Статью читал с помощью нейросети ? ;-)


  1. checkpoint
    19.06.2025 16:39

    Хочу сделать пару замечаний по поводу низкой производительности МК MIK32 "Амур" наблюдаемой автором статьи.

    1. Стандартные библиотеки для Arduino рассчитаные для работы на 8-ми битной ATmega ожидаемо не могут работать быстро на 32-х битной платформе без глубокой переработки, так как по-байтовый доступ к памяти очень медленный! Нужно всё переписывать на использование 32-х битных слов.

    2. Код обработчика прерывания, как и весь остальной критичекий для скорости исполнения код, желательно располагать в EEPROM или в SRAM. Исполнение кода из QSPI Flash очень медленнное. Идея разработчиков микросхемы расположить в EEPROM загрузчик, а основную программу в QSPI показала свою полную непригодность!

    3. По возможности следует использовать аппаратные блоки для работы с SPI и прочей аппаратурой, так как "bit banging" будет очень медленым.

    Основной недостаток MIK32 это катастрофически малый обьем EEPROM - 8КБ для 32-х битной платформы это жутко мало и эквивалентно 2КБ для ATmega. Разместить в этом объёме какую-то полезную программу крайне затруднительно, учитывая что код инизацилизации аппаратуры достаточно громоздкий и съедает весь объём EEPROM. То же самое могу сказать и про статическое ОЗУ которого всего 16КБ. Из-за этих проблем MIK32 конкретно проигрывает 8-ми битным МК архитектуры AVR8. Ждем следующей версии этого МК. :-)


    1. shiru8bit Автор
      19.06.2025 16:39

      Спасибо за замечания! У меня уже были подозрения про некоторые из этих моментов. Второй подход к снаряду не за горами, во второй раз надеюсь выжать побольше.


      1. checkpoint
        19.06.2025 16:39

        Без Bad Apple будет несчитово. :)


        1. shiru8bit Автор
          19.06.2025 16:39

          Вызов принят!


    1. sabaca
      19.06.2025 16:39

      Ждем следующей версии этого МК. :-)

      А она вообще планируется? Думаете это не разовая акция?


      1. checkpoint
        19.06.2025 16:39

        Есть некоторые основания думать, что нет. Ходят слухи что вторая версия MIK32 (на самом деле уже третья) будет с тактовой частотой в 10 выше. Еще обещали зафиксить проблемы с АЦП.

        В прошлом году студенты НИУ МИЭТ разработали аналогичный МК на том же Синтакоровском ядре SCR1. Этот МК получил название Hackee. Он был изготовлен на зеленоградском Микроне на все тех же 180 нм. Имеет тактовую частоту 85 МГц, статическое ОЗУ обьёмом 128 КБ. На мой взгляд это уже серьезная заявка не велосипед (с) ...

        Иными словам, потенциал у технологии 180 нм есть, разработки изделий ведутся.


  1. UFO_01
    19.06.2025 16:39

    Но для реализации этой схемы таки придётся лезть в самые дебри, городить очередь из буферов, и всё это становится всё меньше похоже на необременительное легкомысленное ардуинщество.

    Если контроллер поддерживает прерывание когда процесс DMA выполнен наполовину, это просто делается — ждём пока передастся одна половина буфера, после взвода прерывания перезаписываем эту часть. А вот если такого не завезли, придётся изворачиваться.


    1. shiru8bit Автор
      19.06.2025 16:39

      Похоже, что не завезли, поэтому и возникли мысли, что буфера надо два, по классике, как на SoundBlaster под DOS. Пока ещё не выяснил, возможна ли цепочка буферов и насколько большая будет пауза между ними.


      1. UFO_01
        19.06.2025 16:39

        Хм, если не завезли, и чтобы цепочку буферов не городить можно так сделать. В качестве источника триггера DMA установить таймер и на него повесить счётчик. Как только счётчик досчитает до половины размера буфера перезаписать первую половину, как только досчитает до размера буфера обнулить и перезаписать вторую половину (ну или сделать два буфера и между ними переключаться). Не знаю будет работать или нет, первое что в голову пришло.


        1. Nansch
          19.06.2025 16:39

          не, буфер один, циклический. DMA может его копировать нон-стоп, выдавая сигналы о выполнении половины диапазона адресов (младший полубуфер) и выполнении всего диапазона адресов (старший полубуфер). Вот по этим сигналам и подкидывать данные в тот полубуфер, который только что был отработан.


          1. UFO_01
            19.06.2025 16:39

            Я буквально то же самое написал в комментарии выше :)

            Но я так глянул, вроде бы то самое

            сигналы о выполнении половины диапазона адресов (младший полубуфер)

            на MIK32 не завезли, есть только

            выполнении всего диапазона адресов (старший полубуфер)

            Либо же я доку читал не тем чем надо.


          1. shiru8bit Автор
            19.06.2025 16:39

            Я пока не знаю, есть ли там возможность узнать текущую позицию чтения DMA. По классике помимо цепочки буферов есть ещё вариант кольцевого буфера, куда данные пишутся в свободный отрезок между последней позицией записи и позицией чтения DMA. Но он менее стабильный.


            1. UFO_01
              19.06.2025 16:39

              Да, там вроде есть счётчик DMA и из него можно вычитать текущую позицию.

              Но я вот наоборот думаю — для DMA кольцевой буфер более надёжный и предпочтительный вариант. А может просто дело привычки — с FreeRTOS очень удобно с кольцевым буфером работать. Сработало прерывание на половину DMA — разбудил задачу, положил новые данные, уснул, и так по кругу. И что самое главное — это модульность, а не приколоченный намертво код. Мне поэтому ардуино и не особо нравится (хотя я с неё начинал).


  1. Dark_Purple
    19.06.2025 16:39

    А что такое свой jtag, j-link не будет работать?
    И да, у меня тоже w7, мне дело делать надо, а не апдейты бесконечные ставить!


    1. shiru8bit Автор
      19.06.2025 16:39

      Продаются комплекты со своим и без него, зачем — непонятно. На Хабре есть статья, где JTAG у автора взлетал долго и сложно. У меня есть J-Link, но пока не рискнул играться, попозже, когда надоест ардуинить. Думаю, должен работать, по описанию там всё по стандарту.


      1. checkpoint
        19.06.2025 16:39

        Никаких проблем с JTAG у MIK32 нет. Я достаточно давно использую FTDI FT2232 в качестве универсального программатора, он прекрасно работает с OpenOCD и MIK32, прошивает и EEPROM, и QSPI Flash, и ПЛИСы всех мастей. Но есть некоторые нюансы - нужно подготовить скрипт, спаять правильный провод и взять правильную версию OpenOCD.

        J-Link от Segger это проприетарная лабудень, у меня с ним вообще половина микросхем не работает, я уже лет 10 не доставал его из шкафа. Рекомендую и Вам задвинуть его в шкафчик поглубже. :-) Весь опенсорс живет на FTDI.


        1. Dark_Purple
          19.06.2025 16:39

          Ценю ваши рекомендации, но у меня по этому вопросу строго противоположное мнение. Называть мейнстримный отладчик "проприетарная лабудень", ну такое.. Уже лет 15+ работаю J-Link'ом, опенсорс не показатель, там нет вариантов.


    1. UFO_01
      19.06.2025 16:39

      Там оригинальный отладчик сделан на основе FT2232H, можно с OpenOCD спокойно работать. И я так подозреваю что j-link таки не будет работать.


      1. NutsUnderline
        19.06.2025 16:39

        jlink будет работать очень ограниченно. ему нужны .frm файлы для прошивки и .svd для показа регистров


  1. slog2
    19.06.2025 16:39

    У автора большой стаж и опыт в электронике. И то, куча времени ушла на разборки с косяками и не всё получилось. У начинающего ардуинщика, который в большинстве своём может только готовые библиотеки компилировать и не открывал даташита на процессоры скорее всего вообще ничего более менее сложного не получится. Ну а что, я начинал программировать процессоры когда документация была только в бумажном виде и то не вся, и никаких форумов и интернетов в развитом виде вообще не было. И ничего, при желании всё делается.


    1. NutsUnderline
      19.06.2025 16:39

      автор еще хорошо скакнул за рамки ардуины, а вот качество документации сейчас и "тогда" еще надо посравнить - ее вообще не пишут, а в уши будут петь про ИИ и nocode приходиться перенабивать поистине "магические строчки" не из копированных 10 раз листов, а с видетуориалов, причем автор кооторых ушел в туман и его не спросить даже.


    1. NutsUnderline
      19.06.2025 16:39

      а собственно вот конкретно этот МК как раз по такому же принципу осваивать, есть документация, но на формах и интернетах инфы пока что нет особо


  1. Mulfarion
    19.06.2025 16:39

    Для меня как для любителя собирать всякие проекты с датчиками движения, дисплеями, инфракрасными датчика и и светодиодными лентами с веб-мордой. Я не понимаю в чем интерес купить плату за оверпрайс, потом курить как все запустить и упирается в то, что оно работает не так как надо. По моему должно быть так, купил, подключил и сиди код и оно будет работать так, как ты ожидаешь. Да, отечественное, да новое, но полудохлое, зачем оно нужно?


    1. shiru8bit Автор
      19.06.2025 16:39

      Этому вопросу посвящён целый раздел в статье. Ещё, как говорится, я купил, so you don't have to.


  1. EvgenySbl
    19.06.2025 16:39

    Доброе утро! Подскажите пожалуйста, работали ли аналовой переферией на данном микроконтроллере?

    Все ниженаписанное лишь предположение.

    Откуда появился интерес?

    Вынашиваю планы написать свой простенький процессор на Verilog и использовать его в ПЛИС от GoWin. Когда посмотрел на кристалл микроконтроллера, почему-то подумал что это просто прошитая ПЛИС.

    Когда прочитал про схемотехнику АЦП на компараторе и резистивном DAC на напряжении 1.8V, то еще больше окреп в мысли о том что ПЛИС и ОУ/компаратор встроили внутрь кристала. У некоторых производителей есть готовые модули процессора в Verilog коде, которые позволяют грузится с внешей Flash и использовать кэш на основе BSRAM. Т.е. даже переделывать ничего ненужно. Обычно у ПЛИС есть банки 3.3V и 1.8V, отсюда мысли о том что 1.8V банк приколхозить некуда, по этому на него повесили АЦП.

    А много плата потребляет?

    Не закидывайте дизлайками. Я реверс-инженер, в прошлом работал с The IDA/Ghidra и немного ковырял схемотехнику, по этому часто предполагаю. Гипотезу о том что там FPGA проверить не могу, т.к. у меня нет этого МК.

    Почему этот вопрос интересен. Допустим, у меня получится написать оптимальный код МК (для FPGA нужно оптимизировать под LUT-(4)), а под кристалл под логику и блоки готовые и это разное. Будет ли возможность отдать его на тот же микрон чтобы они процессор запустили в серию. Или у нас только вода, а то что производят из своих "МК",- просто прошитые и перемаркированные FPGA? Или нет смысла и все-таки покупать ARM дешево кучками и не парится?


    1. VT100
      19.06.2025 16:39

      "Прошитая FPGA (ПЛИС)" - ближе к БМК (ASIC) и отличается отсутствием огромного количества транзисторов, коммутирующих простейшие внутренние ячейки (таблицы + Д-триггер, LUT + DFF).

      ПЛИС могли использоваться на этапе отладки ядра и периферии МК. Потом, полученная RTL "компилировась" напрямую в "кремний".