Files
Linux-microcontroller-GPIO/CH32V003/README.md
T
2026-10-23 10:48:05 +02:00

3.7 KiB

CH32V003 ch32fun template (fully open source)

A minimal make project for the CH32V003 built on ch32fun (MIT). It uses no WCH EVT SDK, no WCH GCC, no libprintf, and no IQmath.

The example blinks an LED on PD0. Put your own application in firmware.c.

Stack

Component Role License
ch32fun startup, headers, GPIO helpers, printf, linker script MIT
riscv64-elf-gcc / binutils compiler and binutils GPL
riscv64-elf-newlib headers only (stdio.h, string.h, ...) BSD
ch32fun/misc/libgcc.a compiler runtime GCC runtime license
minichlink flashing / SWIO monitor MIT
wchisp (optional) alternative flasher GPL-2.0

Why the missing rv32ec newlib multilib does not matter

Arch's riscv64-elf-newlib has no rv32ec/ilp32e library, but ch32fun builds with -nostdlib and links its own misc/libgcc.a:

-nostdlib ... -L.../misc -lgcc

Only newlib's headers are used. The CH32V003 startup, printf, and runtime support come from ch32fun, so no WCH or newlib object code is linked.

Requirements

Arch packages:

sudo pacman -S --needed base-devel riscv64-elf-gcc riscv64-elf-newlib libusb

libusb is only needed to build minichlink for flashing. systemd-libs provides libudev and is normally already installed.

ch32fun checkout:

git clone https://github.com/cnlohr/ch32fun ~/code/ch32fun

The Makefile defaults to ~/code/ch32fun. If yours is elsewhere:

make CH32FUN_ROOT=/path/to/ch32fun

It also defaults to the Arch newlib header directory /usr/riscv64-elf/include and the compiler prefix riscv64-elf. Override with NEWLIB=... or PREFIX=... if needed.

Build

cd ch32fun-template
make
make size

Outputs:

firmware.elf
firmware.bin
firmware.hex
firmware.lst
firmware.map

Only firmware.bin is written to the chip. make never flashes implicitly.

The template currently builds to about 620 bytes of flash:

text    data    bss    dec    hex
620       0      0    620    26c    firmware.elf

Flash and monitor

make flash builds minichlink on first use and writes firmware.bin:

make flash

minichlink needs permission to access the WCH-Link. Install its udev rules once:

sudo make -C ~/code/ch32fun/minichlink install_udev_rules

Then reconnect the WCH-LinkE. Wiring for SWIO programming:

WCH-LinkE       CH32V003
3V3      <-->   3V3
GND      <-->   GND
SWIO     <-->   PD1

View printf output over the SWIO debug channel:

make monitor

make terminal and make unbrick are also provided by ch32fun's build rules.

If you prefer wchisp from the AUR:

yay -S wchisp
wchisp flash firmware.bin

Customize

  • firmware.c — application code; LED_PIN is PD0.
  • funconfig.h — clock and printf configuration.
  • TARGET — output basename. It must match the application source name, so TARGET := firmware uses firmware.c.
  • TARGET_MCU — defaults to CH32V003; change it to target another ch32fun MCU.

Useful overrides:

make TARGET_MCU=CH32V003
make CH32FUN_ROOT=/path/to/ch32fun
make PREFIX=riscv32-unknown-elf
make clean

For a Linux-hosted cross compiler instead of the bare-metal package:

make PREFIX=riscv64-linux-gnu EXTRA_CFLAGS=-no-pie

That path also works but is less clean; riscv64-elf-gcc is recommended.

License

The template files (Makefile, firmware.c, funconfig.h, this README) are MIT-licensed; see LICENSE. ch32fun is MIT-licensed. GCC, binutils, newlib, and minichlink are open source under their respective licenses.