Найти в Дзене

CH32V*. Первое свидание. Часть 2

Оглавление

Пишу свою первую тестовую прошивку и проверяем ее на CH32V003F4P6 и CH32V003J4M6.

Начнем с того, что нам нужно в чем-то писать, чем-то компилировать и отлаживать, а также загружать в чип.

Откуда он взялся можно вспомнить из прошлой статьи.

Все материалы для работы с чипами, разумеется, находятся на официальном сайте https://www.wch.cn/

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

Плата с CH32V003F4P6
Плата с CH32V003F4P6

С чего начать? Что нужно скачать?

Достаточно MounRiver Studio - это IDE, как STM32CubeIDE, тоже на Eclipse.

Нам еще понадобится WCH-LinkUtility - утилита для работы с чипами, как и STM32 ST-LINK Utility, но она уже идет в комплекте с MounRiver Studio.

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

Если же драйвера не установились, то можно попробовать вручную. Они должны быть в папках LinkDrv и Drv_Link в C:\MounRiver\MounRiver_Studio.

Слышал, что можно собирать и отлаживать прошивки и через VS с PlatformIO, но путь не очевидный.

А, раз есть специализированная, заточенная под эти чипы среда программирования в лице MounRiver Studio, то решил с нее и начать.

Кстати, MounRiver Studio в Windows 10 на 2K экране с масштабированием 175% выглядит немного странно. Панель инструментов имеет очень мелкие значки. Из настроек функции масштабирования/изменения DPI не увидел.

Я подправил масштаб редактированием файла C:\MounRiver\MounRiver_Studio\MounRiver Studio.ini

-Dswt.enable.autoScale=true
-Dswt.autoScale=200
-Dswt.autoScale.method=nearest

На втором скриншоте результат.

До полного нужно еще скачать CH32V003EVT.ZIP.

В нем будут: схема платы и ее описание, руководство по работе с платой и IDE, примеры проектов по взаимодействию с периферией МК.

Лирическое отступление

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

В общем все, чтобы сесть и сделать свой первый проект за один вечер.

И это обалденно! И я считаю, что так и должно быть!

Нет. Ну серьезно. Мне часто попадались поделки (именно так, с одной "д"), которые, в лучшем случае, давали пару примеров по работе с кодом на Си, приближенном по виду к ассемблеру, который облепили макросами.

Или вовсе прилагали документацию, в которой явно просматривается оригинал. И не потому, что похоже, а потому что поверх оригинальной pdf-ки вставляли отличия и примечания другим шрифтом/картинками текст (относящийся к чипу-клону).

Про цены на программаторы к ним вообще молчу. Да, они как правило (только!) промышленные, с фишками offline-программирования, инкрементирования (например, серийного номера) и т.п., но покупать такой ради теста или уж тем более просто для целей хобби - неоправданно и глупо.

И вроде бы у тех чипов было описание. И штуки то рабочие. Подделкой уже не назовешь, но и выше поделки не тянут.

А тут я пока в восторге)

Хотя, ребят из WCH, могли бы и не жмотить пару 5.1 кОм резисторов, раз уж поставили type-c на питание плат!

В числе прочего ко мне приехали адресные светодиоды WS2812B (по крайней мере так назывались в лоте).

Чтобы не утонуть в разборе периферии решил сделать bit-banging управление светодиодом. Или по-простому "ногодрыгом".

Берем старую добрую asm("nop"), инициализируем пин и дергаем его через регистры.

Как пример. Все знакомое)
Как пример. Все знакомое)

Буквально полчаса и светодиод ожил.

-4

Из интересного хочу отметить, что для программирования и отладки CH32V003 достаточно одного пина PD1 (SWDIO).

Но это CH32V003F4P6 с многоног (TSSOP20) и плата с кварцем. Нужно проверить еще на восьминогом CH32V003J4M6 (SOP8) из первой части.

В CH32V003J4M6 нет пина, который использовал с CH32V003F4P6. Думаю дай-ка попробую заменить номер пина и порт. На удачу.

Попробовал залить подправленный код в CH32V003J4M6 и... ничего не работает. Не светится светодиод!

И прошиваться перестал. Пишет ошибку "Failed to configure mcu. Please refer to "WCH-LinkUserManual.pdf" for more help.".

Как же так?!

Заглядываю в даташит. И, привет флешбеки с attiny13.

Ножка номер 8 используется и для SWIO и для UART TX. В коде был активирован UART.

Подключил к программатору восьмую ножку и да, там UART, МК рапортует о себе.

Про флешбеки.

Что приходилось делать, когда, например, на attiny13 нужно было использовать ножку с функцией по умолчанию "reset"?

Давайте вспомним вместе.

В начале, как обычно, прошивали прошивку. После устанавливали фьюз RSTDISBL, который отключал "reset" позволяя использовать ножку как обычный I/O-пин. И все. Порт работал, как и остальные I/O-пины.

Приключения начинались, когда требовалось обновить прошивку:

  • выпаять МК
  • купить/собрать/достать высоковольтный fuse doctor
  • сбросить фьюз-биты
  • отключить от fuse doctor и подключить к программатору
  • прошить новую версию прошивки и установить RSTDISBL
  • запаять МК обратно.

А что у нас сейчас?

Решил по аналогии с STM32 ST-LINK Utility посмотреть доступные пункты в WCH-LinkUtility.

Увидел пару интересных пунктов:

  • Clear All Code Flash-Ву Pin NRST Alt + N
  • Clear All Code Flash-Ву Power off Alt + P

Пробую "Alt + P" и, о чудо, "Begin to clear all code flash... >> Succeed!".

Чип чист и готов к прошивке!

На контрасте это очень приятная магия.

Особенно, если вспомнить, что в программаторе кроме SWD и управляемого питания 3.3 и 5В есть еще и интегрированный USB-UART.

С STM32 у меня обычно была связка из ST-Link и USB-UART. А тут один программатор заменяет как минимум пару отдельных устройств!

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

Исправил.

Загрузил.

Светодиод светит и переливается цветами.

Успех!

-5

Не хватает еще одного штриха. Как вишенки на торте.

У нас ведь пинов мало. 2 - питание, осталось 6. Из них UART занимает аж 2 пина. Если брать только TX, то выйдет 1. А можно еще меньше? Можно!

Для этого тоже сделали удобный хак. Хотя раз так интегрирован, то фича)

Через пин программирования и отладки (PD1) можно выводить сообщения через printf().

Для этого нужно убрать код UART'а и активировать SDI функционал в проекте вызвав всего одну функцию SDI_Printf_Enable() из debug.h.

После нужно будет в WCH-LinkUtility выполнить Target->Enable SDI Printf.

После включения SDI в терминал COM-порта (тот, что программатора) полетят сообщения как будто мы подключили пин RX программатора к TX МК.

Магия)

Выводы

В общем-то я в восторге!

Еще не пробовал работать с периферией, гонять таймеры в ШИМ, ловить шумы на АЦП и прочее.

Но пока работа вызывает только положительные эмоции.

Следующий на очереди CH32V203C8T6.

Ждите следующей части с его участием)