Проект изменений и дополнений оригинального кода OpenOCD (Open On-Chip Debugger) для поддержки российских микроконтроллеров RISC-V
Полностью открытый исходный код позволяет всем желающим быстрее осваивать проектирование и программирование устройств электроники на отечественных микроконтроллерах с процессорами открытой архитектуры RISC-V. Поэтому тестирование сборок данного ПО выполняется нами в первую очередь на самых доступных отладочных платах с открытыми проектами BluePill-MIK32, BlueBird-VG015 и LittleRedCap-VG5T, с программаторами из открытых проектов BlueProg, DAPLink и DirtyJTAG.
Уважаемые пользователи! Не забывайте и не стесняйтесь сообщать о любых ошибках, трудностях и неудобствах при работе с нашей сборкой OpenOCD. Это можно сделать в разделе Проблемы данного репозитория.
Уважаемые программисты! Подключайтесь к совместной разработке данного проекта. Общими усилиями мы гораздо быстрее достигнем необходимых нам результатов в деле совершенствования ПО для прошивки и отладки отечественных микроконтроллеров.
Текущими модификациями решены следующие задачи:
1) Интегрирован разработанный Владимиром Зайцевым (@rabidrabbit) прототип набора драйверов OpenOCD, предназначенный для программирования встроенного ЭСППЗУ и внешней флеш-памяти микроконтроллера К1948ВК015/8 (MIK32 Amur). Больше нет нужды в дополнение к OpenOCD использовать ранее незаменимый скрипт программирования памяти MIK32, написанный на языке Python, ведь OpenOCD и сам сможет загрузить прошивку по команде program, причём гораздо быстрее и с поддержкой большего разнообразия форматов файлов: BIN, HEX, ELF и S19 (см. документацию OpenOCD). Имейте в виду, что функционал новых драйверов сыроват и содержит множество недоработок, поэтому для его совершенствования нам требуются Ваши отзывы о результатах использования. Для загрузки прошивки в ОЗУ, как и всегда в OpenOCD, применяется команда load_image.
Сравнение программаторов по скорости и времени записи 16 МиБ во внешнюю флеш-память MIK32 Amur драйвером OpenOCD (командой flash write_bank). Рабочий режим флеш-памяти одноканальный (Single SPI) на частоте 4 MГц. Верификация не выполняется.
- BlueProg-V2.9-CH552, adapter speed 1600 — 21,1 КиБ/с (12 минут 55 секунд)
- DAPLink-V2.1.2-CH32V203, adapter speed 4000 — 21,3 КиБ/с (12 минут 47 секунд)
- DirtyJTAG-V2-STM32F103C8T6, adapter speed 1000 — 27,9 КиБ/с (9 минут 47 секунд)
- J-Link-OB-STM32F103-V1, adapter speed 1500 — 30,1 КиБ/с (9 минут 4 секунды)
- BlueProg-V3.1-CH32X035, adapter speed 1500 — 37,3 КиБ/с (7 минут 20 секунд)
- J-Link-V9.70-STM32F205, adapter speed 3000 — 38,3 КиБ/с (7 минут 7 секунд)
- CH347T-V4.41, adapter speed 3750 — 73,5 КиБ/с (3 минуты 42 секунды)
- FT2232HL, adapter speed 3750 — 102,9 КиБ/с (2 минуты 39 секунд)
Сравнение тех же программаторов по тем же критериям, но только запись производится скриптом программирования памяти MIK32. Рабочий режим флеш-памяти одноканальный (Single SPI) на частоте 16 МГц. Выполняется верификация после записи каждого сектора размером 4 КиБ.
- DAPLink-V2.1.2-CH32V203, adapter speed 4000 — 3,2 КиБ/с (1 час 25 минут 43 секунды)
- J-Link-OB-STM32F103-V1, adapter speed 1500 — 4,0 КиБ/с (1 час 7 минут 40 секунд)
- BlueProg-V2.9-CH552, adapter speed 1600 — 4,0 КиБ/с (1 час 6 минут 20 секунд)
- J-Link-V9.70-STM32F205, adapter speed 3000 — 5,2 КиБ/с (52 минуты 35 секунд)
- DirtyJTAG-V2-STM32F103C8T6, adapter speed 1000 — 5,4 КиБ/с (50 минут 40 секунд)
- BlueProg-V3.1-CH32X035, adapter speed 1500 — 7,1 КиБ/с (38 минут 29 секунд)
- FT2232HL, adapter speed 3750 — 7,2 КиБ/с (37 минут 44 секунды)
- CH347T-V4.41, adapter speed 3750 — 9,8 КиБ/с (27 минут 52 секунды)
2) Исправлена некорректная конфигурация инициализации доступа к отладочному порту микроконтроллера К1948ВК015/8 (MIK32 Amur), из-за которой становились бесполезными любые попытки загрузки прошивки без ручного переключения перемычек на запуск программы из ОЗУ (очищенного отключением питания), когда программа ранее загруженной прошивки назначала выводам с JTAG другие функции. Осциллограммы сигналов интерфейса JTAG при загрузке прошивки размером 2 КиБ в ОЗУ микроконтроллера К1948ВК015/8 (MIK32 Amur) программатором на основе FT2232HL до и после добавления команды предварительного сброса init_reset run ясно видно на этом изображении. Больше подробностей можно найти среди описаний и настроек опций в обновлённом файле конфигурации mik32.cfg для микроконтроллера К1948ВК015/8 (MIK32 Amur).
3) Отображение нестандартного CSR-регистра mcounten RISC-V ядра SCR1 микроконтроллера К1948ВК015/8 (MIK32 Amur) без использования опции riscv expose_csrs 2016=mcounten, которая выводит имя регистра с приставкой csr_;
4) Отображение всех нестандартных CSR-регистров RISC-V ядра SCR4 микроконтроллера К1921ВГ5Т;
5) Скрытие отображения диапазонов адресов CSR-регистров процессоров RISC-V при помощи опции riscv hide_csrs n[-m][...]. Это особенно полезно для несуществующих регистров, когда попытки чтения/записи их значений в режиме отладки вызывают исключение с кодом 2 (недопустимая инструкция) и могут приводить к нарушению логики отлаживаемой программы, что и было обнаружено при работе с микроконтроллером К1948ВК015/8 (MIK32 Amur). Параметры опции скрытия несуществующих CSR-регистров RISC-V добавлены в соответствующие файлы конфигураций:
В файл mik32.cfg для микроконтроллера К1948ВК015/8 (MIK32 Amur):
riscv hide_csrs 1-767,770,771,774-831,837-1951,1955,1957-1967,1971-2015,2017-2815,2817,2819-2943,2945,2947-3071,3075-3199,3203-3856,3861-4095
В файл k1921vg015.cfg для микроконтроллера К1921ВГ015:
riscv hide_csrs 4-767,775-802,807-831,837-927,930-943,952-1826,1831-1951,1957-1967,1971-2815,2817,2823-2943,2945,2951-3071,3075-3199,3203-3856,3862-4095
В файл k1921vg5t.cfg для микроконтроллера К1921ВГ5Т:
riscv hide_csrs 4-767,770-771,775-799,801-802,807-831,837-1951,1955,1957-1967,1971-2006,2008-2014,2016-2815,2823-2943,2951-3011,3016-3027,3029-3067,3079-3199,3207-3856,3861-4032,4036-4095
6) Поддержка JTAG-программатора открытого проекта BlueProg, для которого добавлен соответствующий файл конфигурации blueprog.cfg и прописаны права доступа в Linux-файле 60-openocd.rules.
7) Поддержка недорогих высокоскоростных JTAG-программаторов на основе микросхемы CH347T китайской марки WinChipHead (WCH), одним из которых является модуль USB-HS-Bridge Board. В драйвер ch347.c добавлено управление линией SRST (System Reset — внешний аппаратный сигнал системного сброса микроконтроллера), для которой можно менять режим работы выхода с Open-Drain (по умолчанию) на Push-Pull при помощи соответствующей опции конфигурации. Подробности назначения всех выводов и доступные опции настроек программатора описаны в файле конфигурации ch347t.cfg;
8) Поддержка JTAG-программаторов открытого проекта DirtyJTAG на основе дешёвых адаптеров и отладочных плат с популярными микроконтроллерами серий STM32F101, STM32F103 и RP2040.
9) Скрытие сообщений о неверных или несуществующих (в базе данных OpenOCD) идентификаторах отлаживаемых устройств;
10) Скрытие предупреждений об устаревших псевдонимах некоторых команд (при использовании в том числе Eclipse IDE), которые продолжают поддерживаться в самых свежих модификациях OpenOCD;
11) Поддержка программирования флеш-памяти 32-разрядных микроконтроллеров производства АО «НИИЭТ» и их отладки. У К1921ВГ015 с RISC-V ядром BM-310S6 разработки ООО «Клаудбеар» (CloudBEAR, LLC) в данной версии OpenOCD не обнаруживаются триггеры и поэтому не работают аппаратные точки останова. Для отладки этого МК используйте сборку сентября 2025 года. В драйвере программаторов на чипах CH347 не поддерживаются настройки скоростей JTAG-интерфейса ниже 468,75 кГц (adapter speed 469), и поэтому они не работают как положено с микроконтроллером К1921ВГ5Т, которому по умолчанию после сброса требуется скорость не выше 333,33 кГц (4 МГц / 12);
12) Поддержка программирования флеш-памяти 32-разрядных микроконтроллеров производства АО «ПКК Миландр» и их отладки. У MDR1206FI, MDR1215LGI и MDR1219LGI с RISC-V ядрами BM-310S0 разработки ООО «Клаудбеар» (CloudBEAR, LLC) в данной версии OpenOCD тоже имеются проблемы с отладкой. Для отладки этих МК используйте готовую сборку OpenOCD из раздела «Программное обеспечение» официального сайта АО «ПКК Миландр». Если этого недостаточно, то почитайте статью «Компиляция OpenOCD из исходных данных» или обратитесь в техподдержку АО «ПКК Миландр».
Плюсы и минусы функционала официальных исходников, использованных в этом выпуске OpenOCD по сравнению с выпуском сентября 2025 года:
1) Заметное прибавление скорости передачи данных по интерфейсу USB-JTAG, от 15% до 90%, в зависимости от типа применяемых адаптеров.
2) У микроконтроллера К1948ВК015/8 (MIK32 Amur) невозможно произвести останов ядра сразу после старта, а в текущей версии OpenOCD данный вид поведения классифицировали как критическую ошибку, но участок исходного кода с этим условием был найден и скорректирован. В результате К1948ВК015/8 (MIK32 Amur) не получил никаких минусов.
3) При запуске процесса отладки у микроконтроллера К1921ВГ015 перестало подсчитываться количество обнаруженных триггеров, и поэтому GDB не может задействовать аппаратные точки останова. Для отладки пользуйтесь сборкой сентября 2025 года. Загружать прошивку рекомендуется текущей версией OpenOCD из-за большей скорости передачи данных по USB-JTAG.
Пошаговая инструкция сборки OpenOCD для Windows
(проверено под Windows 10 x86_64 в MSYS2 2026-06-11 с MINGW64)
Установка сборочных зависимостей:
1) Скачать MSYS2 — ссылка на репозиторий с установочными файлами: Releases · msys2/msys2-installer, запустить и установить в папку по умолчанию C:\msys64;
2) В меню Пуск выбрать папку MSYS2 и запустить из неё консоль MSYS2 MINGW64;
3) Удовлетворить сборочные зависимости при помощи команды pacman -S для MINGW64:
pacman -S base-devel mingw-w64-x86_64-gcc mingw-w64-x86_64-gdb mingw-w64-x86_64-libtool mingw-w64-x86_64-pkg-config mingw-w64-x86_64-libusb mingw-w64-x86_64-libftdi mingw-w64-x86_64-libjaylink mingw-w64-x86_64-hidapi mingw-w64-x86_64-capstone git autoconf automake
Загрузка файлов проекта
Используя команду git clone загрузить файлы проекта из репозитория в локальную папку:
git clone https://gitflic.ru/project/rus_mcu/openocd.git
Перейти в корневую папку проекта:
cd openocd
Команды конфигурации и сборки
Команды запускаются в корневой папке проекта. Особенности сборки выбираются опциями команды configure, которые можно изучить, запустив конфигуратор с ключом --help. Опция --enable-internal-jimtcl добавлена для использования свежего встроенного пакета библиотек jimtcl, иначе конфигуратор использует по умолчанию внешнюю библиотеку, которой нет в MSYS2. Более новый встроенный пакет библиотек libjaylink включён опцией --enable-internal-libjaylink. Для ускорения сборки используется опция --jobs 8, которая увеличивает количество параллельных сборочных процессов до 8-ми (настройте её по-своему). На время сборки попробуйте отключить антивирус и/или свернуть окно терминала MSYS2, чтобы немного освободить процессор компьютера от решения бесполезных задач по проверке большого количества файлов и отображению непрерывного потока выводимого текста. Команда strip -s уменьшает размер исполняемого файла openocd.exe удалением из него отладочной информации и прочих ненужных для его работы данных.
./bootstrap
./configure --prefix="${PWD}/out" --disable-werror --enable-internal-jimtcl --enable-internal-libjaylink
make --jobs 8
strip -s src/openocd.exe
make install --jobs 8
В завершении сборки необходимо выполнить команду копирования файлов библиотек из системной папки mingw64:
cp C:/msys64/mingw64/bin/{libftdi1.dll,libhidapi-0.dll,libjaylink-0.dll,libusb-1.0.dll,libcapstone.dll} out/bin
Собранный после успешного выполнения всех команд пакет OpenOCD будет располагаться в папке out, а его исполняемый файл openocd.exe — в подпапке bin вместе c файлами библиотек, которые копируются из системной папки последними.
Чтобы при повторных сборках после внесения изменений в файлы исходного кода не повторялась генерация конфигурации и не копировалось большое количество файлов в папку out, достаточно выполнить команду make --jobs 8. Вновь собранный исполняемый файл openocd.exe располагается в папке src. Очистка от выходных файлов производится командой make clean.
В проекте используется открытый исходный код из нескольких источников:
1) Пакет openocd из репозитория openocd-org от 08.09.2026: openocd-bedefa238476ad852b1fafd927230e38e2092282
2) Пакет jimtcl из репозитория msteveb от 05.08.2026: jimtcl-825be07871b84ec5a7f098b2fe7990db612a6f98
3) Пакет libjaylink из репозитория libjaylink от 28.08.2026: libjaylink-5b9ab7b06249af69d349c3ce8b29e8769845071e
4) Патч с драйвером DirtyJTAG из пакета openocd в обсуждениях разработчиков от 19.01.2023: jtag: add support for adapter DirtyJTAG
5) Драйверы из пакета openocd в репозитории Владимира Зайцева (@rabidrabbit) от 23.02.2026: vostopenocd-8769f1ee45efc251e307d7442ebb442dd7befd93
6) Драйверы из пакета openocd в репозитории АО «НИИЭТ» от 26.03.2026: openocd-a3465b5cb09b475083415e73cfbb6d6aa5dc7f76
7) Драйверы из патча для пакета openocd-9ea7f3d647c8ecf6b0f1424002dfc3f4504a162c на сайте АО «ПКК Миландр»: OpenOCD для MК К1986ВК025, MDR1206, К1986ВК01 - Версия 0.2.2 от 29.04.2026
Ссылки на официальные странички программного обеспечения
MSYS2 — Software Distribution and Building Platform for Windows
OpenOCD — Open On-Chip Debugger
OpenOCD Code Review — Official site
Jim Tcl — Small footprint implementation of the Tcl programming language
jimtcl — Official repository of Jim Tcl, an open-source, small footprint implementation of Tcl
libusb — Cross-platform library to access USB devices
libFTDI — FTDI USB driver with bitbang mode
HIDAPI — Simple cross-platform library for communicating with HID devices — GitHub repository
libjaylink — Shared library written in C to access SEGGER J-Link and compatible devices
Capstone — Lightweight multi-platform, multi-architecture disassembly framework
SCR1 — SCR1 is a high-quality open-source RISC-V MCU core in Verilog
mik32-uploader — Скрипт программирования памяти микроконтроллера MIK32 Amur (К1948ВК015/К1948ВК018) производства АО «Микрон»
niiet/openocd — OpenOCD с драйверами флеш-памяти для микроконтроллеров производства АО «НИИЭТ»