
Внимание!
Это мой первый опыт взаимодействия с отечественной микроэлектроникой, помимо прочего - я дилетант (студент) первокурсник, прошу отнестись соответственно и не кидаться тапками.
Прежде всего хочется поблагодарить Игоря OSS-robotic (dev-mr-x) за огромный вклад в сообщество в виде удобной отладочной платы для ВГ015, а так же спасибо лично от меня, бедного студента, которому Игорь прислал собранную плату абсолютно бесплатно. Спасибо большое!
Начало
Итак, передо мной лежала полностью собранная плата и время стремилось к вечеру. Руки чесались хотя бы помигать светодиодом, а руководство было вскользь прочитано уже несколько раз, но тут меня осенило - у меня нет подходящего программатора!

Я грустно взглянул на свой китайский ST-LINK и уже было думал сдаться и копить на программатор, но вдруг вспомнил, что человек преуспел в адаптации почти всего что угодно под stm32f103. И не ошибся.
Этап 1: Создание JTAG программатора из BluePill
Поискав некоторое время в интернете я наткнулся на два проекта:
Их отличие заключается в поддержке со стороны OpenOCD (DirtyJTAG не поддерживается) и широте поддерживаемых устройств, которые можно "переделать" в JTAG программатор. По факту же zoobab/versaloon "кирпичил" мне мой блюпилл, так что пришлось шить DirtyJTAG.
С ним всё вышло с первого раза - пишешь make
и всевозможные варианты прошивки уже собраны, в моём случае (BluePill) понадобился файл dirtyjtag.bluepill.noloader.bin
, который я зашил удобным мне способом (ST-LINK + OpenOCD).
Важно! После успешной прошивки BluePill-a или другого устройства при подключении его через USB к ПК система должна будет опознать устройство с ID 1209:c0ca

Этап 2: Патч и компиляция модифицированного OpenOCD
Для работы с К1921ВГ015 всё равно потребуется модифицированная версия OpenOCD от ДЦ Восток с поддержкой отечественных микроконтроллеров. Но также требуется применить патч для поддержки нашего DirtyJTAG. Оригинальный патч вызывал конфликт, поэтому я его немного переделал. Так что по порядку:
# Клонируем репозиторий с модифицированным OpenOCD
git clone --recursive https://github.com/DCVostok/openocd-k1921vk.git
# Переходим в директорию репозитория
cd openocd-k1921vk
# Скачиваем патч для поддержки DirtyJTAG
curl -o patch.diff -L https://gitflic.ru/project/ntpssd/openocd-dirtyjtag-patch/blob/raw\?file\=patch.diff\&inline\=false\&commit\=01e071dd428154bd65d7f96e0ae6eb96d4878c16
# Применяем патч
git apply --verbose patch.diff
### Далее следуем оригинальной инструкции от OpenOCD
./bootstrap
./configure
make
Если возникают ошибки с calloc или у вас GCC 14+

В GCC 14 зачем-то поменяли порядок аргументов в calloc
задом-наперёд. Я исправлял всё вручную, займёт где то 10-15 рестартов make
и ручного редактирования всех проблемных файлов. Либо откатываться до GCC 13.
После успешной компиляции без ошибок устанавливаем в систему наш OpenOCD:
make install
Этап 3: Прошиваем К1921ВГ015
Прежде всего подготавливаем проект и программную часть, что будем шить то?
Мой вариант
Makefile
# Обязательно изменить под своё окружение!!!
TCHAIN=../../distr
TCBIN=$(TCHAIN)/riscv-gcc/bin
CC=$(TCBIN)/riscv64-unknown-elf-gcc
LD=$(TCBIN)/riscv64-unknown-elf-ld
AS=$(TCBIN)/riscv64-unknown-elf-as
OBJCOPY=$(TCBIN)/riscv64-unknown-elf-objcopy
#LIBS=/usr/riscv64-elf/lib/rv32imafc/ilp32f/
CFLAGS=-march=rv32imfc -mabi=ilp32f -msmall-data-limit=8 -mstrict-align -mno-save-restore -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common -fno-builtin -flto -DSELF_TIMED=1 -Wall -Wextra -g3 -ggdb -Tflash.ld -Iinclude -nostartfiles -Xlinker --gc-sections -lgcc -lc
#CFLAGS=-march=rv32imfc_zicsr –mabi=ilp32f -ggdb3 -Wall -Wextra -pedantic -fno-builtin-printf -nostdlib -T flash.ld # -static -L$(LIBS) -lc_nano -lg_nano -lgcc -T common.ld
INC=include/
SRC=main.c startup.c
TARGET=test
all:
$(CC) -I$(INC) $(CFLAGS) $(SRC) -o $(TARGET).elf
$(OBJCOPY) -O binary $(TARGET).elf $(TARGET).bin
main.c
#include <K1921VG015.h>
void main()
{
RCU->SYSCLKCFG |= (RCU_SYSCLKCFG_SRC_HSECLK << RCU_SYSCLKCFG_SRC_Pos);
while(RCU->CLKSTAT_bit.SRC != RCU->SYSCLKCFG_bit.SRC) {};
// Fout0 = 50 000 000 Hz
// Fout1 = 12 500 000 Hz
RCU->PLLSYSCFG0 =( 7 << RCU_PLLSYSCFG0_PD1B_Pos) | //PD1B
( 7 << RCU_PLLSYSCFG0_PD1A_Pos) | //PD1A
( 1 << RCU_PLLSYSCFG0_PD0B_Pos) | //PD0B
( 3 << RCU_PLLSYSCFG0_PD0A_Pos) | //PD0A
( 2 << RCU_PLLSYSCFG0_REFDIV_Pos) | //refdiv
( 0 << RCU_PLLSYSCFG0_FOUTEN_Pos) | //fouten
( 0 << RCU_PLLSYSCFG0_DSMEN_Pos) | //dsmen
( 0 << RCU_PLLSYSCFG0_DACEN_Pos) | //dacen
( 3 << RCU_PLLSYSCFG0_BYP_Pos) | //bypass
( 1 << RCU_PLLSYSCFG0_PLLEN_Pos); //en
RCU->PLLSYSCFG1 = 0; //FRAC = 0
RCU->PLLSYSCFG2 = 50; //FBDIV
RCU->PLLSYSCFG0_bit.FOUTEN = 1;
uint16_t tmp = 1000;
while(tmp) tmp--;
while((RCU->PLLSYSSTAT_bit.LOCK) != 1) {};
RCU->PLLSYSCFG0_bit.BYP = 2;
FLASH->CTRL_bit.LAT = 3;
FLASH->CTRL_bit.CEN = 1;
// Тактируем
RCU->CGCFGAHB_bit.GPIOCEN = 1;
// И включаем
RCU->RSTDISAHB_bit.GPIOCEN = 1;
// Разрешаем дёрганье
GPIOC->OUTENSET_bit.PIN0 = 1;
while(1)
{
for(uint32_t i = 0; i < 2500000; i++) {};
GPIOC->DATAOUT |= (1 << 0);
for(uint32_t i = 0; i < 2500000; i++) {};
GPIOC->DATAOUT &= ~(1 << 0);
}
}
startup.c
взят у COKPOWEHEU, ld скрипты взяты оригинальные.
Наконец - подключаем BluePill по USB к ПК, а К1921ВГ015 к BluePill по схеме:
STM32 |
JTAG |
---|---|
PA7 |
TDI |
PA6 |
TDO |
PA5 |
TCK |
PA3 |
TMS |
PA4 |
TRST |
Компилируем и прошиваем:
# Компилируем
make
# Прошиваем
sudo openocd -f interface/dirtyjtag.cfg -f target/k1921vg015.cfg -c "program test.bin 0x80000000 verify reset exit"
И наблюдаем мигание! Вот как выглядит вся эта "цепочка":

Дальнейшие действия ограничиваются только вашими желаниями.
Огромная просьба поправить меня в комментариях, если где то допущены какие либо ошибки. Спасибо!
Uzix
Здорово что для ВГ015 всё больше отладок появляется. Видимо, сыграли продажи голого контроллера на маркетплейсах. Я тоже буквально вчера свой вариант отладки допаял, если всё будет ок - выложу в опенсорс.