Як додати підтримку CH32V до Platform.IO

CH32V — це доволі дешеві мікроконтролери архітектури RISC-V від WinChipHead (Nanjing Qinheng Microelectronics). Також є CH32F — це мікроконтролери на архітектурі ARM.

Для початку нам знадобляться дві речі:

  • Відлагоджувальна плата (девборда) CR-CH32VXX з CH32V003 — це один із найдешевших мікроконтролерів.

  • Та WCH-LinkE — програматор для CH32V. У продажу є прості WCH-Link, але для серії CH32V00x вони не підходять, бо вона використовує однодротовий протокол програмування та відлагодження. А він підтримується лише в дорожчому WchLinkE.

До речі, є проєкти, які з RP2040 роблять подібний програматор, але офіційні утиліти (MounRiver Studio) не підтримують нічого, окрім WCH-Link. Але я і не використовую офіційну IDE. Тому, напевно, найближчим часом спробую це зробити та описати методику.

Чому я використовую PlatformIO, а не MounRiver Studio?

З одного боку, MounRiver Studio є для Linux, який є моєю основною ОС для роботи. Але з іншого — коли я спробував її встановити і вона почала вимагати пароль від root-акаунта для якихось невідомих дій, моя параноя мене перемогла. Тож я вирішив, що краще піду розбиратися, як прикрутити підтримку до PlatformIO. Звісно, якщо дуже треба, то можна якось запустити її або в Docker, або під ізольованим користувачем, чи взагалі на окремій машині.

PlatformIO “з коробки” не підтримує платформу CH32V. Для того щоб хоч щось зробити з цими мікроконтролерами, треба встановити сторонній пакет підтримки, і зараз я розкажу, як це зробити.

Головне джерело підтримки — це ком’юніті-репозиторій: https://github.com/Community-PIO-CH32V/platform-ch32v

Відкриваємо головну сторінку PlatformIO та переходимо в розділ Platforms:


Тиснемо Advanced Instalation:


У діалозі вводимо https://github.com/Community-PIO-CH32V/platform-ch32v.git і запускаємо інсталяцію. Цей процес може зайняти декілька хвилин, поки PlatformIO завантажить потрібні пакети.


Наприкінці інсталяції ми побачимо ось такий діалог. Він доволі довгий і не влазить в екран, тому треба промотати його донизу та натиснути OK.

А тепер давайте перевіримо, як працює компіляція та прошивка. Створюємо новий проєкт:


Створення проєкту вперше може зайняти деякий час, бо PlatformIO знову завантажує необхідні компоненти.

У новому проєкті ми одразу отримаємо приклад, який мерехтить світлодіодом на піні PC1.

main.c

#include <ch32v00x.h>
#include <debug.h>

#define BLINKY_GPIO_PORT GPIOC
#define BLINKY_GPIO_PIN GPIO_Pin_1
#define BLINKY_CLOCK_ENABLE RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE)

void NMI_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void HardFault_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

int main(void) {
    SystemCoreClockUpdate();
    Delay_Init();

    GPIO_InitTypeDef GPIO_InitStructure = {0};
    BLINKY_CLOCK_ENABLE;
    GPIO_InitStructure.GPIO_Pin = BLINKY_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(BLINKY_GPIO_PORT, &GPIO_InitStructure);

    uint8_t ledState = 0;
    while (1) {
        GPIO_WriteBit(BLINKY_GPIO_PORT, BLINKY_GPIO_PIN, ledState);
        ledState ^= 1;
        Delay_Ms(1000);
    }
    return 0;
}

void NMI_Handler(void) {}
void HardFault_Handler(void)
{
    while (1)
    {
    }
}

Цей приклад, звісно, компілюється без проблем, тож час під’єднати програматор до девборди за такою схемою:

Для програмування CH32V00x потрібно лише 2 дроти живлення та 1 на SWDIO. Також треба власноруч кинути перемичку з PC1 на D1. Дизайнер цієї девборди зробив це навмисно, щоб не займати піни мікроконтролера, якщо вам не потрібен світлодіод.

Під’єднали і тиснемо на PlatformIO: Upload. І дивимось як блимає світлодіод:


Ще хочу показати, як вивести простий напис в UART та побачити його в PlatformIO. WCH-LinkE, окрім програмування, має піни для UART. Ви їх не бачите на фото, бо вони розташовані в другому ряду пінів з іншого боку:

Пін Призначення
RX UART RX (Прийом даних по UART)
TX UART TX (Передача даних по UART)
TDO JTAG Test Data Out (Вивід даних JTAG)
TDI JTAG Test Data In (Ввід даних JTAG)
RST Reset - скидання мікроконтролеру

JTAG тут передбачений для роботи з ARM-лінійкою продуктів WCH. І він нам зараз не потрібен. Натомість потрібно з’єднати лише UART TX мікроконтролера CH32V003 (PD5) з UART RX програматора.


Також треба трішки змінити код прошивки:

// Потрібно впевнитись, що підключено цей заголовний файл
#include <debug.h>

...

int main(void) {
    SystemCoreClockUpdate();
    Delay_Init();
    // Додаємо ініціалізацію дебаг-виводу в UART1 на швидкості 9600 бод
    USART_Printf_Init(9600);
    ...
    while (1) {
        GPIO_WriteBit(BLINKY_GPIO_PORT, BLINKY_GPIO_PIN, ledState);
        ledState ^= 1;
        // printf тепер виводить повідомлення прямо в UART1
        printf("LED is now %s\n", ledState ? "ON" : "OFF");
        Delay_Ms(500);
    }
    ...

Після прошивки в Serial Monitor маємо результат:





Коментарі

Популярні дописи з цього блогу

Огляд DC-DC Step-down Buck перетворювачів

ESP8266 модуль з OLED екраном (HW-364A)

Модуль PD тригер IP2721 на 15 та 20 вольт