Search
Write a publication
Pull to refresh

Comments 13

...может самостоятельно и автономно генерировать шумовой сигнал (зачем он может быть нужен, рассмотрим ближе к концу).

Так и не понял, в чëм смысл генерирования шумов. В рандомных числах? Или я просто не уловил шутку последнего пункта.

Если вдруг собственных шумов контроллера не хватит для oversampling-а.
В принципе, было бы забавно продемонстрировать описанный 1-битный АЦП и какую точность из него можно выжать. Вот там искусственные шумы были бы необходимы, все-таки их амплитуда должна быть равна питанию.

Спасибо за эту серию статей.

Загрузил код с указанного 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 удобнее.

Спасибо за ответ!

Теперь я приступил к практике. И попробовал залить бинарник в плату и поморгать. Но не тут-то было. У меня есть два варианта как подсоединить плату.

  1. Через штатный программатор 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 на этом порту, то коннект происходит. Конечно ничего не передаётся и не принимается. Но коннект есть.

  2. Второй путь - это попробовать подсоединить плату через порт USB Type-C. Но плата в этом случае вообще не определяется. Я под убунтой работаю.

  3. Вот и вопрос. Как правильно подключить плату? Так чтобы можно было её программировать?

  4. Да, я в makefile исправил имя порта на ttyACM0

    Плата у меня одна вот такая https://aliexpress.ru/item/1005008565715972.html?spm=a2g2w.detail.rcmdprod.32.facf60121M8I4r&mixer_rcmd_bucket_id=aerabtestalgoRecommendAbV2_controlRu1&pdp_trigger_item_id=0_1005009009256110&ru_algo_pv_id=357b9f-61b690-4d5da8-ad838f-1751612400&scenario=aerSimilarItemPdpRcmd&sku_id=12000045745933454&traffic_source=recommendation&type_rcmd=core

  5. Другая плата вот такая 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

Sign up to leave a comment.