Прошивка К1921ВГ015 без IDE и покупки JTAG программатора

от автора

Внимание!

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

Прежде всего хочется поблагодарить Игоря 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"

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

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

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

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

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


ссылка на оригинал статьи https://habr.com/ru/articles/933670/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *