В одном из телеграм каналов, поделились ссылкой на недорогие китайские микроконтроллеры. Причём настолько недорогие, что действительно дешевле только даром. Не верите? Смотрите.
CH32V003J4M6. Лот из 50 микроконтроллеров, стоит 496 рублей плюс доставка 445 рублей. Итого (496+445)/50 получается меньше 19 рублей. Кстати неделю назад в этом же магазине этот лот стоил 485 рублей и доставка была бесплатной. То есть мне они обошлись вообще меньше 10 рублей за штуку. Микроконтроллеры из линейки CH32V003xxxx отличаются друг от друга по сути только корпусами и количеством выведенных из этих корпусов ножек. Кристалл везде один и тот же. Причём похоже, что в корпусах с малым количеством ножек, некоторые выводы кристалла просто объединили и подключили к ножкам. В результате при неправильной настройке, есть вероятность физически сжечь контроллер. Но об этом подробнее в следующих статьях.
Итак что мы имеем в лице этого микроконтроллера.
- Удобный для пайки в домашних условиях корпус SOIC8. Не DIP8 конечно, но про них наверно уже пора забывать.
- 32 битное ядро.
- 16 килобайт флешь памяти для программы.
- 2 килобайта ОЗУ.
- 6 GPIO.
- Джентельменский набор периферии TIM/ADC /USART/I2C/SPI.
- DMA.
- Широкий диапазон питающих напряжений от 2.9 до 5.5 вольт.
- И много всякого другого.
Для работы с микроконтроллерами необходим программатор. Тут китайские товарищи тоже не подвели.
Программатор - отладчик WCH-LinkE стоит 380 рублей. Там же за 1000 рублей можно взять комплект из трёх штук. Ну мало ли один сломается, другой потеряется, останется третий :) И да, неделю назад доставка была бесплатная. Помимо собственно функции программатора в эту штуку встроен переходник USB-UART. Всё равно же при отладке устройств с микроконтроллерами для отладки мы зачастую используем UART. Теперь это будет делать удобнее. Сигналы rx tx выведены на отдельные контакты разъёма и им можно пользоваться совершенно независимо. За 380 рублей получаем два в одном.
И на сладкое,
за 580 рублей плюс доставка можно приобрести комплект CH32V003F4P6 QingKe RISC-V2A состоящий из макетной платы, программатора и коробочки с пятью запасными микроконтроллерами. Я взял именно этот комплект. И надо сказать, что мудрые китайцы не зря положили в комплект эту коробочку. Мне удалось достаточно быстро, чисто программными методами убить контроллер и я очень порадовался тому, что есть запасные. Но об этом тоже в следующих статьях. Ссылка на архив с полной документацией, схемой платы и примерами программ для этого комплекта есть на сайте продавца. На всякий случай продублирую здесь "Официальные программы CH32V003: CH32V003EVT.ZIP". Соединять программатор с платой, удобно вот такими перемычками. Их придётся приобретать отдельно. Странно конечно, что продавец не включил их в состав комплекта.
Все контакты на программаторе и на плате подписаны. Ниже текстовое описание, что с чем нужно соединять. Слева контакты программатора, справа платы.
- GND - GND Земля.
- 3V3 - VCC Питание.
- SWDIO/TMS - PD1 Это подключение собственно программатора. Да всего один провод.
- RX - PD5 Контакты конвертера USB - UART о котором написано выше.
- TX - PD6
На плате есть два мерзко ярких синих светодиода, их тоже можно сразу задействовать. Для этого соединяем перемычками следующие контакты уже на самой плате.
- PD0 - LED1
- PD4 - LED2
В итоге получится вот такая конструкция.
Подключаем это в USB порт компьютера и на программаторе должен загореться красный светодиод, также на макетной плате должен светиться красный индикатор питания. Если так и есть, значит по крайней мере контакты питания не перепутали и сразу ничего сгореть не должно.
Для полного счастья нужна среда разработки. И она есть. Абсолютно бесплатная "MounRiver Studio". Последняя на на момент написания статьи версия "MounRiver_Studio_Setup_V190.zip" просто установилась под win10, без всяких плясок с бубном. Без какого либо вмешательства с моей стороны, сами установились драйвера для программатора. Чудеса, как то просто и буднично всё.
Запускаем MounRiver Studio и создаём первый проект. Для этого выбираем в меню File->New->MounRiver Project
и щёлкаем мышкой. После этого появится окно с вот таким диалогом.
Тут нужно в левой колонке выбрать семейство СH32V003, а правой колонке указать конкретно контроллер распаянный на макетной плате CH32V003F4P6. Вверху в поле Project Name система предложит назвать проект по названию контроллера, а в поле Dуbugger будет предложен WCH-Link. Пока оставляем всё как есть и жмём кнопку Finsh. Собственно всё, проект создан. Причём не пустой, а с примером. Который выводит в UART тактовую частоту и уникальный идентификатор микроконтроллера. Сейчас разберёмся как это всё работает.
Возможно при первом запуске студии на переднем плане будет приветственное окно.
Просто закройте его щёлкнув на крестик в верхнем левом углу, под основным меню. И должны увидеть рабочее пространство со свежесозданным проектом.
В левом фрейме список файлов нашего проекта. Щёлкнем два раза по файлу CH32V003F4P6->User->мain.c и его содержимое появится в правом фрейме.
Это собственно и есть текст программы примера. Чуть ниже немного дополним его.
Теперь этот проект нужно скомпилировать. Для этого есть кнопка Rebuild.
При её нажатии происходит удаление всех предыдущих результатов работы и создание нового файла прошивки. Информация о результатах работы компилятора будет выведена в нижний фрейм. Если всё сделано правильно, то увидим следующее
Разберём что тут написано. Самое важное тут. Нижняя строка "22:30:25 Build Finished. 0 errors, 0 warnings. (took 2s.729ms)" говорит о том, что нет ошибок и предупреждений. Всё прошло успешно. В колонке bss число 288 говорит о том что израсходовано 288 байт оперативной памяти. А колонка dec сообщает, что занято 3848 байт памяти программ (флеша).
Теперь прошивку надо залить в микроконтроллер. Жмём кнопку Download.
Программатор моргнёт синим светодиодом и внизу появится следующее
Тут важно, что нижняя строчка зелёная. Прошивка залилась успешно.
Не знаю почему в качестве примера китайские программисты выбрали UART, а не мигание светодиода, это сильно нагляднее, но теперь нам придётся совершать дополнительные телодвижения, чтобы убедится, что микроконтроллер ожил и UART работает. Для этого можно воспользоваться любой программой терминалом, например putty. Но оказывается в MounRiver Studio встроен свой собственный терминал. Идём в меню Window->Show View->Other
И в выскочившем окне, выбираем Terminal.
После это в IDE справа появится третий фрейм с окном терминала.
Теперь этот терминал нужно настроить. Для этого сначала надо узнать на какой порт сел наш переходник USB - UART. Смотрим это в диспетчере устройств.
Щёлкаем на иконку "Open a terminal"
Появится окно с настройками.
Указываем тут свой номер порта, остальные настройки оставляем по умолчанию. Жмём OK и видим, что терминал открыл порт COM28 и готов к работе.
Теперь если перезапустить микроконтроллер, он выдаст в порт строчки с информацией о тактовой частоте и своём уникальном номере. Перезапустить контроллер можно нажав кнопку RST на макетной плате.
В результате в окне терминала увидим следующее.
Можно добавить что то от себя. Для этого ищем в файле main.с который у нас открыт в среднем фрейме строчки
printf("SystemClk:%d\r\n",SystemCoreClock);
printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
И добавляем после них строку со своим текстом.
printf( "Hello world.\r\n");
Компилируем, записываем в мк, жмём ресет. Видим в терминале уже и наш текст.
Можно постучать по клавишам и микроконтроллер вернёт в терминал эхо. Но по умолчанию прежде чем вернуть полученный символ, микроконтроллер инвертирует в полученном байте все биты. В результате если напечатать "1234567890" то получим вот такие кракозяблы.
Чтобы это исправить, ищем в тексте программы строчку USART_SendData(USART1, ~val); И заменяем её на USART_SendData(USART1, val); Опять компиляция, прошивка и стучим по клавиатуре. Теперь в терминале отображается именно то что введено.
На сегодня всё. В следующей статье расскажу как помигать светодиодами.
Продолжение "Разбираемся с GPIO. Часть 2.1".
Всё что описано в статье можно обсудить в комментариях и телеграм канале etrivia.
Посетите наш магазин https://etrivia.ru/
#CH32V003 #MounRiver #printf( "Hello world.\r\n");