Внимание!

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

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

Начало

Итак, передо мной лежала полностью собранная плата и время стремилось к вечеру. Руки чесались хотя бы помигать светодиодом, а руководство было вскользь прочитано уже несколько раз, но тут меня осенило - у меня нет подходящего программатора!

Нужен JTAG программатор :(
Нужен JTAG программатор :(

Я грустно взглянул на свой китайский ST-LINK и уже было думал сдаться и копить на программатор, но вдруг вспомнил, что человек преуспел в адаптации почти всего что угодно под stm32f103. И не ошибся.

Этап 1: Создание JTAG программатора из BluePill

Поискав некоторое время в интернете я наткнулся на два проекта:

  1. DirtyJTAG

  2. zoobab/versaloon

Их отличие заключается в поддержке со стороны OpenOCD (DirtyJTAG не поддерживается) и широте поддерживаемых устройств, которые можно "переделать" в JTAG программатор. По факту же zoobab/versaloon "кирпичил" мне мой блюпилл, так что пришлось шить DirtyJTAG.

С ним всё вышло с первого раза - пишешь make и всевозможные варианты прошивки уже собраны, в моём случае (BluePill) понадобился файл dirtyjtag.bluepill.noloader.bin, который я зашил удобным мне способом (ST-LINK + OpenOCD).

Важно! После успешной прошивки BluePill-a или другого устройства при подключении его через USB к ПК система должна будет опознать устройство с ID 1209:c0ca

Не факт, что у вас будет такое же название устройства, так что смотрите исключительно на ID
Не факт, что у вас будет такое же название устройства, так что смотрите исключительно на ID

Этап 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+
Ошибка порядка аргументов calloc
Ошибка порядка аргументов calloc

В 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"

И наблюдаем мигание! Вот как выглядит вся эта "цепочка":

Встретились как то русский и американец китайского происхождения...
Встретились как то русский и американец китайского происхождения...

Дальнейшие действия ограничиваются только вашими желаниями.

Огромная просьба поправить меня в комментариях, если где то допущены какие либо ошибки. Спасибо!

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


  1. Uzix
    04.08.2025 08:02

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