Как стать автором
Обновить

Работа с RISC-V контроллерами на примере GD32VF103 и CH32V303. Часть 1: введение и Hello world

Время на прочтение16 мин
Количество просмотров8.5K
Всего голосов 20: ↑19 и ↓1+21
Комментарии20

Комментарии 20

Спасибо за статью, очень интересная. У самого все руки не доходят обмазался riscv, как следует

А в чем достоинство этих микроконтроллеров на (риск5) GD32VF103 и CH32V303 по сравнению с классическими (АРМ) - stm32, они доступнее?

Думаю, что по доступности, да и по параметрам сравнимы.
У WCH есть несколько интересных моделей. Например, ch32v307, у которого аппаратный USB-HS (480 Мб/с) плюс не менее аппаратный Ethernet (10 Мб/с). Вроде бы собираются запускать v317, у которого эзернет будет 100 мегабитный. У того же v307 просто неприличное количество UART-ов: 8 штук в 64-ногом корпусе (ума не приложу где столько может пригодиться). Есть серия v208 с аппаратным блютусом. И напротив, есть всякие v203 в достаточно приятных корпусах, которые пригодны для новичков - CH32V203K8 в lqfp32 (шаг выводов 0.8) или, как на моей кошмарной платке под спойлером CH32V203G8 с шагом 0.635. Это не то что для ЛУТа проблем не представляет - это можно от руки маркером нарисовать. Есть v103, которая по мощности и периферии так себе, зато пятивольтовая. Есть v003 (и вроде как планируется v006), которая тоже пятивольтовая, но максимально дешевая и примитивная. Но все равно 32-битная. Мне она неинтересна именно в силу примитивности - на ней ничему не научишься.
Именно по сравнению с дешевыми stm - несколько выше частота. 108/144 МГц против 72 МГц у f103. Причем почти вся память кешируется в оперативке, то есть никаких wait-state-ов.
Впрочем, к stm-кам и прочим arm-ам я не особо присматривался. Наверняка, там есть не менее интересные камни.
Но по большей части мне просто ассемблер понравился. Гораздо проще для изучения, чем arm или тем более x86. То есть отличное наглядное пособие для изучения внутреннего устройства ЭВМ.

Легко посмотреть цены на Али, поискав платки GD32VF103CBT6, STM32F103C8T6 и заодно STM32F401CCu6. Второй и третий сопоставимы, причём третий кажется мощнее второго (но нет CAN) и не слышно про подделки. А первый самый дорогой почему-то. Можно ещё про STM32f411CEU6 вспомнить, но нужна ли эта повышенная по сравнению с STM32F401CCU6 частота?

li t0, PORTB_OCTL

lw t1, 0(t0)

xori t1, t1, (1<<LED)

sw t1, 0(t0)

Если такое захотят проделать одновременно например главный тред и прерывание, или два разных треда (в случае RTOS), или прерывания разных преемптивных приоритетов, всё это с разными битами в одном и том же регистре, то произойдёт катастрофа. Можно запрещать прерывания вхлам и потом разрешать (будет критическая секция). НО: в cortex-m3/m4 есть спец. область адресного пр-ва, где запись в конкретный ворд нуля или ненуля мапится аппаратно (т.е. непрерываемой последовательностью read-modify-write) в изменение бита в регистре или памяти.

Соотв-но вопрос, а что есть на эту тему в этих ядрах risc-v?

Поддержка команд вида amo* ?
Поддержка механизма lr/sc ?

Именно для портов, как и у stm32, аналог регистра BSRR. У GD32 это GPIO_BOP / GPIO_BC, у CH32 - BSHR / BCR. У некоторой другой периферии бывают другие механизмы защиты от одновременного доступа.
А если речь об атомарных функциях уровня ядра, то расширение A как раз за это отвечает. Самому мне им пользоваться не приходилось, но если интересно, можете посмотреть в описании risc-v ""A" Extension for Atomic Instructions".

Ну вот я и спрашиваю, в ядрах которые в этих МК -- есть атомики?

Набор расширений - IMA(F)C. Раз расширение "A" поддерживается, значит, должны быть. Но, еще раз говорю, сам я его не тыкал. Хм, а остальные тыкал. Может, и исправлю когда-нибудь этот пробел. Но не в приоритете, в этих камнях куча куда более интересных вещей. Да хоть прерывания или уровни привилегий.

Спасибо за статью, особенно за теплый стиль "для самых маленьких". Было бы неплохо добавить куда-то в текст шпаргалку по ассемблеру RISC-V (такую или такую), а то как-то резковато получается.

Спасибо что напомнили. Шпаргалка-то у меня есть, просто в статью добавить забыл
UPD: добавил в конце ссылку на шпаргалку и на общую документацию.

Но на 5-вольтовых линиях такой защиты нет, и если подать туда слишком большое напряжение — уже безразлично, с резистором или без — можно легко пробить транзисторы.

Странно, у STM32 такая защита уже давным-давно есть. Неужели китайцы ее не сделали? Верится с трудом, честно говоря.

У stm тоже не все так гладко. Недавно натыкался то ли, то ли на вопрос на форуме на статью (сейчас с ходу не нашел), что если подавать 5 В при выключенном питании, оно просачивается куда не надо, а это опасно. То есть защита там включается только при подаче питания на сам контроллер.
И у GD / WCH такая защита тоже наверняка есть. Но она не описана в документации и, в частности, неизвестно, какой ток она держит.

