
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シリーズに書き込めるようにするファームウェアです。
これを使えば、安価にCH32シリーズのプログラマを作れます。
RVSWDIO Programmerを使う基板を製作
RVSWDIO Programmerを使う基板を製作しました。 KiCadデータは以下で公開しています。
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を利用する方がツールの幅も広く、問題が起きることも少なく便利ではあるでしょう。




















