100원짜리 MCU, CH32V003F4P6-EVT-R0 핸즈온

지난 포스팅에서 GigaDevice의 GD32E230 시리즈 MCU를 간단히 살펴본 후, 더 저렴한 MCU가 있지 않을까 하며 채찍피티에게 물어봤습니다. 그랬더니 CH32V003을 추천해, 이 MCU도 맛보기로 했습니다.
간단한 설명으로는 RISC-V를 사용하는 MCU라 하는데, 오픈소스 ISA이다 보니 더 저렴하게 나올 수 있지 않나 하는 생각입니다. 이미 RISC-V MCU는 ESPRESSIF의 C6와 H2, 그리고 Nordic의 nRF54L15의 FLPR코어에서 맛을 본 적이 있기는 합니다.
PC CPU가 AMD64에서 AArch64로 넘어가며 여러 호환성 문제가 생기곤 했는데, 아직까지 MCU에서는 Cortex-M 시리즈에서 RISC-V로 바뀌었을 때 차이점을 느껴보지는 못한 것 같습니다. SDK가 잘 슥삭해주는걸까요. 아무튼 CH32V003은 어떨지 기대가 됩니다.

LCSC에서 CH32V003을 검색한 뒤, 낮은 가격순으로 검색했더니 세상에 0.1달러.. 무려 100원짜리 MCU입니다. 꽤 오래전부터 10센트 MCU로 유명했다고 합니다.

알리에서 찾아보니 MCU 제조사인 WCH의 공식 스토어가 있었습니다.
"CH32V003 Kit"라는 이름으로 개발보드를 판매하고 있어서 이걸로 구매했습니다. 개발보드 이 외에도 디버거, 그리고 샘플 MCU가 들어있는데, 가격은 무려 5달러.. 어디 바닷가에서 모래 주서다가 손바닥에 비비면 MCU가 뚝딱 나오나 봅니다.

그나저나 MCU 제조사인 WCH의 홈페이지로 가보니 익숙한 녀석이 보입니다. 수많은 아두이노 입문자를 울린 악랄한 녀석.. CH340을 만든 회사였습니다.
CH32V003 시리즈 #
The CH32V003 series is an industrial-grade general-purpose microcontroller based on the QingKe RISC-V2A core, supporting a 48MHz system clock frequency. It features wide voltage operation, 1-wire debugging, low-power consumption, and ultra-compact packaging. It provides commonly used peripheral functions, including one DMA controller, 1×10-bit ADC, 1 OPA, multiple timer units, and standard communication interfaces such as USART, I2C, and SPI. The product operates at a rated voltage of 3.3V or 5V within an industrial-grade temperature range of -40°C to 85°C.
WCH - 32-bit General-purpose RISC-V MCU CH32V003 [링크]
WCH에서 설계한 QingKe RISC-V2A 프로세서를 사용했다고 합니다. 그러고 보니 RISC-V의 상용화가 쉽지 않은 이유 중 하나로 파편화를 꼽는데, 이것도 또 하나의 파편화이지 않을까 합니다. 아무튼 48MHz의 가격에 비하면 높은 클럭을 가지고 있습니다. CoreMark 점수가 80점으로, Arduino MEGA의 ATmega2560의 7.5점에 비하면 훨씬 높은 수치입니다. 한편, UNO R4 Minima와 비슷한 점수입니다.
특이하게 디버깅이 케이블 하나만으로 가능하다고 합니다. SWD/JTAG를 사용하는 Cortex-M 프로세서와 이게 다르네요. CH32V003은 특히나 핀이 8개짜리도 나오니 핀을 아끼기 위해 이렇게 한 게 아닌가 싶습니다. Serial.. 아니, Single Wire Debug네요.
이 외에도 DMA, ADC, OPA(OPAmp), Timer, UART, I2C, SPI 등 일반적인 Peripheral는 모두 보이네요.
한편, 작동전압은 3.3V와 5V로 넓게 지원합니다. 데이터시트에 따르면 최저 전압은 2.7V입니다. 배터리를 사용할 때에는 3.3V를 사용하고, USB는 LDO 없이 5V를 꽂아넣으면 BOM을 줄일 수 있어 보입니다.

