В качестве весьма дешевой альтернативы привычной Arduino Nano я решил рассмотреть применение микроконтроллера CH32V003F4P6 от китайской компании Nanjing Qinheng Microelectronics Co., Ltd (www.wch-ic.com), владеющей брендом WinChipHead - WCH.

Я приобрел несколько микроконтроллерных плат:

Платы основаны на микроконтроллере CH32V003F4P6
(Datasheet ⇒ www.wch-ic.com/downloads/CH32V003DS0_PDF.html ,
Reference Manual ⇒ www.wch-ic.com/downloads/CH32V003RM_PDF.html )
со следующими характеристиками:
- 32-разрядное ядро QingKe V2A;
- 2 КБайта оперативной памяти;
- 16 КБайт флэш-памяти;
- 18 GPIO выводов;
- поддержка интерфейсов USART, I2C, SPI;
- 10-разрядный АЦП;
- напряжение питания 2,7 В - 5,5 В (3,3/5 В).
Ядро QingKe V2A - это начальная модель RISC-V ядер QingKe от компании Qinheng Microelectronics (см. https://www.wch-ic.com/products/QingKe.html), поддерживающая набор инструкций RV32EC.

Набор RV32E - это подмножество стандартного набора инструкций RV32I с уменьшенным вдвое (до 16) количеством регистров общего назначения.
К этой серии микропроцессоров относятся: CH32V003J4M6, CH32V003A4M6,CH32V003F4U6,CH32V003F4P6:
CH32V003J4M6 - нет SPI интерфейса; 6 GPIO выводов, 6 каналов АЦП;
CH32V003A4M6 - нет SPI интерфейса; 14 GPIO выводов, 6 каналов АЦП;
CH32V003F4U6 - есть SPI интерфейс; 18 GPIO выводов, 8 каналов АЦП; МК в корпусе QFN20;
CH32V003F4P6 - есть SPI интерфейс; 18 GPIO выводов, 8 каналов АЦП; МК в корпусе TSSOP20.
Назначение выводов на плате:
| Выводы (левая сторона) |
Выводы (правая сторона) |
|---|
| PC5 |
PC4 |
| PC6 |
PC3 |
| PC7 |
PC2 |
| PD0 |
PC1 |
| PD1 |
PC0 |
| PD2 |
PA2 |
| PD3 |
PA1 |
| PD4 |
RX |
| PD7 / NRST |
TX |
| V |
V |
| G |
G |
На этой плате зеленый светодиод подключен анодом через резистор 3,3 кОм к питанию (V), катодом - к земле (G), а красный - анодом через резистор 3,3 кОм к питанию (V), а катодом - к выводу PD1.
Кнопка подключена одним контактом к питанию (V), а другим - к выводу PC0 и через резистор 10 кОм к земле (G).
Также я приобрел программатор WCH-LinkE:

Программатор WCH-LinkE позволяет прошивать как RISC-V, так и ARM микроконтроллеры.
Написание исходного кода и компиляция
Для написания исходного кода используется среда разработки MounRiver Studio.
Создав проект с именем CH32V003F4P6, пишем в файле main.c исходный код, который будет каждые 0,5 секунды менять логический уровень вывода PD0:
#include "debug.h"
void GPIOConfig(void) //функция настройки GPIO выводов
{
GPIO_InitTypeDef GPIO_InitStructure = {0}; //переменная-структура для настройки GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //включение тактирования для порта D
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //задание номера вывода (0)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //настройка заданного вывода как выход (push-pull)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //задание максимальной частоты управления заданным выводом
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
SystemCoreClockUpdate(); //задание тактовой частоты микроконтроллера
Delay_Init(); //задержка (6 миллисекунд) для стабилизации тактовой частоты
GPIOConfig(); //настройка GPIO выводов
while(1) //бесконечный цикл
{
Delay_Ms(500); //задержка на 500 миллисекунд
GPIO_SetBits(GPIOD, GPIO_Pin_0); //установка высокого уровня на выводе PD0
Delay_Ms(500); //задержка на 500 миллисекунд
GPIO_ResetBits(GPIOD, GPIO_Pin_0); //установка низкого уровня на выводе PD0
}
}
Для компиляции и получения hex-файла выполняем команду Project ⇒ Build project.
После успешного завершения получаем готовый для прошивки файл CH32V003F4P6.hex в папке obj папки проекта.
Подключение к программатору
Для подключения программатора к плате микроконтроллера используются четыре провода:
| функция |
вывод программатора |
вывод микроконтроллера |
|---|
| питание |
3V3 / 5V |
V |
| земля |
GND |
G |
| данные |
SWDIO |
SWD |
| сброс |
RST |
PD7/NRST |
Сам программатор подключается к USB-порту компьютера.
Прошивка
Для прошивки используется утилита WCH-LinkUtility (версия 2.60).
Предварительно при необходимости следует переключить программатор в режим RISC-V, выбрав его в поле Active WCH-Link Mode и нажав кнопку Set:

Можно запросить сведения о подключенном к программатору микроконтроллере с помощью команды Target ⇒ Query Chip Info:

Открываем полученный при компиляции файл с помощью команды File ⇒ Open Firmware (имя файла появится в поле Target File).
Прошивка выполняется командой Target ⇒ Program:

После прошивки можно произвести сброс микроконтроллера командой Target ⇒ Reset.
Выполнение программы микроконтроллером
Подключив мультиметр в режиме измерения напряжения "20 V" "минусом" к G и "плюсом" к PD0, можно наблюдать скачки напряжения от нуля до напряжения питания, что свидетельствует о выполнении микроконтроллером записанной прошивки.
Продолжение следует