Comments 13
...может самостоятельно и автономно генерировать шумовой сигнал (зачем он может быть нужен, рассмотрим ближе к концу).
Так и не понял, в чëм смысл генерирования шумов. В рандомных числах? Или я просто не уловил шутку последнего пункта.
Спасибо за эту серию статей.
Загрузил код с указанного github.
И тут возникла проблема. Некоторые примеры компилируются и собираются. Но некоторые завершаются с кодом ошибки
$ make
mkdir -p build
riscv64-unknown-elf-gcc -c -MD -MP -MT build/main.o -MF build/dep/main.o.mk -march=rv32imac_zicsr -mabi=ilp32 -mcmodel=medany -static -fno-plt -fno-pic -fno-asynchronous-unwind-tables -fno-unwind-tables -DHXTAL_VALUE=8000000 -Wall -Os -g -Wno-main -Wstack-usage=400 -ffreestanding -Wno-unused -nostdlib -fno-builtin-printf -Ilib/Firmware/GD32VF103_standard_peripheral/Include/ -Ilib/Firmware/GD32VF103_standard_peripheral/ -Ilib/Firmware/RISCV/drivers/ -Ilib/Firmware/ -DAUDIOSRC='"_binary_src_audiodata_wav"' src/main.c -o build/main.o
cc1: error: '-march=rv32imac_zicsr': unsupported ISA subset 'z'
make: *** [makefile:59: build/main.o] Error 1
Отсюда и вопрос. Как обойти эту ошибку? Например это пример 12.1.ch32v303_blink_C. В ряде других примеров ошибка та же самая.
Спасибо. Хотелось разобраться и запустить все примеры.
Из того, что я прочитал в первых строках выдачи гугла, такая ошибка возникает на Убунте. Что-то там в последней версии неудачно собрали. Попробуйте установить другую версию - более старую например. Или, возможно, из другого репозитория. Или той, что идет в комплекте с фирменной IDE, которая MounriverStudio - если, конечно, вы ей пользуетесь.
Либо, в качестве времянки, можно использовать костыль: убрать этот zicsr, оставив только rv32imac / rv32imafc. Тогда он будет ругаться не неизвестные имена CSR-регистров. Но уж их можно руками задефайнить. Кажется, в первый раз про CSR я упоминаю в статье про прерывания. Там в примере кода написано
.equ mtvt, 0x307
.equ mtvt2, 0x7EC
.equ MSTATUS_MIE, (1<<3)
Адреса можно найти в документе priv-isa. В той версии, что лежит в репозитории, это таблица Table 7. Currently allocated RISC-V machine-level CSR addresses.
Например это пример 12.1.ch32v303_blink_C
Только что проверил. Оно почему-то компилируется и без zicsr. Видимо, я что-то делаю не так, ну да ладно. В общем, несколько вариантов обхода я озвучил, надеюсь, хоть один да сработает.
Спасибо! Да, действительно скомпилировалось без zicsr.
Есть ещё вопрос. Я приобрёл 2 платы. Одна на контроллере CH32V307. Другая с контроллером CH32V317. В вашем makefile я вижу несколько переменных с именами различных контроллеров. Но не понятно под какой конкретно контроллер собирается бинарный файл. Я сделал бы несколько целей для сборки под конкретный контроллер. Но я пока не очень понимаю разницу между контроллерами и самое главное разницу в сборке. Что вы посоветуете?
И другой вопрос. Меня интересует CH32V317. В makefile не указан такой контроллер, хотя он попадает в шаблон 3xx. Есть ли какие-то особенности при сборке именно с этим контроллером? Если, можно, напишите пожалуйста здесь подробнее.
Еще. Вы упомянули среду разработки MounriverStudio. Я конечно же заходил на китайский сайт, где они предлагают этот IDE. Но там многоступенчатое получение продукта. И начинается оно с того что надо подать заявку на создание учетной записи. Потом надо сделать ещё что-то. Ну, короче, пока для меня это не очень реально. Нет ли какого-то другого пути, чтобы получить рабочую среду разработки MounriverStudio?
Спасибо. С уважением, Сергей.
В вашем makefile я вижу несколько переменных с именами различных контроллеров. Но не понятно под какой конкретно контроллер собирается бинарный файл.
Переменная MCU: https://github.com/KarakatitsaRISCV/riscv-asm/blob/main/12.1.ch32v303_blink_C/makefile#L5 Там в makefile у меня немного противоестественная логика выбора стартапа и флагов получилась. Формирование имени переменной из содержимого другой переменной. Да и добавлял я эти настройки скорее для себя, чем для статей.
Я сделал бы несколько целей для сборки под конкретный контроллер.
Не понял что вы предлагаете. Чтобы можно было делать make v307
, и код собрался под ch32v307 что ли? Но код собирается под конкретную плату с конкретной разводкой и конкретным камнем. Проще переменную MCU прописать.
Ну либо, как я уже сказал, я просто неправильно понял что вы предлагаете.
И другой вопрос. Меня интересует CH32V317. В makefile не указан такой контроллер, хотя он попадает в шаблон 3xx.
Насколько я знаю, единственное его отличие от v307 - более быстрый ethernet. Так что если лень писать свой шаблон, укажите v307. Я для тестов иногда и v303 / v307 на чужих шаблонах собираю. Там тоже отличия невелики, в основном набор периферии (скажем, в v303 меньше таймеров, UARTов и нет быстрого USB) и объем памяти.
По поводу шаблона выбора камня, первое важное отличие это семейство (какой стартап использовать и какие инклюды инклюдить), то есть v1x, v2x, ... Второе - доступные расширения (в v203, например, нет FPU, там список rv32imac, а в v303 - есть, там imafc). Ну и третье - объем памяти и ее распределение. То есть выбор ld-файла. А если вы optionbyte-ами соотношение захотите поменять, лучше этот ld-файл вообще положить поближе к своим исходникам отдельно от "системных" библиотек.
Но по большому счету разницы почти и нет. Какой-нибудь несложный код от v203 скорее всего запустится и на v317 даже без перекомпиляции.
Еще. Вы упомянули среду разработки MounriverStudio. Я конечно же заходил на китайский сайт, где они предлагают этот IDE. Но там многоступенчатое получение продукта.
Вот тут не подскажу. Я ее когда-то давно откуда-то скачал (не факт, что даже с официального сайта), но толком запустить так и не смог. Да в общем-то и не пытался: kwrite + make удобнее.
Спасибо за ответ!
Теперь я приступил к практике. И попробовал залить бинарник в плату и поморгать. Но не тут-то было. У меня есть два варианта как подсоединить плату.
Через штатный программатор LinkE с интерфейсом TX,RX и SWCLK, SWDIO. Сам программатор в системе определяется как 1a86:8012. И появляется ttyACM0. Но при попытке make prog возникает ошибка
$ make prog stty -F "ttyACM0" 300 stty: ttyACM0: No such file or directory make: *** [makefile:114: prog] Error 1
Если я запускаю Putty на этом порту, то коннект происходит. Конечно ничего не передаётся и не принимается. Но коннект есть.
Второй путь - это попробовать подсоединить плату через порт USB Type-C. Но плата в этом случае вообще не определяется. Я под убунтой работаю.
Вот и вопрос. Как правильно подключить плату? Так чтобы можно было её программировать?
Да, я в makefile исправил имя порта на ttyACM0
Другая плата вот такая https://aliexpress.ru/item/1005009165970746.html?sku_id=12000048173069755&spm=a2g2w.productlist.search_results.2.66ff6297hannvf
Возможно,
stty -F "ttyACM0" 300
/dev/ttyACM0. Нужен абсолютный путь. И не забывайте, что через бутлоадер можно прошивать только когда контроллер запущен в режиме бутлоадера (boot0 на питании). Прошивки по USB это тоже касается.
Через штатный программатор LinkE
Возможно, вам будет проще через SWD и шить. Придется либо найти пропатченный openocd от китайцев (в том же Mounriver должен быть), либо патчить самостоятельно. Там, правда, тоже есть свои проблемы: https://karakatitsariscv.github.io/12.ch32v303_intro.html
Доброго дня!
Вот ещё одна проблема. При попытке собрать https://github.com/COKPOWEHEU/wch-isp.git выходит вот такая ошибка
$ make
gcc -Wall -O2 `pkg-config --cflags libusb-1.0` -I/home/serge/miniconda3/include/ -DVERSION=\"0.1.2\" -c wch_yaml_parse.c
In file included from /home/serge/miniconda3/include/yaml-cpp/yaml.h:10,
from wch_yaml_parse.c:2:
/home/serge/miniconda3/include/yaml-cpp/parser.h:10:10: fatal error: ios: No such file or directory
10 | #include <ios>
Здесь в команде видно, что я уже подправил путь к yaml-cpp. Я просто указал путь в переменной INCS. В начале gcc ругался, что не находит yyaml. Теперь он ругается что не находит стандартный <ios>. Это очень странно. Как быть?
У меня yaml-cpp вообще не установлен. Для компиляции достаточно libyaml-dev.
Если вы устанавливаете библиотеку штатным способом, никаких путей к ней прописывать не надо. Все через pkg-config найдется.
А что до недостающих файлов, apt-file search
может помочь определить к какому пакету они относятся.
если попробовать в качестве компилятора указать g++, то тут вообще ж*па
Вы про то, что С++ возражает против неявного приведения указателей к void* и обратно? Ну, приведение можно сделать и явным.
если попробовать в качестве компилятора указать g++, то тут вообще ж*па
wch_yaml_parse.c:127:25: error: invalid conversion from ‘void*’ to ‘yvar_t*’ {aka ‘yaml_var*’} [-fpermissive]
127 | yvar_t *temp = realloc(cur->arr, sizeof(yvar_t)*newsize);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| void*
Понимаете, что это такое.
Спасибо! Заработало. Просто установил libyaml-dev.
Прошил плату, на которой установлен ch32v307VCT6. Светодиод заморгал.
Вот теперь хочу поэкспериментировать с АЦП и операционными усилителями. К сожалению на вашем github не нашёл исходников примеров, которые вы даёте в тексте этой статьи. Не могли бы вы ими поделиться. Я пока не очень силён в этой теме. Спасибо
Ну, по операционникам код как раз-таки весь приведен. Там правда нет ничего больше, чем заполнение OPA->CR
. А по встроенному АЦП я сам не слишком много разбирался. Но если хотите, вот делал игрушку на ch32v203. АЦП там используется. https://github.com/COKPOWEHEU/MailNotifer_ch32
Работа с RISC-V контроллерами на примере GD32VF103 и CH32V303. Часть 7. АЦП, ЦАП