Рано или поздно запасы моих любимых ATtiny13 должны были подойти к концу. Случилось это примерно в начале октября. В то же время, идеи для будущих проектов заканчиваться никак не хотели. Более того, эти идеи возникали в моей голове в самое неподходящее время, лишая сна, аппетита и душевного равновесия. В общем, полез я на Али за очередной партией 8-ногих букашек...
Сказать, что я испытал шок - ничего не сказать! В голове просто не укладывалась бизнес-модель, при которой максимально урезанный чип (я про ATtiny13) стоит в два раза дороже, чем, на порядок более продвинутые STM32! Единственный аргумент в пользу слабого железа и малого количества ножек, оправдывающий покупку ATtiny была цена, а теперь и эта последняя точка опоры была выбита из под ног нынешним рыночным раскладом.
Скрепя сердце я решил, что с Atmel-овской продукцией пора расставаться насовсем. Однако, хорошо известно, что как только закрывается одна дверь, тут же открывается другая. И такая дверь (а пожалуй даже не дверь, а скорее ворота) тут же нашлась в форме продукции китайского производителя WCH.
Для меня всегда особый интерес представляли младшие представители микроконтроллеров. Ограниченность ресурсов хорошо подстегивает творческое начало. Но то, что я нашел внизу линейки микроконтроллеров CH вызвало просто шквал новых идей. Мимо такого я точно пройти спокойно не смог! Я понял - то, что я давно искал, лежит тихонечко здесь и ждет своего (ну, то есть, моего) часа.
Микроконтроллеры семейства CH32V003
Очень недорогие микроконтроллеры ( я покупал менее 20 рублей за штуку) семейства CH32V003 отличаются друг от друга только количеством портов ввода-вывода. Кристалл у них у всех один и тот же, а вот количество ножек различное. Причем в моделях с малым количеством ножек выводы просто объединяются внутри микросхемы. Фактически пользователь сам выбирает, какую аппаратную функцию будет выполнять та или иная ножка. Решение очень простое, хотя и чреватое проблемами в случае неаккуратного использования. Например, можно назначить два порта на выход в пределах одной ножки, а затем на один вывести 0, а на другой 1. Интересно должно получиться! Но, за эту цену производителю можно простить чуть менее чем все! Тем более что...
На борту микроконтроллеров находится 32-битное ядро с тактовой частотой до 48 Мегагерц, построенное на архитектуре RISC-V, имеется 16 Килобайт памяти программ и 2 Килобайта оперативной памяти. Все остальные примочки в виде АЦП, продвинутых таймеров, разных интерфейсов тоже есть. Но главное - память. Именно ее нам не хватало в ATiny13. А здесь сразу 16 Килобайт для программ! Правда стоит учитывать, что каждая команда здесь также занимает не 1 байт а 4! Архитектура-то 32-битная. Если перевести в слова, то памяти становится уже 4 Килослова. Что, кстати, все равно в 4 раза больше чем в ATtiny. На самом деле, так сравнивать тоже некорректно...
Зато большая разрядность ядра должна пригодиться при вычислениях с плавающей точкой. Например, в задачах навигации или цифровой обработки сигналов, там, где нужна высокая точность. Для простых задач ее конечно будет избыточно, но, в любом случае, хорошо, что задумываться о переполнениях регистров нам не придется.
Свой взгляд я остановил на младшем представителе семейства - микроконтроллере CH32V003J4M6, который упакован в тот-же 8-выводный корпус SOP8, что и ATtiny. Функциональное назначение выводов микросхемы, взятое из datasheet-а производителя выглядит так:
Обращает на себя внимание нехарактерное размещение выводов питания чипа. Обычно 4-й вывод это земля, а 8-й - питание. Здесь все принципиально иначе. Земля - это вывод 2 (VSS), а питание - вывод 4 (VDD). Питание, кстати, может быть от 3 до 5 вольт. Кроме того, обратите внимание, что напротив некоторых выводов подписаны не одна а несколько строчек. По сути это значит, что на один контакт корпуса выведено несколько ножек кристалла. Например на вывод 1 вывели две ноги: PD6 и PA1, а на вывод 8 - аж три: PD4, PD5, PD1. Вот тут аккуратнее! Целиком регистры писать не пробуйте. Пишите только нужные биты. Кстати, при запуске все выводы переходят в состояние входов во избежание коротких замыканий.
Для того, чтобы начать работать с микроконтроллерами, помимо них самих нужен еще программатор WCH-LinkE. Вот такая USB-свистуька. Пока самодельных конструкций на горизонте не видно, его придется приобрести. Стоит около 400 рублей. Дороже десятка микроконтроллеров!
А вот отладочную плату покупать не обязательно. Я купил, скорее по инерции, но смысла в ней особого не увидел.
Изучать микроконтроллеры можно прямо на них самих (ведь их-то вы точно приобретать намерены), соорудив простую платку самостоятельно. Я покажу как это сделать. К тому же, Вам все равно придется делать какой-то адаптер для программирования чипов. Так можно убить сразу двух зайцев. Кстати, отладочных плат на основе CH32V003J4M6 я вообще не нашел. Главным образом, на 20-пиновом CH32V003F4P6. Напомню, кристалл точно такой же, а вот количество и расположение выводов отличаются (их у F4P6 - 20 штук). На фото отладочной платы именно этот чип.
Устанавливаем и настраиваем софт
ATtiny13 я программировал и прошивал в среде ArduinoIDE. Связано это с тем, что под Arduino есть отличное ядро MicroCore, которое позволяло до предела минимизировать объем кода, сберегая и без того малые ресурсы микроконтроллера. Теперь, посмотрим, что у нас с программным обеспечением для CH32V003. А тут есть из чего повыбирать!
Во-первых, сам производитель чипов - компания WCH предлагает программный продукт MounRiver Studio. Это интегрированная среда разработки, содержащая все необходимые библиотеки и примеры, необходимые для быстрого старта разработки. Казалось бы, что еще нужно? Тем не менее, не все так просто с этим софтом. Разработчики хоть и постарались сделать программную обертку над всеми функциями микроконтроллера, но вышло у них это не слишком хорошо. Код получился громоздким и не слишком удобочитаемым. Тут по неволе задумаешься - изучать регистры микроконтроллера, или убить время на явно сыроватый набор библиотек. Я попробовал что-то сотворить, но после того, как мигание светодиодом вылилось в 4 килобайта кода, эксперименты я решил прекратить. Наверняка, что-то оптимизировать можно, но тратить на это время мне вообще не хотелось бы.
Во-вторых, Arduino! Ага! Зная тягу народных масс к этой нехитрой софтине, ушлые программеры постарались, и на свет божий появилась библиотека CH32 MCU EVT Boards, которая позволяет всем желающим продолжить написание скетчей и для китайских чипов. Все работает, но недостаток будет тот же - объем скомпилированного кода. Полюбуйтесь - пустой скетч более 4-х килобайт.
Получив подобные результаты я было сначала приуныл, но потом стал искать минималистичные темплейты для CH32 целенаправленно и не только в русскоязычном интернет-пространстве. И таки нашел я то, что искал! И нашел в GitHub-репозитории моего старого заочного знакомого, который полностью разделяет мою тягу к минималистичным микроконтроллерам - wagiminator. Правда это потребует и немного другой среды разработки, но в данном случае это, скорее, можно отнести к плюсам решения.
Итак, в-третьих, расширение PlatformIO для Visual Studio Code (VSCore). Вообще, все серьезные программисты уже давно срулили с ArduinoIDE на PlatformIO, которая является гораздо более мощной и удобной средой разработки, хотя даже обилие элементов интерфейса с непривычки может шокировать. Так вот, если вы всерьез собрались программировать CH32, то это выбор для вас. Привыкните и на Arduino смотреть больше не сможете!
Установка может показаться несколько сложной, но укладывается она в четкую последовательность этапов (подробно можно посмотреть на странице wagiminator-а). На этой же странице есть ссылка на подробное описание процесса.
После установки PlatformIO, а также всех необходимых библиотек, драйверов и темплейта wagiminator-а у нас появляется возможность писать очень минималистичный код, используя минимальные надстройки над аппаратными ресурсами контроллера. В библиотеке wagiminator-а есть как все datasheet-ы для CH32, так и примеры кода для работы со всеми компонентами микроконтроллера. Спасибо ему за это огромное!
Результат компиляции программы мигания светодиодом - 404 байта!
В 10 раз меньше Arduino! По сути это всего лишь сто 32-разрядных слов. Очень неплохо!
Отладочная плата для CH32V003J4M6
Для программирования и прототипирования CH32V003J4M6 я решил изготовить свою отладочную плату. Тем более, что десяток микроконтроллеров уже просто просили - давай с чего-то начнем наше знакомство. Особенных требований к плате я предъявлять не буду. Плата должна позволять заливать прошивку в контроллер и наблюдать за сигналами на его ножках. Да хоть бы и светодиодом помигать! Тоже нужно!
Поскольку микроконтроллеры поставляются в корпусе SOP8, для удобства работы я смонтировал один из них на DIP-переходник.
Этот чип буду использовать для экспериментов. Для прошивки контроллеров в различные устройства я буду использовать такой же переходник. Но напаивать контроллер на него не буду. Только контакты. Микроконтроллер можно просто прикладывать к площадкам печатной платы и прижимать пальцем на время прошивки. А потом уже впаивать на свое место в контролируемое устройство. Дешево и сердито!
Я использовал стандартные гребенки контактов с шагом 2,54 мм, но можно применить и остатки выводов от радиоэлементов. Только потолще, чтобы не гнулись!
Все, что нам понадобится далее, это кусок макетки, панелька DIP-8 и несколько контактных групп. Я импровизировал по ходу дела, поэтому мог сразу не все учесть.
Сделав фото я сообразил, что неплохо бы вывести отдельные контакты для подключения к программатору. Всего нужно три линии: земля, питание и сигнальная линия. Этого достаточно для программирования устройства. В соответствии со схемой подключения контактов в начале статьи: земля - контакт 2, питание - контакт 4, сигнал - контакт 8 (PD1/SWIO).
С обратной стороны соединил их проводами. В качестве проводов использовал обмоточный провод толщиной 0,4 мм. Кончики зачищал скальпелем.
Затем рядом установил двойную гребенку контактов, на которую будут дублироваться все выводы микроконтроллера. К ним можно и светодиоды подключать (через токоограничивающие резисторы, разумеется) и сигналы осциллографом смотреть.
С обратной стороны соединил их с контактами колодки.
Вот собственно и все! Ну еще, чтобы помигать светодиодом я подготовил сам светодиод, последовательно с которым соединил балластный резистор на 1 кОм (можно и меньше) и снабдил его парой dupont-овских гнезд, откусанных от стандартных проводков.
Собрав все вместе, получил вот такую конструкцию.
Светодиод подключен между контактом питания (4-й вывод) и контактом PC1 (5-й вывод). Именно последний будет управляющим.
Подключение к программатору выглядит вот так.
Ну а дальше подключаем программатор к порту USB компьютера, настраиваем порт (номер порта на который "сел" программатор можно посмотреть в диспетчере устройств), компилируем и загружаем код. Он, кстати выше полностью приведен на экране компиляции.
Ура! Светодиод мигает!
Вместо заключения
Появление недорогих китайских микроконтроллеров серии CH32 лично для меня стало открытием! Это совершенно иной уровень технологий при какой-то необыкновенной цене! Да, потребуются усилия, чтобы разобраться с новым чипом, но что-то мне подсказывает, что не будет там существенных отличий от технологий, используемых в тех же чипах STM. Ведь всем известно, что китайцы большие специалисты в области клонирования! Ну да нам это только на пользу!
Впереди много новых открытий и проектов!
Спасибо, что читаете-смотрите Terrabyte! Подписывайтесь, если вам интересна радиолюбительская тематика, микроконтроллеры, мини-ПК, необычные компьютерные решения и инновационные разработки! Спасибо всем, кто нас поддерживает своими комментариями и лайками!
Наша группа ВК: https://vk.com/terrabyte
Наш канал на VK-Video: https://vk.com/video/@terrabyte/all
Наши разработки: