Пишу свою первую тестовую прошивку и проверяем ее на CH32V003F4P6 и CH32V003J4M6.
Начнем с того, что нам нужно в чем-то писать, чем-то компилировать и отлаживать, а также загружать в чип.
Откуда он взялся можно вспомнить из прошлой статьи.
Все материалы для работы с чипами, разумеется, находятся на официальном сайте https://www.wch.cn/
Я вижу явные аналогии (что, как по мне даже здорово, интуитивно понятно), потому буду в тексте их тоже проводить.
С чего начать? Что нужно скачать?
Достаточно 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 на питание плат!
Blink? Скучно. А если переливающийся?!
В числе прочего ко мне приехали адресные светодиоды WS2812B (по крайней мере так назывались в лоте).
Чтобы не утонуть в разборе периферии решил сделать bit-banging управление светодиодом. Или по-простому "ногодрыгом".
Берем старую добрую asm("nop"), инициализируем пин и дергаем его через регистры.
Буквально полчаса и светодиод ожил.
Из интересного хочу отметить, что для программирования и отладки 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. А тут один программатор заменяет как минимум пару отдельных устройств!
Вернулся к коду, обнаружил, что забыл поменять настройки тактирования.
Исправил.
Загрузил.
Светодиод светит и переливается цветами.
Успех!
Не хватает еще одного штриха. Как вишенки на торте.
У нас ведь пинов мало. 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.
Ждите следующей части с его участием)