Найти в Дзене
921 подписчик

Первое знакомство с RISC-V на примере МК CH32V203C8T6

3,3K прочитали
Вид МК CH32V203C8T6 в фирменной упаковке.
Вид МК CH32V203C8T6 в фирменной упаковке.

Введение

Друзья, всем привет!

Статью я пишу 05.04.2023. Акцентирую на этом внимание, т.к. многое может поменяться в будущем. Оговорюсь сразу же - все, что буду писать здесь - это сугубо мое мнение и мой опыт. Это выжимка моего отношения к данной продукции спустя 7 дней использования.

CH32V уже много шуму навел в интернете. Всем интересно, что же это за микроконтроллеры на RISC-V, сложно ли с ними работать, надежны ли они и сможет ли рядовой мамкин программист помигать на нем светодиодом.

Т.к. я уже продолжительное время работаю с STM32 на регистрах по документации - буду вещать о программировании CH32V2x с точно таким же подходом. Аналога CubeMX и HAL сюда не завезли еще :) Есть подобие Spl библиотеки, но я ее не трогал.

Где купить

Где купить МК на али: https://aliexpress.ru/item/1005004350448639.html?spm=a2g2w.orderdetail.0.0.2c654aa6pIvkoe&sku_id=12000028859302500

В ChipDip еще недавно их продавали по 71р за 1 шт, но на сегодня их уже продают по 150р., либо 720р - 10 шт.

Итак, что нам предлагают за эти деньги?

Обратимся к сайту WCH: http://www.wch-ic.com/products/CH32V203.html?

System Block Diagram
System Block Diagram

Features

  • Qingke V4B, up to 144MHz system clock frequency.
  • Single-cycle multiplication and hardware division.
  • 20KB SRAM, 64KB Flash.
  • Supply voltage: 2.5V/3.3V. GPIO unit is supplied independently.
  • Low-power modes: sleep/stop/standby.
  • Down to 44.65uA/MHz in Run mode.
  • Down to 17.90uA/MHz in Sleep mode.
  • Power-on/power-down reset (POR/PDR), programmable voltage detector (PVD).
  • 1 x 18-channel general DMA controllers.
  • 2 amplifiers.
  • 10-channel 12-bit ADC, 10-channel TouchKey.
  • 4 timers.
  • One USB2.0 full-speed host/device interface.
  • One USB2.0 full-speed device interface.
  • 4 UARTs.
  • One CAN interface (2.0B active).
  • 2 IIC interfaces, 2 SPI interfaces.
  • 37 I/O ports, can be mapped to 16 external interrupts.
  • CRC calculation unit, 96-bit unique ID.
  • Serial 2-wire debug interface.
  • Packages: TSSOP20, QFN28, QFN48, LQFP32, LQFP48.

На первый взгляд это тот же STM32F103C8T6, только усовершенствованный, ведь у нас теперь частота не 72МГц, а целых 144МГц!!! Ого! Еще и пониженное энергопотребление! Круто!

А что по документам и ПО?

http://www.wch-ic.com/products/CH32V203.html?
http://www.wch-ic.com/products/CH32V203.html?

На главной странице нам предлагают скачать Datasheet, ReferenceManual и IDE на основе Eclipse под названием MounRiver Studio(MRS)

И первое, с чем я столкнулся, открыв Datasheet - Он на серию V3, а не V2, что ввело меня в ступор.

Datasheet на CH32V3
Datasheet на CH32V3

Долго тупя и непонимая, в чем дело, тыкался на сайте и в других местах в поисках правильного Datasheet. Нашел: http://www.wch-ic.com/downloads/CH32V203DS0_PDF.html

Правильный Datasheet от CH32V203
Правильный Datasheet от CH32V203

Ищем распиновку камешка:

CH32V203C8T6 - Pinout
CH32V203C8T6 - Pinout

Распиновка, как у STM32F103C8T6. Можем использовать любую плату от BluePill и начинать тестить. Я для этого использовал свои отладочные платы.

Вам еще понадобится файл, наподобие Programming Manual от ST.

Здесь он называется QingKeV4_Processor_Manual: http://www.wch-ic.com/downloads/QingKeV4_Processor_Manual_PDF.html

Программирование и отладка

CH32V203C8T6+WCH Link v1.1
CH32V203C8T6+WCH Link v1.1

Для программирования этих МК ST-Link не подойдет. Покупаем WCH Link.

В данном случае заказал на OZON WCH Link V1.1

Далее нам пригодится программа WCH Link Utility(аналог STM32 ST-Link Utility): http://www.wch-ic.com/products/WCH-Link.html