Недавно натыкался то ли, то ли на вопрос на форуме на статью (сейчас с ходу не нашел), что если подавать 5 В при выключенном питании, оно просачивается куда не надо, а это опасно.

Ну так и 3.3 вольта на выводах незапитанного контроллера просачивается куда не надо, вплоть до попыток контроллера включиться.

3.3 В паразитного питания хотя бы безопасно для основных цепей. А вот если пролезут паразитные 5 В, уже что-нибудь может сломаться.

подавая на соответствующую ножку поочередно 0 и 3.3 В (лог.0 и лог.1 соответственно). Если посмотреть на схему, светодиоды соединены с ножками PB5, PB6, PB7.

Здесь было бы не лишним отметить правило для рассматриваемого чипа - максимальная распределенная нагрузка при подключении к выводам не должна превышать по току более 100 мА, исходя того, что один выход рассчитан на 20 мА, иначе студенты после серии своих проектов вынесут Вам мозги своими вопросами - " что я не дописал в прошивках или не допаял паяльником, ничего не работает, MCU превратился в кирпич".
Далее следует Ваша лекция о практиках таких подключений к драйверам устройств и буферным схемам в их многообразии...)

Это если бы я рассказывал о силовой электронике. И начинать бы пришлось с законов Ома и Кирхгофа. Но я рассказываю об архитектуре ЭВМ. Здесь светодиоды - всего лишь индикация. Описать вообще все области, где применяются контроллеры, я не смогу физически.

Странно что в статье не упоминается применение классического CH340 драйвера, который на раз - два коммуницирует UART или RS232 стандартным терминалом без нужды в программаторах для счета или загрузки что позволяет подключать интерфейсом к USB-порту компьютера. , или я что-то пропустил?
У GD32VF103 обычно есть несколько выводов, поддерживающих USART, например:

PA9 (TX) — вывод для передачи данных.

PA10 (RX) — вывод для приема данных.

Вам нужно будет подключить TX микроконтроллера к RX на CH340, а RX микроконтроллера — к TX на CH340.

Либо вы невнимательно читали, либо я коряво написал. Попробую еще раз пересказать пункт 1.2. Есть три способа прошить контроллер:

  1. Через программатор по JTAG/SWD. Придется купить или сделать программатор и, возможно, пересобрать openocd из исходников (либо взять уже собранный бинарник от производителя). Зато можно будет поставить выполнение на паузу, посмотреть регистры, память и т.п. Лично мне этот вариант не понравился.

  2. Бутлоадером через USB. Платка втыкается прямо в USB компьютера. Не требует дополнительных плат или устройств, но нужно при каждой прошивке дергать ножки boot0, reset (или выдергивать платку). Не слишком удобно.

  3. Бутлоадером через UART. Платка соединяется с переходником COM-UART (например, на max232) или USB-UART (pl2102, ch340, ft232, ...) и прошивается через него. Переходник купить все-таки придется, зато через тот же UART возможна передача отладочной информации. Довольно удобно, если бы не все та же возня с boot0, reset. 3+. Развитие предыдущего способа. boot0, reset цепляются либо к DTR, RTS переходника, либо к специальным ногам самодельной платы. И stm32flash, и моя wch-isp эти линии дергать умеют. Но для себя я сделал "Каракатицу", которая эмулирует не один UART, а два, на одних и тех же ножках. Через один прошиваем, через второй отлаживаем.

  • Еще можно написать собственный бутлоадер и прошивать им хоть через захват таймера - но сначала этот бутлоадер все равно придется прошить одним из предыдущих способов.

Если это все же пробел в моих навыках лектора, а не ваших - читателя - буду благодарен если подскажете как сформулировать лучше.

У GD32VF103 обычно есть несколько выводов, поддерживающих USART, например

Именно на счет GD32 не уверен, но CH32 прошиваются только через UART1 (кроме ch32v203g8, который прошивается только через UART2 - не знаю, что курили китайцы, когда это придумывали). В смысле через UART3 их не прошьешь.

без нужды в программаторах для счета или загрузки

Кстати о "счете" (чтении): загрузчик ch32 этого не поддерживает. Можно прошить, можно стереть и можно проверить. Все. Не считая нескольких ch-специфичных функций, которые сейчас интереса не представляют.

Странно что в статье не упоминается применение классического CH340 драйвера, который на раз - два коммуницирует UART или RS232 стандартным терминалом

CH340 ничем не лучше любого другого переходника - да хоть той же FT232. А вообще, как раз следующая статья будет про UART. Материала у меня записано довольно много, в одну статью так и так не влезет. Ну и еще за несколько тем я пока даже не брался.

Термин "тупая задержка" обозначает, во-первых, что во время нее контроллер не занимается ничем полезным, а во-вторых, что задержка завязана на подсчете тактов и не является точной. Такие задержки могут использоваться в простом коде, когда контроллеру все равно больше нечем заняться, или если задержка слишком мала чтобы за время нее успеть выполнить что-то другое.

Следует уточнить они не так чтоб тупые, они несут свои полезные функции. Ввод таких таймингов позволяет настраивать синхронизацию аппаратных откликов в процессах обращения к триггерным значениям и переключениям между командами, устойчивое открытие выходных каналов, счет данных в задаваемые промежутки со стороны устройств (ввиду их специфики собственного тактирования) сбора данных и т.п., подавления дребезга... и т.п.

Не думаю, что подобные излишние уточнения здесь уместны.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий