В качестве весьма дешевой альтернативы привычной 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 / OSCO (внешний резонатор) | 
| PD3 | PA1 / OSCI (внешний резонатор) | 
| 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 микроконтроллеры.
Существует четыре вида программаторов WCH-Link:
- WCH-Link - первая версия, для переключения режима требуется перепрошивка;
- WCH-LinkE - рекомендуемая версия;
- WCH-LinkW - беспроводная версия;
- WCH-DAPLink - для 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:

В строке MCU UID отображается уникальный 64-битный номер подключенного к программатору микроконтроллера, а под ней в строке Flash Size - размер флэш-памяти МК.
Открываем полученный при компиляции файл с помощью команды File ⇒ Open Firmware (имя файла появится в поле Target File).
Прошивка выполняется командой Target ⇒ Program:

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