Установил драйвера. Запускаю. Программатор видится:

WCH Link Utility v1.60
WCH Link Utility v1.60

Но при подключении к МК возникает ошибка:

WCH Link Utility v1.60
WCH Link Utility v1.60

После часа разбирательств понял, что схема, которую я раньше использовал для STM32F - не работает для CH32V.

Ножки на SWD
Ножки на SWD

Дело было в подтягивающих резисторах на DIO И CLK, которые я всегда использовал на Stm32(всегда работало). Я их просто выпаял и МК начал обнаруживаться и прошиваться. Для теста еще распаял МК на китайском BluePill, там этих резисторов не было.

Так же замечу, что положения Boot 0 и Boot 1 вообще никак не влияют на подключение МК к программатору.

WCH Link Utility v1.60
WCH Link Utility v1.60

До сих пор я не понимаю только, почему FlashSize показывает, как 224 KB, когда там 64 должно быть. Но это ладно...Я очистил память МК и какого китайского черта память не "FF FF FF FF"...А "39 E3 39 E3"....

Что я делаю не так?!

Бежим в ReferenceManual в раздел 32 Flash Memory and User Option Bytes:

Note: After erasing is successful, word read - 0xe339e339, half word read - 0xe339, even address byte read - 0x39, odd address read 0xe3.

Вот такой прикол)

Ну ладно. Работает. Ок. Качаем MounRiver Studio.

MounRiver Studio
MounRiver Studio

По RM пытаемся зажечь светодиод.

CH32V203C8T6 на плате BluePill
CH32V203C8T6 на плате BluePill

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

Что я заметил:

ch32v20x.h
ch32v20x.h

Файл ch32v20x.h из коробки очень скудный. На столько скудный, что мне пришлось добавить в него около 1000 строк кода, чтоб более менее удобно работать с МК на регистрах.

Стандартный ch32v20x.h файл 4819 строк кода.

Мой исправленный ch32v20x.h файл 5759 строк кода.

Что я добавил:

Макросы SET_BIT, CLEAR_BIT_ MODIFY_REG и прочее

ch32v20x.h Добавленные макросы
ch32v20x.h Добавленные макросы

Но самое важное - это я добавил позиции битов, чтоб было удобно работать.

ch32v20x.h Добавленные макросы
ch32v20x.h Добавленные макросы

Пока работал по Reference Manual - нашел море опечаток, ошибок, копипаста без осознания, нужно ли это здесь... Ощущение, что они его вообще не перечитывали, а сразу отправили на сайт.

Надеюсь, что когда-нибудь исправят это все, а то пока документы выглядят очень сырыми. Вот некоторые косяки:

DMA. Откуда они взяли флаги с 9 по 11...там вроде всего 8 каналов.
DMA. Откуда они взяли флаги с 9 по 11...там вроде всего 8 каналов.
Статусы во FLASH вообще не бьются
Статусы во FLASH вообще не бьются
Сверху SER
Сверху SER
Снизу PER
Снизу PER
Где Reserved в документах - в файле регистры указаны
Где Reserved в документах - в файле регистры указаны
В Stm32 этот бит даже не указывали в битовом поле.
В Stm32 этот бит даже не указывали в битовом поле.
Разные названия регистра
Разные названия регистра
И вот еще опечатка
И вот еще опечатка
Определитесь, 1/8/9/10 или все же 2/3/4/5)
Определитесь, 1/8/9/10 или все же 2/3/4/5)

С названиями регистров понятно - они не хотели копировать все с STM32, чтоб не огребать за лицензию, права в названиях и прочее, но почему Control Register они сокращают, как CTLR? Это же нелогично...

Почему в STM32 статусный регистр SR, а здесь он где-то STAR, где-то STATR. Не смогли договориться между собой что-ли? :D Да, на работу это не влияет, но почему не сделать свой стандарт в названиях...

Вообщем от документации пока негативные ощущения.

Шагаем дальше.

Что там с обещанными 144 МГц:

CH32V203 clock tree structure
CH32V203 clock tree structure

Ну да...144МГц можно выставить на HCLK. Хм...Круто! Мощно!

Давайте заглянем в RM во FLASH:

FLASH Control Register
FLASH Control Register

Советуют, чтоб частота МК при работе с FLASH не превышала 120 МГц, т.к. для доступа к FLASH требуется частота не выше 60 МГц. Делитель есть максимум на 2.

А что с I2C, который от APB1 тактируется?

I2C Control Register 2
I2C Control Register 2

Частоту тактирования выше 36 МГц ставить нельзя. Прям как на F103 серии...

А что с ADC?

RM Часть 12 АЦП
RM Часть 12 АЦП

