CH32V003に書き込みができる安価なライターを製作

tl;dr

  • CH32シリーズの書き込みには、DAPLinkは使えず、WCH-LinkEを使う必要があるよ
  • 激安マイコンCH32V003には、bitbangでUSBプロトコルを実装したrv003usbがあるよ
  • ch32fun中のプログラマソフトウェアminichlink向けの、rv003usbで実装したプログラマファームウェアRVSWDIO Programmerが公開されているよ
  • RVSWDIO Programmerを使うための基板を起こしたところ、ちゃんと動いたよ。超安価なプログラマができたよ
  • ただ、日本だとWCH-LinkEが気軽に秋月で買えるので、そちらを使った方が確実だよ

CH32シリーズを書き込むには

CH32シリーズは、WCHが提供する安価な32bit RISC-V MCUです。 筆者はCH32V003を様々な電子工作に組み込んできました。

CH32シリーズのファームウェアの書き込みには、WCH-LinkEという専用のプログラマが必要です。 ただし、USBデバイス機能がついたCH32V203の場合にはUSB経由で書き込めます。 USB機能のないCH32V003の場合にはやはり必要です。

ARMのSWDとは異なっているようで、DAPLink等のARM用のプログラマは利用できません。

USBデバイスのないCH32V003にUSBデバイスの実装がある

CH32V003はCH32Vシリーズで最も安価なMCUです。 USBデバイスペリフェラルはありませんが、rv003usbというbitbangでUSBプロトコルを実装したOSSがあります。 これを使うと、CH32V003でUSBデバイスとして機能させられます。

これは、UIAPduinoのブートローダにも使われており、UIAPduinoはUSB経由でファームウェアが書き込めるようになっています。

rv003usbでCH32シリーズのプログラマを実装したRVSWDIO Programmer

rv003usbのリポジトリ中に含まれているコードにRVSWDIO Programmer(正確にはREADME.mdには、ch32v003 programmer for WCH V- and X- chipsと書かれていますが、このプロジェクトディレクトリ名にあたるRVSWDIO Programmerを以下で記載します)があります。 これは、CH32シリーズのプログラマソフトウェアであるminichlinkでCH32シリーズに書き込めるようにするファームウェアです。

github.com

これを使えば、安価にCH32シリーズのプログラマを作れます。

RVSWDIO Programmerを使う基板を製作

RVSWDIO Programmerを使う基板を製作しました。 KiCadデータは以下で公開しています。

github.com

ch32funのプロジェクトをビルドして書き込んでみたところ、問題なく動作しました。

元のプログラマのWCH-LinkEには接続先MCUの電源のスイッチ機能があります。 RVSWDIO Programmerにもこの制御機能が含まれています。 接続先MCUの電源のスイッチにCH217を入れて、RVSWDIO ProgrammerからCH217のENピンを制御することで機能させることができました。

最初、RVSWDIO ProgrammerはUSBが接続された初期状態では、この制御ピンがフローティング状態になっており、接続しただけではMCUに電源が供給されませんでした。実際に書き込みコマンドを実行したり minichlink -3を実行すると電源ONになりました。

また、CH217のENピンはActive Lowなのですが、RVSWDIO Programmerの初期状態ではActive Highで制御するようになっており、RVSWDIO Programmer中の定義を逆に設定しました。

#define POWER_ON 0
#define POWER_OFF 1

使い方

次にこれの使い方です。

接続は、CH32V003とRVSWDIO ProgrammerのSWDIOとGNDを繋ぐだけです。

PC上で、書き込み時に、minichlinkを使うように設定する必要があります。

ch32funであればminichlinkを使うようになっているため、そのまま使えます。 WCH-LinkEの利用が前提になっているMounRiverStudio(公式SDK)やArduinoIDE(Arduino Core CH32)では、このRVSWDIO Programmerを使うことはできません。 PlatformIOであれば、アップロードコマンド(upload_protocol)を変更できるため、以下のように変更しておきます。

[env]
platform = https://github.com/Community-PIO-CH32V/platform-ch32v.git
framework = ch32v003fun
# minichlinkを指定する
upload_protocol = minichlink
monitor_speed = 115200
board_build.core = ch32v003

[env:genericCH32V003F4P6]
board = genericCH32V003F4P6

PlatformIOであれば、利用するフレームワークArduino/公式SDK/ch32funから選べるので、幅広く使えるでしょう。

ただし、PlatformIOのシリアルモニタは利用できないため、ターミナル上で以下のコマンドを実行する必要があります。

minichlink -T

なお、筆者の場合は、開発フレームワークとしてch32funをメインに使っていて、ch32funのMakefileが利用できるので、PlatformIOは利用していません。

とはいえWCH-LinkEを使った方が良い

RVSWDIO Programmerを使い、安価なCH32Vシリーズのプログラマを作れました。 しかし、公式プログラマWCH-LinkE自体は秋月電子通商で千円程度で安価に販売されていたり、WCH公式のショップがAliexpressにあって安価に購入できるため、WCH-LinkEを利用する方がツールの幅も広く、問題が起きることも少なく便利ではあるでしょう。