저렴한 가격만큼 심플한 모습입니다.
사양 #
간단하게 사양만 정리하면 다음과 같습니다.
- 프로세서: QingKe 32-bit RISC-V (RV32EC ISA) @ 48 MHz
- SRAM: 2 KB
- FLASH: 16 KB
- 작동전압: 2.7~5.5 V
- 5 V 호환 핀 제공
- Peripheral: USART, I2C, SPI, ADC, OPA, Timer 등
데이터시트 #
데이터시트는 WCH 홈페이지에서 다운로드할 수 있습니다.

CH32V003DS0.PDF - Nanjing Qinheng Microelectronics Co., Ltd.
WCH is an IC design company that designs chips based on self-developed professional interface IP and microprocessor IP. …
www.wch-ic.com

CH32V003 시리즈는 패키지 타입별로 4가지 종류가 있습니다. 크기가 작은 패키지로 가면 Flash와 SRAM은 동일하고, ADC 개수, SPI가 빠지네요. 가장 작은 패키지는 SOP8으로, 다리 8개짜리입니다.

RTC, watchdog을 위한 저주파수 클럭, SYSCLK에 연결되는 고주파수 클럭으로 나뉩니다. 둘 다 MCU 내부에 RC 오실레이터로 포함(HSI, LSI)되어 있습니다. 필요하면 HSE를 사용할 수 있습니다.

LSE에 대한 언급이 데이터시트에 있긴 한데 V003에는 없는 것 같습니다. 뭔가 다른 시리즈 MCU에서 섹션을 잘못 긁어온 것인지..

특이하게 OP-Amp가 내장되어 있습니다. 출력이 ADC에 직결되어 있다고 합니다.



2.7~5.5V 입력이고 입력 전압에 따라 논리 전압이 바뀝니다. 이때 몇몇 핀은 5V 이하에서도 5V 입력을 지원합니다.
CH32V003F4P6-EVT-R0 #
앞에서 언급한 알리익스프레스 스토어에서 공식 개발보드인 CH32V003F4P6-EVT-R0를 구매했습니다.
언박싱 #



왼쪽부터 개발보드, 샘플 MCU, 공식 디버거(WCH-LinkE)입니다. 어떻게 이 가격에 이런 구성이 나오는지.. 참 신기합니다.

샘플 MCU는 개발보드와 동일한 CH32V003F4P6입니다.

모아두고 사진도 찍어봤습니다.
개발보드 살펴보기 #

손바닥 안에 들어오는 작은 개발보드입니다. USB Type-C 커넥터를 사용하는 게 마음에 듭니다.

GPIO 핀은 순서가 마음대로이긴 하지만 아무튼 잘 뽑혀 있고, 특이하게 LED는 GPIO에 바로 연결되어 있지 않고 커넥터로 뽑혀있습니다. 헤더핀으로 직접 꽂아 사용하라는 것 같습니다.

MCU는 CH32V003F4P6로, V003 시리즈 중 핀 수가 가장 많은(20개) 모델입니다.

개발보드의 Schematic입니다.
USB 전원을 그대로 MCU에 집어넣지 않고, LDO를 통해 3.3V를 공급하도록 되어있습니다. 필요하면 R10을 쇼트해서 5V 사용도 가능해 보입니다. HSE 크리스탈은 24MHz입니다.
그나저나 기껏 Type-C USB를 사용해 놓고 CC핀에 저항을 빼두었네요. 빅 마이너스 요인입니다.

CH32V003EVT.ZIP - 南京沁恒微电子股份有限公司
沁恒是一家基于自研专业接口IP、微处理器内核IP构建一体化芯片的集成电路设计企业。主要产品包括USB/蓝牙/以太网接口芯片和连接型/互联型/无线型MCU,产品侧重于连接、联网和控制。
www.wch.cnCH32V003F4P6-EVT-R0의 Schematic, 매뉴얼 등은 위 홈페이지에서 다운로드할 수 있습니다.
공식 디버거 WCH-LinkE #


WCH MCU의 공식 디버거인 WCH-LinkE입니다.
생긴 건 짭 ST-Link나 USB to UART 컨버터에서 자주 보던 것인데, 케이스가 기스 하나 없이 엄청 투명합니다. 사진에서는 잘 보이지 않지만 CH32V305FBP6 MCU가 들어있습니다. 이쪽은 144MHz의 고성능 MCU입니다.

WCH-LinkUserManual.PDF - Nanjing Qinheng Microelectronics Co., Ltd.
WCH is an IC design company that designs chips based on self-developed professional interface IP and microprocessor IP. …
www.wch-ic.com디버거의 매뉴얼은 위 링크에서 확인 가능합니다.


공식 디버거에는 LinkE 이 외에도 여러 가지가 있는데, 디버거별로 지원하는 MCU나 기능이 다른 모양입니다.

MCU별로 연결할 핀 번호를 친절하게 알려주고 있습니다. CH32V003은 1-wire 디버깅을 사용하기 때문에 SWDIO핀 하나만을 사용하는 모습입니다.

기왕 1-wire 써보는 거 정말로 전선 1개만 연결해 봤습니다. GND는 어차피 공통이니 어찌저찌 잘 해주지 않을까 합니다.
개발환경 구성 #
WCH MCU용 IDE로 MounRiver Studio가 있습니다. 여기서는 VSCode + CMake 개발환경을 위해 아래 라이브러리를 사용합니다.
공식 딱지는 없지만, 아무래도 WCH의 공식 라이브러리가 맞는 것 같습니다.
ch32v003/EVT/EXAM/OPA/OPA/User/main.c at main · openwch/ch32v003
CH32V003 is an ultra-cheap RISC-V MCU with 2KB SRAM, 16KB flash, and up to 18 GPIOs that sells for under $0.10 - …
github.com
한편, upstream OpenOCD는 WCH-LinkE 디버거를 지원하지 않습니다. 앞에서 언급한 MounRiver Studio 홈페이지의 Download 탭에서 RISC-V 빌드 툴체인과 패치된 OpenOCD를 다운로드받을 수 있습니다.

준비물을 모은 후 Codex에게 개발환경을 만들어달라 합니다.

잘 업로드되는 모습입니다.
Hello, CH32V003F4P6-EVT-R0! #
#include <ch32v00x_gpio.h>
#include <ch32v00x_rcc.h>
#include "delay.h"
#define BLINK_GPIO_CLK RCC_APB2Periph_GPIOD
#define BLINK_GPIO_PORT GPIOD
#define BLINK_GPIO_PIN GPIO_Pin_0
static void gpio_init_for_blink(void) {
GPIO_InitTypeDef gpio = {0};
RCC_APB2PeriphClockCmd(BLINK_GPIO_CLK, ENABLE);
gpio.GPIO_Pin = BLINK_GPIO_PIN;
gpio.GPIO_Speed = GPIO_Speed_30MHz;
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(BLINK_GPIO_PORT, &gpio);
GPIO_ResetBits(BLINK_GPIO_PORT, BLINK_GPIO_PIN);
}
int main(void) {
SystemCoreClockUpdate();
delay_init();
gpio_init_for_blink();
while (1) {
GPIO_WriteBit(BLINK_GPIO_PORT, BLINK_GPIO_PIN, Bit_SET);
delay_ms(1000);
GPIO_WriteBit(BLINK_GPIO_PORT, BLINK_GPIO_PIN, Bit_RESET);
delay_ms(1000);
}
}마무리 #

100원짜리.. 사실 100원대가 맞는말이지만 아무튼.. 아주 저렴한 32-bit RISC-V MCU를 사용해 봤습니다.
직전에 맛을 봤던 GD32E230은 그나마 메이저해서 그런지 개발환경 구성에 별다른 어려움을 느끼지 못했는데, 이쪽은 OpenOCD에서 디버거 지원이 없어서 한참 헤매게 되었습니다. 사실 빌드 툴체인도 전에 arm-none-eabi-gcc 설치해뒀지 하면서 별 생각이 없었는데 RISC-V 툴체인을 따로 찾아야했죠. 결론은 MounRiver 홈페이지에서 한방에 다운로드 받았는데, 공식 홈페이지에 설명 하나 없는 ㅋㅋ...

그나저나 자료를 찾던 중 Zephyr 지원이 있다는걸 알게되었습니다. 2KB짜리에 RTOS...??
Pull requests · zephyrproject-rtos/zephyr
Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple …
github.com이 PR에서 추가됐는데, 기본 예제만으로 RAM을 74%를 사용합니다 ㅋㅋㅋㅋ.. 이런 저가 MCU에서 돌아가는 Zephyr는 어떤지 궁금하네요. 다음에 한번 맛을 봐야겠습니다.