Skip to the content
PCBKitNew board
4 layers23.5 × 12.5 mmProPrj ch32 tapioca probe mini 2026-09-03, the printed circuit board in 3D

ProPrj ch32 tapioca probe mini 2026-09-03

pierrejay/ch32-tapioca-probe3

CMSIS-DAP SWD/JTAG & WCH-Link RVSWIO/RVSWD debug probe implementation for CH32X035 (PIOC)

Size
23.5 × 12.5 mm
Copper layers
4
Thickness
1.6 mm
Parts
29
Nets
31
Pads
99
Tracks, vias
235, 56
Pours
16
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
26 Jul 2026
Updated
29 Sep 2026

Overview

ProPrj ch32 tapioca probe mini 2026-09-03 is an open-source printed circuit board by pierrejay, from the pierrejay/ch32-tapioca-probe repository on GitHub. It is a 4-layer board of 23.5 × 12.5 mm with 29 parts on 31 nets, routed with 235 tracks and 56 vias.

It is built around the CH32X035F8U6, RT9080-33GJ5 and TPD1E01B04DPYR, with the LESD5D5.0CT1G, A2501HWR-4P and KT-0603R among its other parts. Its parts include 10 diodes, 6 resistors, 5 capacitors, 3 ICs and 1 connector. It belongs with the sensors and measurement and interfaces and adapters boards of this library.

Main components

7

README

README.md

ch32-tapioca-probe

Two build-time USB debug-probe firmwares for CH32X035:

  1. CMSIS-DAP SWD + JTAG: an ARM debug probe for OpenOCD and probe-rs.
  2. WCH-Link: a WCH-LinkE-like probe for CH32 RISC-V, both single-wire RVSWIO and two-wire RVSWD, driven by stock minichlink or probe-rs. Auto-detects RVSWIO vs RVSWD per target.

The ~€0.25 CH32X035 needs few external parts and fits in a 3 x 3 mm QFN; its PIOC coprocessor nicely handles the timing-critical single- and two-wire protocols, making it practical to embed the probe directly into a product.

The project is based on ch32fun and reuses the proven PIOC primitives from the sibling Tapioca project.

A reference design of a tiny <€6 probe PCB (debug/JTAG, UART bridge, switchable 3V3 output) is also provided with EasyEDA & KiCad source files.

CH32 Tapioca Probe reference board

Tested

FamilyInterfaceChipsHost tools
ARMSWD (CMSIS-DAP)STM32H523, STM32G431OpenOCD, probe-rs
ARMJTAG (CMSIS-DAP)STM32H523OpenOCD, probe-rs
CH32RVSWIO (1-wire)CH32V003, CH32H417minichlink, probe-rs
CH32RVSWD (2-wire)CH32X035, CH32V203, CH32V307minichlink, probe-rs

Features

  • Debug transports: ARM SWD/JTAG and WCH-Link RVSWIO/RVSWD, detailed in the two products below.
  • UART bridge: optional native USB CDC ACM on USART4 (PB0/TX, PB1/RX), exposed as a second USB function, enabled with make UART_BRIDGE=1 and configurable through the host serial port.
  • Target power: optional load switch controlled through PA3; host control is currently available with the WCH-Link firmware. Switching it off releases the WCH interface and parks UART pins, avoiding parasitic powering of the DUT. With a self-powered DUT, 3V3 may remain connected; keep target power switched on to retain WCH and UART functionality.
  • Activity LED: shows the target-power state and blinks during debug or UART traffic.

The debug firmwares are host-driven transports: the probe executes the timing-critical wire transactions, while OpenOCD, probe-rs or minichlink owns the target-specific flash algorithm.

Product 1: CMSIS-DAP SWD + JTAG (USB C251:F000)

The firmware exposes one CMSIS-DAP v2 bulk interface for ARM SWD and JTAG with OpenOCD and probe-rs. DAP_Connect(0) selects SWD by default; explicit DAP_Connect(1) and DAP_Connect(2) select SWD and JTAG respectively.

Pinout

