Як додати підтримку 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 маємо результат:











Коментарі
Дописати коментар