Первое мое знакомство с микроконтроллерами компании «Миландр» произошло в далеком 2019 году. В то время приобрести чипы в розницу было практически невозможно, не говоря уже об отладочных платах. С программным обеспечением и отладочными инструментами дела обстояли так же печально, что и побудило меня тогда создать программу Конфигуратор CooCox IDE, которая позволяла интегрировать поддержку чипов Миландр в среду CooCox IDE. Подробно о том, как это сделать описано в статье: Программирование микроконтроллеров Миландр в среде CooCox IDE 1.7.
Недавно я посетил сайт Миландр и с большим удивлением обнаружил, что наконец-то их чипы стали доступны для покупки простым смертным разработчикам. Более того, на OZON хоть и очень редко, но появляются в продаже отладочные платы К1986ВЕ92FI-Mini на микроконтроллере К1986ВЕ92FI ( MDR1211FI ). Цена на них, конечно, всё еще высокая по сравнению с теми же копеечными альтернативами на STM32, RP2040, nRF52 и т.д., но уже не такая заоблачная, какой была раньше. В этой статье речь как раз и пойдет об отладочной плате К1986ВЕ92FI-Mini. Я подготовил для читателей небольшое руководство, позволяющее максимально снизить порог входа в программирование микроконтроллеров Миландр и сфокусироваться не на инструментах и ПО, а на решении прикладных задач. Речь пойдет о старом добром CooCox IDE (среда программирования для микроконтроллеров ARM на базе Eclipse), а точнее о его модифицированной версии, содержащей в себе все необходимые инструменты и пакет драйверов Standard Peripheral Library (SPL) для работы с чипом К1986ВЕ92FI, а также множество официальных примеров для работы с периферией.
CoIDE — не самый современный инструмент, но я выбрал его как простую и надёжную основу. Профи легко перенастроят Eclipse или VS Code. Моя задача — сэкономить ваше время на низкоуровневых настройках (линкер-скрипты, GDB-сервер, конфиги) и позволить сразу перейти к программированию. Этот материал рассчитан на новичков и всех, кто хочет сосредоточиться на решении задачи, а не на инфраструктуре.
Вот так выглядит плата К1986ВЕ92FI-Mini.

Характеристики платы:
- USB-разъем Type-C;
- стабилизатор 3.3В (плата может питаться прямо от USB);
- разъем для подключение отладчика (интерфейс SWD);
- пользовательские кнопки USR (PB6) и RST;
- пользовательские светодиоды USR (PB7) и PWR;
- кварц 32768 Гц для RTC;
- кварц 8МГц для MDR;
- посадочное место для возможности установки микросхемы памяти SPI EEPROM;
- возможность выбора режима загрузки с помощью перемычек MODE[2..0] (можно прошить MDR через UART2);
Всю техническую документацию на плату К1986ВЕ92FI-Mini, в том числе принципиальную электрическую схему и спецификацию, можно найти на официальным Миландр: К1986ВЕ92FI-Mini отладочная плата микроконтроллера.
Ниже приведена распиновка К1986ВЕ92FI-Mini:

Теперь расскажу какие инструменты необходимо приобрести/изготовить, скачать и установить:
- Во-первых, нам понадобится программатор-отладчик. Производитель предлагает приобрести «Комплект универсального программатора для микросхем с ядром CORTEX-M и архитектурой RISC ТСКЯ.468998.109». Честно говоря, даже не представляю где его можно купить. Более того, не рекомендую это делать. Предлагаю изготовить программатор CMSIS-DAP самостоятельно из китайского клона ST-Link или платы Blue Pill на STM32. Это делается очень легко и просто. Подробности в статье: Универсальный CMSIS-DAP отладчик для ARM-микроконтроллеров своими руками за копейки. Далее мы будем работать именно с отладчиком CMSIS-DAP.
- Во-вторых, нужно скачать и установить компилятор ARM GCC Toolchain. Взять можно здесь: gcc-arm-none-eabi-10.3-2021.10 (все примеры тестировались с данной версией).
- В третьих, перейти в репозиторий https://github.com/unsi9ned/coide-builder и скачать последний релиз среды CoIDE. На момент написание данной статьи это версия CoIDE v1.7.11. Релиз представляет собой portable-версию программы. Достаточно просто распаковать архив в удобное место на диске (рекомендую C:\CooCox\CoIDE-v1.7.11). После этого программа готова к работе – просто запускаем CoIDE.exe.
- Необходимые для работы с платой и для ваших задач утилиты, например монитор COM-порта: putty, Termite и т.д.
Сразу при первом запуске CoIDE укажите программе местоположение компилятора. Делается это через меню Project / Select Toolchain Path.