И тут 14 МГц, как на STM32F103.

Ох....это что же получается...Они разогнали МК до 144МГц, но периферия не может тактироваться от этих 144МГц? С SPI-то хоть надеюсь не 18 МГц максимум?

CH32V203C8T6 SPI interface characteristics
CH32V203C8T6 SPI interface characteristics

Ну хоть по SPI буст в 2 раза...

Подведу свой итог по красивой частоте в 144МГц - хочешь пользоваться всей периферией - используй стандартные 72МГц и не выпендривайся.

Конфиг получился такой:

Универсальный конфиг RCC от 8МГц, чтоб работать со всей периферией.
Универсальный конфиг RCC от 8МГц, чтоб работать со всей периферией.

Само программирование МК вопросов особо не вызвало. Если умеешь работать с STM32 на CMSIS, то и с этими МК будешь спокойно работать на...эм...RVMSIS(так же? на регистрах вообщем :))

За несколько дней написал функции для работы с этим МК на регистрах:

Тестовый прогон работы периферии на регистрах
Тестовый прогон работы периферии на регистрах

Вроде все работает...АЦП правда почему-то при заземлении в 0 не уходил(скакал на 3-4). При подключении к питанию выдавал 4095. Вроде калибровал...Не знаю почему так.

DMA, ADC, EXTI, I2C, SPI, FLASH, таймеры - все работает.

USB и CAN не тестил, т.к. не работал с ними на регистрах еще.

Небольшие заметки по работе:

Ссылка: https://github.com/Solderingironspb/CH32V203C8T6_RVMSIS_notes/blob/main/%D0%97%D0%B0%D0%BC%D0%B5%D1%82%D0%BA%D0%B8.txt

Итог:

CH32V203C8T6 - SPI 36 MHz работает)
CH32V203C8T6 - SPI 36 MHz работает)

МК привлекают своей стоимостью. 70р я даже за STM32F103 не помню(на момент знакомства с ними стоили 116р за 1 шт.). Из приятного еще хочу отметить замечательную упаковку с алиэкспресс. Ну и также из приятного то, что переход с STM32 на CH32V не вызывает проблем, т.к. они все оттуда переняли(наверное специально, чтоб рынок быстрее занять собой).

Но пока, лично для меня, все перекрывает сырая документация и наличие в запасах STM32F103, GD32F103, CH32F103, которые прогаются одинаково из под VisualGDB.

А еще вроде говорят, что на RISC-V нельзя при дебаге отсматривать глобальные переменные без остановки ядра. т.е. нажал на паузу - посмотрел, что у тебя там происходит. Не знаю, правда ли. Это мой первый опыт.

Могу только пожелать WCH дальнейшего процветания и доделки своей продукции до удобоваримого вида.

За неделю знакомства и тестов собрался проект с доделками системных файлов и функции для работы на регистрах. Приложу. В комментах может немного не то будет прописано, т.к. шла постоянная оптимизация RCC, тут же вознакали некоторые нюансы и прочее. Ссылочку оставлю ниже:

Проект на GitHub: https://github.com/Solderingironspb/CH32V203C8T6_RVMSIS_notes

Дополнения к статье:

Долго не мог разобраться с заданием приоритета прерывания, коллективным путем выяснили, что снова косяки в коде у производителя. Поправили.

Было:

core_riscv.h Данная функция не работает
core_riscv.h Данная функция не работает

Стало:

core_riscv.h Задать приоритет прерывания/получить сведения о приоритете прерывания
core_riscv.h Задать приоритет прерывания/получить сведения о приоритете прерывания

Если вообще говорить о прерываниях в Risc-V - это не NVIC, это PFIC. И если Вы будете читать документацию, то должны читать именно про PFIC. NVIC там тоже оставлена, но она даже сверху подписана, что эти таблицы и прочее относятся к CH32F.

В коде же, когда работаем с прерываниями - использовать можем обращение NVIC, оно все равно производителем задефайнено, так что работать будем все равно с PFIC:

core_riscv.h
core_riscv.h

Соответственно держим в голове, что у нас RISC-V, PFIC и количество приоритетов прерываний будет не от 0 до 15, как на STM32F103C8T6, а от 0 до 7:

CH32FV2x_V3x Reference Manual
CH32FV2x_V3x Reference Manual

Перед работой с этими чудо МК, рекомендую заглянуть в мои заметки по ним, они дополняются со временем: https://github.com/Solderingironspb/CH32V203C8T6_RVMSIS_notes/blob/main/%D0%97%D0%B0%D0%BC%D0%B5%D1%82%D0%BA%D0%B8.txt