The full firmware pinout supports complete SWJ-DP wiring; the minimal reference PCB routes only the shared SWD pins:

SignalPinNotes
SWD SWCLK / JTAG TCKPC18 (PIOC IO0)
SWD SWDIO / JTAG TMSPC19 (PIOC IO1)shared SWJ data
JTAG TDIPA7
JTAG TDOPA6
nSRST / SWD nRESETPA4optional recovery
JTAG nTRSTPA5optional (needs JTAG_TRST=1); otherwise PA5 is free
UART TXPB0probe to target (needs UART_BRIDGE=1)
UART RXPB1target to probe (needs UART_BRIDGE=1)
Notes
  • SWD runs a single fixed ~1 MHz profile (DAP_SWJ_Clock is accepted for host compatibility but doesn't change it). The ARM SWD path is validated for correctness, not tuned for speed; its throughput has not been benchmarked against a commercial probe.

  • JTAG uses a GPIO engine and accepts host clock requests from 1 kHz to 2 MHz. Chain discovery, halt/run, reset and SRAM access were validated on STM32H523 with both OpenOCD and probe-rs, including concurrent UART traffic. Target programming was validated with probe-rs at roughly 12 KiB/s. This is modest, but still useful for troubleshooting and recovery.

  • Select the transport explicitly in the host (--protocol swd|jtag with probe-rs, or transport select swd|jtag with OpenOCD). SWD remains the probe's default when the host does not choose. On DAP_Connect(JTAG), the probe emits the standard SWD-to-JTAG sequence so hosts such as OpenOCD 0.12 also work when another tool left the target in normal SWD. This best-effort transition does not wake a target left in the dormant state.

  • probe-rs info --protocol swd can pause for about ten seconds after finding a valid DPv2 target because it deliberately probes two RP2040 multidrop addresses. This is a probe-rs discovery quirk, not a Tapioca transport timeout; normal target-specific attach and flashing are unaffected.

  • Full run-control debugging works with both SWD and JTAG, not just flashing. RTT also works over SWD (OpenOCD rtt or defmt/probe-rs): it uses ordinary target-memory access and needs no trace pin.

  • There is no SWO/ITM trace yet (no DAP_SWO_* commands), so printf-over-SWO and instruction trace aren't available.

  • The CMSIS-DAP SWD and JTAG paths exercised by OpenOCD and probe-rs are implemented. Transfer value matching and the optional SWJ pin-wait behavior are not; unsupported features are not advertised as probe capabilities.

  • Example OpenOCD configs for driving targets through the probe are in openocd/, including the validated STM32H523 JTAG chain.

Product 2: WCH-Link, RVSWIO & RVSWD (USB 1a86:8010)

A WCH-LinkE-compatible probe for CH32 RISC-V, driven by stock minichlink or probe-rs 0.32+ where its target support is available.

The probe implements the WCH-Link direct-DMI passthrough only: the host owns the flash algorithm, the probe just runs the wire transactions. That is simple and enough for most flashing (which is why minichlink drives it), but it is not a full WCH-LinkE: tools that rely on the flash-programming logic built into a real probe are untested and likely won't work as-is.

probe-rs works through this direct-DMI path and has been exercised on all targets listed above. Support still depends on the target definitions and flash algorithms available upstream, so less mature targets may retain host-side quirks; for example, regular H417 flashing works, while full-chip erase awaits an upstream flash-algorithm fix.

  • RVSWIO: single-wire, for the small parts (CH32V003…).
  • RVSWD: two-wire, for the larger parts (CH32V307, CH32V203, CH32X035…).
  • Auto-detection: one firmware probes the target and picks the transport itself, so the same binary flashes a CH32V003 and a CH32V307 with no reflash.
Pinout

One data line, plus a clock for the 2-wire parts:

SignalPinNotes
SWCLKPC18 (PIOC IO0)2-wire only
SWDIO / SWIOPC19 (PIOC IO1)data (1- & 2-wire)
UART TXPB0probe to target (needs UART_BRIDGE=1)
UART RXPB1target to probe (needs UART_BRIDGE=1)
PWRENPA3target 3.3V load switch (optional, defaults on)
Notes
  • Some MCUs (e.g. CH32V003 1-wire and CH32X035 2-wire) drive SWDIO open-drain and need an external ~4.7–10 kΩ pull-up to 3.3 V. Others (like CH32V203/V307) work without one. The reference board uses a 5.1 kΩ pull-up, which makes it universal.

  • On the same direct-DMI minichlink it flashes ~15 % faster than a genuine WCH-LinkE R0-1v3 and reads ~30 % faster (CH32V203, 32 KB payload). Insignificant in practice, and not directly comparable with vendor algorithms (e.g. using wlink), but a good sign that the PIOC approach holds up. There is still plenty of headroom to optimise the USB link and flashing process.

  • Some older minichlink builds don't drive direct-DMI. make minichlink builds the pinned version directly from the ch32fun submodule.

  • Target power is controlled with minichlink -k3 -C linke (on) and minichlink -kt -C linke (off). The -k avoids probing an intentionally unpowered target before applying the command. Power control is not yet exposed by the CMSIS-DAP firmware.

Build & flash

Clone the SDK submodule and build both products with a WCH-capable GNU RISC-V embedded toolchain supporting rv32imacxw (riscv-none-embed, riscv-wch-elf, riscv-none-elf, or another compatible prefix):

sh
git submodule update --init
make

The Makefile uses an explicit RISCV_PREFIX first, then a toolchain installed in sdk/toolchain/, then a compatible toolchain from PATH. For example, the PlatformIO-distributed GCC 8.2.0 used to validate this project can be installed directly in the repository without installing PlatformIO itself:

sh
# macOS
git clone --depth 1 --branch 8.2.0 \
  https://github.com/Community-PIO-CH32V/toolchain-riscv-mac.git sdk/toolchain

# Linux x86_64, including WSL2
git clone --depth 1 --branch 8.2.0 \
  https://github.com/Community-PIO-CH32V/toolchain-riscv-linux.git sdk/toolchain

If the compiler has a different prefix, pass it explicitly, for example make RISCV_PREFIX=riscv64-unknown-elf.

Both products flash through the CH32X035 USB ISP bootloader with wchisp (hold BOOT while plugging in):

sh
make flash-jtagswd   # product 1: ARM SWD/JTAG (CMSIS-DAP v2)
make flash-wchlink   # product 2: WCH-Link (auto RVSWIO/RVSWD)

Firmware options and the product to flash can be selected in the same command, for example make UART_BRIDGE=1 JTAG_TRST=1 flash-jtagswd. make help lists every supported build option and tool override.

On Linux, install the included udev rules once to access the CH32X035 ROM USB ISP bootloader and the CMSIS-DAP development identity without sudo (the user must belong to the plugdev group):

sh
sudo install -m 0644 udev/50-ch32-tapioca-probe.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules

Unplug and reconnect the probe after installing the rules.

Run the native unit tests with make test. See make help for the common targets. PC18/PC19 are the CH32X035's own SDI debug pins, so the probe itself is flashed over USB ISP, not SWD.

USB identity: disclaimer

The CMSIS-DAP firmware temporarily borrows C251:F000, the Keil/Arm identity used by the CMSIS-DAP v2 example configuration. It is not allocated to this project; CMSIS-DAP hosts identify the interface through its CMSIS-DAP v2 string rather than a project-specific PID.

The WCH-Link firmware still borrows WCH-LinkE's 1a86:8010 identity so stock minichlink can discover it. This is not an official WCH, Keil or Arm product.

A dedicated pid.codes allocation is planned. Replace these development identities before distributing anything built on this.

Credits

See THIRD_PARTY.md for detailed contributions.

Parts

29
QtyValueFootprintReferences
6TPD1E01B04DPYRProPrj_ch3-easyedapro:X1SON-2_L1.0-W0.6-P0.65-BID4, D5, D6, D7, D8, D9
55.1kΩProPrj_ch3-easyedapro:R0402R1, R2, R24, R40, R41
3LESD5D5.0CT1GProPrj_ch3-easyedapro:SOD-523_L1.2-W0.8-LS1.6-BID1, D2, D3
210uFProPrj_ch3-easyedapro:C0603C1, C3
1100nFProPrj_ch3-easyedapro:C0402C29
110uFProPrj_ch3-easyedapro:C0402C4
11kΩProPrj_ch3-easyedapro:R0402R89
11uFProPrj_ch3-easyedapro:C0402C2
1A2501HWR-4PProPrj_ch3-easyedapro:CONN-TH_A2501HWR-4PCN1
1AP2151WG-7ProPrj_ch3-easyedapro:SOT-25-5_L3.0-W1.8-P0.95-LS3.0-BRU9
1CH32X035F8U6ProPrj_ch3-easyedapro:WQFN-20_L3.0-W3.0-P0.40-TL-EP1.7U4
1KT-0603RProPrj_ch3-easyedapro:LED-SMD_L1.6-W0.8-R-RDLED4
1PZ254R-11-04PProPrj_ch3-easyedapro:HDR-TH_4P-P2.54-H-M-W10.4H1
1RT9080-33GJ5ProPrj_ch3-easyedapro:TSOT-23-5_L2.9-W1.6-P0.95-LS2.8-BLU6
1TYPE-C 16PIN 2MD(073)ProPrj_ch3-easyedapro:USB-C-SMD_TYPE-C-16PIN-2MD-073USB2
1TestPointProPrj_ch3-easyedapro:Pad_e438TP2
1TestPointProPrj_ch3-easyedapro:Pad_e437TP1

Questions

How big is the ProPrj ch32 tapioca probe mini 2026-09-03 PCB?

It measures 23.5 × 12.5 mm and has 4 copper layers, 1.6 mm thick.

What parts does the ProPrj ch32 tapioca probe mini 2026-09-03 use?

29 parts, built around the CH32X035F8U6, RT9080-33GJ5, TPD1E01B04DPYR and LESD5D5.0CT1G. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the ProPrj ch32 tapioca probe mini 2026-09-03 KiCad files?

From the pierrejay/ch32-tapioca-probe repository on GitHub, at the commit this page was made from: the board is hardware/kicad/ProPrj_ch32_tapioca_probe_mini_2026-09-03.kicad_pcb and its schematic hardware/kicad/ProPrj_ch32_tapioca_probe_mini_2026-09-03.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the ProPrj ch32 tapioca probe mini 2026-09-03 design in my own project?

Its repository states no licence, so its author keeps all rights: ask pierrejay before reusing the design.

Similar boards

  • 4 layers22 × 30 mmSi468x, the printed circuit board in 3D

    Si468x

    NightLaneOrg/nr-si468x-dev

    Si468x-based DAB/FM receiver module (M.2 E-Key) with open hardware and Linux integration.

    55 parts4GPL-3.0
  • 4 layers230 × 84.9 mmDrunkDashboard v2, the printed circuit board in 3D

    DrunkDashboard v2

    drunkbatya/DrunkDashboard

    STM32 powered pixel automotive dashboard

    223 parts1GPL-3.0
  • 4 layers18.1 × 39 mmTikk hw, the printed circuit board in 3D

    Tikk hw

    golioth/tikk-hw

    sensor/io front panel for low cost keyboard bluetooth breakout

    155 parts1CERN-OHL-P-2.0
  • 4 layers42 × 155 mmBefore, the printed circuit board in 3D

    Before

    alxgmpr/moisture-sensor

    Indoor capacitive soil moisture sensor - nRF54L15 + nPM1300 + FDC1004, BTHome v2 over BLE

    65 parts
  • 2 layers26 × 38 mmBytebridge, the printed circuit board in 3D

    Bytebridge

    nrwiersma/bytebridge

    ByteBridge a USB to UART breakout board with more power.

    24 partsMIT
  • 2 layers72.4 × 41.2 mmPcb card, the printed circuit board in 3D

    Pcb card

    Haxintosh/pcb-card

    A PCB business card

    141 partsCERN-OHL-P-2.0