Также я предлагаю произвести настройки IDE в Edit / Preferences, которые на мой взгляд будут полезными.
Настройка индексации. В CoIDE эта функция урезана и работает некорректно. Индексация новых файлов не всегда происходит автоматически и иногда приходится переходить в настройки «С/С++/Indexer» и инициировать данный процесс ручным сбросом/установкой флага «Enable Indexer». Рекомендую в «С/С++/Indexer» включить все возможные опции индексации:

Текстовый редактор. Его настройка осуществляется в «General/Editors/Text Editors». Здесь рекомендую включить разделительную полосу, подсказывающую пользователю когда ширина кода выходит за пределы 80 символов. Иногда это полезно при распечатке листинга программы (код не переносится на новые строки), а так же для визуального восприятия кода. Так же включить опцию «Show whitespace characters». Это поможет видеть где в коде используются пробелы, а где табуляции, и приучает к дисциплине и культуре написания кода.

Workspace. Здесь нужно отключить опцию «Build automatically», а также установить кодировку по умолчанию для текстовых файлов UTF-8.

Проверка правописания. Очень назойливая функция, которая находит ошибки орфографии во всех комментариях, написанных на русском языке. Отключается в меню «General/Editors/Spelling» снятием флага «Enable Spell Checking».

Остальные настройки Code Style, Colors and Fonts и т.д. настраивайте по своему усмотрению и в соответствии с внутренними корпоративными требованиями к стилю кода. Далее переходим непосредственно к созданию самого проекта Project / New Project. В окне создания проекта будет предложено выбрать режим Chip или Board. В текущей версии CoIDE нет поддержки конкретной платы К1986ВЕ92FI-Mini, поэтому выбираем Chip. В дереве чипов выбираем Milandr / Cortex-M3 / K1986VE92XI:

Спустя несколько секунд перед пользователем открывается вкладка Repository. Здесь можно увидеть большой список драйверов периферии (Standard Peripheral Library) и также различные примеры.

Предлагаю начать с примера PORT_Blink_2.0.0. Просто выбираем его в списке и IDE автоматически подключит все необходимые драйвера, startup-файл, ядро CMSIS Core и т.д. Из-за того, что некоторые файлы используются в нескольких компонентах одновременно, может возникать предупреждение об этом. Пользователю нужно согласиться на перезапись всех существующих файлов «Yes To All»:

В дереве проекта мы видим файл Examples/MDR32F9Q2I/PORT/Blink/main.c – это и есть наш пример PORT_Blink_2.0.0. Он устанавливает на пине PB7 сначала низкий уровень 0, а затем спустя некоторое время – высокий 1, и данное действие повторяется в бесконечном цикле. На нашей плате светодиод подключен как раз к пину PB7, поэтому нам ничего не нужно менять в коде программы. Запускаем сборку Project/Build (F7). И видим ошибку конфликта имен, потому что у нас в проекте два файла с именем main.c… Нужно удалить пустой файл main.c, находящийся в корне проекта и перезапустить сборку.
Далее подключаем наш программатор CMSIS-DAP к порту SWD отладочной платы и подаем внешнее питание через USB. Питать плату от программатора нежелательно, т.к. внутренний стабилизатор может быть не рассчитан на ее ток потребления.
Теперь, когда программатор подключен, переходим к его настройкам View/Configuration. Переходим на вкладку Debugger и задаем следующие настройки:
- Adapter: CMSIS-DAP
- Port: SWD
- Max Clock: 2M
Остальные настройки оставляем по умолчанию:

