Введение
Друзья, всем привет!
Статью я пишу 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?
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МГц!!! Ого! Еще и пониженное энергопотребление! Круто!
А что по документам и ПО?
На главной странице нам предлагают скачать Datasheet, ReferenceManual и IDE на основе Eclipse под названием MounRiver Studio(MRS)
И первое, с чем я столкнулся, открыв Datasheet - Он на серию V3, а не V2, что ввело меня в ступор.
Долго тупя и непонимая, в чем дело, тыкался на сайте и в других местах в поисках правильного Datasheet. Нашел: http://www.wch-ic.com/downloads/CH32V203DS0_PDF.html
Ищем распиновку камешка:
Распиновка, как у STM32F103C8T6. Можем использовать любую плату от BluePill и начинать тестить. Я для этого использовал свои отладочные платы.
Вам еще понадобится файл, наподобие Programming Manual от ST.
Здесь он называется QingKeV4_Processor_Manual: http://www.wch-ic.com/downloads/QingKeV4_Processor_Manual_PDF.html
Программирование и отладка
Для программирования этих МК 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
Установил драйвера. Запускаю. Программатор видится:
Но при подключении к МК возникает ошибка:
После часа разбирательств понял, что схема, которую я раньше использовал для STM32F - не работает для CH32V.
Дело было в подтягивающих резисторах на DIO И CLK, которые я всегда использовал на Stm32(всегда работало). Я их просто выпаял и МК начал обнаруживаться и прошиваться. Для теста еще распаял МК на китайском BluePill, там этих резисторов не было.
Так же замечу, что положения Boot 0 и Boot 1 вообще никак не влияют на подключение МК к программатору.
До сих пор я не понимаю только, почему 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.
По RM пытаемся зажечь светодиод.
Зажечь светодиод оказалось очень просто, ведь опыт работы на регистрах с STM32 уже имеется.
Что я заметил:
Файл ch32v20x.h из коробки очень скудный. На столько скудный, что мне пришлось добавить в него около 1000 строк кода, чтоб более менее удобно работать с МК на регистрах.
Стандартный ch32v20x.h файл 4819 строк кода.
Мой исправленный ch32v20x.h файл 5759 строк кода.
Что я добавил:
Макросы SET_BIT, CLEAR_BIT_ MODIFY_REG и прочее
Но самое важное - это я добавил позиции битов, чтоб было удобно работать.
Пока работал по Reference Manual - нашел море опечаток, ошибок, копипаста без осознания, нужно ли это здесь... Ощущение, что они его вообще не перечитывали, а сразу отправили на сайт.
Надеюсь, что когда-нибудь исправят это все, а то пока документы выглядят очень сырыми. Вот некоторые косяки:
С названиями регистров понятно - они не хотели копировать все с STM32, чтоб не огребать за лицензию, права в названиях и прочее, но почему Control Register они сокращают, как CTLR? Это же нелогично...
Почему в STM32 статусный регистр SR, а здесь он где-то STAR, где-то STATR. Не смогли договориться между собой что-ли? :D Да, на работу это не влияет, но почему не сделать свой стандарт в названиях...
Вообщем от документации пока негативные ощущения.
Шагаем дальше.
Что там с обещанными 144 МГц:
Ну да...144МГц можно выставить на HCLK. Хм...Круто! Мощно!
Давайте заглянем в RM во FLASH:
Советуют, чтоб частота МК при работе с FLASH не превышала 120 МГц, т.к. для доступа к FLASH требуется частота не выше 60 МГц. Делитель есть максимум на 2.
А что с I2C, который от APB1 тактируется?
Частоту тактирования выше 36 МГц ставить нельзя. Прям как на F103 серии...
А что с ADC?
И тут 14 МГц, как на STM32F103.
Ох....это что же получается...Они разогнали МК до 144МГц, но периферия не может тактироваться от этих 144МГц? С SPI-то хоть надеюсь не 18 МГц максимум?
Ну хоть по SPI буст в 2 раза...
Подведу свой итог по красивой частоте в 144МГц - хочешь пользоваться всей периферией - используй стандартные 72МГц и не выпендривайся.
Конфиг получился такой:
Само программирование МК вопросов особо не вызвало. Если умеешь работать с STM32 на CMSIS, то и с этими МК будешь спокойно работать на...эм...RVMSIS(так же? на регистрах вообщем :))
За несколько дней написал функции для работы с этим МК на регистрах:
Вроде все работает...АЦП правда почему-то при заземлении в 0 не уходил(скакал на 3-4). При подключении к питанию выдавал 4095. Вроде калибровал...Не знаю почему так.
DMA, ADC, EXTI, I2C, SPI, FLASH, таймеры - все работает.
USB и CAN не тестил, т.к. не работал с ними на регистрах еще.
Небольшие заметки по работе:
Итог:
МК привлекают своей стоимостью. 70р я даже за STM32F103 не помню(на момент знакомства с ними стоили 116р за 1 шт.). Из приятного еще хочу отметить замечательную упаковку с алиэкспресс. Ну и также из приятного то, что переход с STM32 на CH32V не вызывает проблем, т.к. они все оттуда переняли(наверное специально, чтоб рынок быстрее занять собой).
Но пока, лично для меня, все перекрывает сырая документация и наличие в запасах STM32F103, GD32F103, CH32F103, которые прогаются одинаково из под VisualGDB.
А еще вроде говорят, что на RISC-V нельзя при дебаге отсматривать глобальные переменные без остановки ядра. т.е. нажал на паузу - посмотрел, что у тебя там происходит. Не знаю, правда ли. Это мой первый опыт.
Могу только пожелать WCH дальнейшего процветания и доделки своей продукции до удобоваримого вида.
За неделю знакомства и тестов собрался проект с доделками системных файлов и функции для работы на регистрах. Приложу. В комментах может немного не то будет прописано, т.к. шла постоянная оптимизация RCC, тут же вознакали некоторые нюансы и прочее. Ссылочку оставлю ниже:
Проект на GitHub: https://github.com/Solderingironspb/CH32V203C8T6_RVMSIS_notes
Дополнения к статье:
Долго не мог разобраться с заданием приоритета прерывания, коллективным путем выяснили, что снова косяки в коде у производителя. Поправили.
Было:
Стало:
Если вообще говорить о прерываниях в Risc-V - это не NVIC, это PFIC. И если Вы будете читать документацию, то должны читать именно про PFIC. NVIC там тоже оставлена, но она даже сверху подписана, что эти таблицы и прочее относятся к CH32F.
В коде же, когда работаем с прерываниями - использовать можем обращение NVIC, оно все равно производителем задефайнено, так что работать будем все равно с PFIC:
Соответственно держим в голове, что у нас RISC-V, PFIC и количество приоритетов прерываний будет не от 0 до 15, как на STM32F103C8T6, а от 0 до 7:
Перед работой с этими чудо МК, рекомендую заглянуть в мои заметки по ним, они дополняются со временем: https://github.com/Solderingironspb/CH32V203C8T6_RVMSIS_notes/blob/main/%D0%97%D0%B0%D0%BC%D0%B5%D1%82%D0%BA%D0%B8.txt