
Внимание!
Это мой первый опыт взаимодействия с отечественной микроэлектроникой, помимо прочего — я дилетант (студент) первокурсник, прошу отнестись соответственно и не кидаться тапками.
Прежде всего хочется поблагодарить Игоря 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"
И наблюдаем мигание! Вот как выглядит вся эта «цепочка»:
Дальнейшие действия ограничиваются только вашими желаниями.
Огромная просьба поправить меня в комментариях, если где то допущены какие либо ошибки. Спасибо!
ссылка на оригинал статьи https://habr.com/ru/articles/933670/
Добавить комментарий