На вкладке Download снимаем флаг «Auto Download Before Debugging». Остальные настройки не меняем:

Теперь все готово для прошивки. Запускаем Flash/Program Download. Произойдет стирание и запись Flash-памяти микроконтроллера с помощью встроенной утилиты pyOCD. Мы видим, как наш светодиод начал мигать с частотой примерно 2 Гц.
Чтобы войти в режим отладки запускаем Debug/Debug (Ctrl+F5). Программа остановится, как и ожидалось, в начале функции main(). Состояние регистров периферии можно увидеть открыв окно View/Peripherals:

Остановить отладку можно из меню Debug/Terminate (Ctrl+F5) либо нажав кнопку Terminate на панели инструментов.
Попробуем теперь изменить время задержки и слинковать скомпилированную программу в RAM-памяти микроконтроллера:
for(long i = 0; i < 50000L; i++);
В окне Configuration переходим на вкладку Link и в области Memory Areas выбираем Debug in RAM. При этом мы увидим, что изменились адреса размещения данных Read/only (они располагаются в начале RAM-памяти) и адреса данных Read/write (они располагаются в RAM после области Read/only):

Запускаем пересборку проекта Project/Rebuild (Ctrl + R) и сразу переходим в отладку Debug/Debug (Ctrl+F5). Так как программа теперь размещается в RAM-памяти, в перепрошивке нет необходимости. На вкладке Debug мы видим, что функция main() теперь располагается по адресу 0x2000046a. Это свидетельствует о том, что проект собран и слинкован правильно. Если мы запустим программу Debug/Run (F5), то увидим, что светодиод мигает с увеличенной частотой.

По аналогии с примером PORT_Blink_2.0.0 можно давить в проект любой другой из предоставленного списка, предварительно сняв флаг с примера PORT_Blink_2.0.0. Так пример UART_RetargetSTDIO_2.0.2 демонстрирует работу модуля UART2. В нем показано, как перенаправить стандартный ввод-вывод (STDIO) в UART. После вывода на печать форматированной строки «Start echo:» программа переходит в режим обратной петли: все принятые по UART символы отправляются обратно на печать.
Вот и все. Выглядит действительно очень просто. Но для достижения такого результата мне понадобилось проделать достаточно объемную работу по интеграции компонентов и устройств Миландр в среду CoIDE:
- Разработка утилиты для установки и управления CMSIS-пакетами (Device Family Pack, Software Pack) CoIDE Pack Installer. Идея позаимствована из среды разработки Keil, для которой создаются данные пакеты. Это избавило меня от ручного редактирования базы данных среды CoIDE. Достаточно правильно распарсить файл описания пакета pdsc, в котором прописаны все зависимости компонентов друг от друга, а так же полный набор характеристик каждого отдельного чипа.
- Адаптация официального пакета драйверов Milandr.MDR32FxQI_DFP.1.3.2 под среду CoIDE и компилятор GNU GCC. Подробно об изменениях можно ознакомиться в README к репозиторию: https://github.com/unsi9ned/Milandr.MDR32FxQI_DFP
- Интеграция в среду CoIDE программы pyOCD и разработка программы-адаптера, транслирующего консольные команды CoFlash в команды для pyOCD: https://github.com/unsi9ned/coflash-adapter
- Собрать это всё воедино в виде portable-версии: https://github.com/unsi9ned/coide-builder
Надеюсь, что данный проект кому-то облегчит жизнь. Свои замечания, предложения и пожелания можете оставлять в комментариях. Я не исключаю, что в работе перечисленного выше софта могут возникать ошибки. Поэтому, если обнаружите таковые, то прошу сообщать о них там же. Буду исправлять по мере наличия свободного времени и желания. По вопросам сотрудничества, пожалуйста, заполните форму обратной связи.
