20241114182939 CH32Vの開発環境
ch32vmicrocontrollersoftware WIP
成果物としてフルーツ餅を光らせるものを作った。 GitHub - kinoshita-lab/Fruit-Mochi-Exciter
CH32Vといいつつ、CH32V003に限定した情報が含まれているかもしれない。
CH32Vは Nanjing Qinheng Microelectronics が製造しているRISCVのMCU。
- めちゃ安い(20241115時点で、CH32V003J4M6が秋月で40円 32ビットRISC-Vマイコン CH32V003J4M6: 半導体 秋月電子通商-電子部品・ネット通販)
- 外付け部品不要で動かせる(内蔵RC発振)
- それなりにフラッシュメモリもある。 e.g. CH32V003J4M6はFlashl16k, RAM2kB(米粒AVRだと Flash 1kB, RAM 32)
など、ちょっとしたことに使いやすそう。
必要なもの
- マイコン
- デバッガ。 WCH-LinkE WCH-Link Emulation Debugger Module - NanjingQinhengMicroelectronics が純正品で、これを使っているが、SWDで通信できれば何でもよかったかもしれない。よくわかっていない。
わたしは一式 をaliexpressで買ったが、個別に秋月などでも購入可能。
準備
ハードウェアの接続
WCH-LinkEの通信モードを設定する必要がある(っぽい)。
WCH-LinkEをPCに接続。WCH-LinkEから、電源(3.3V or 5V)とGND、SWDIOをマイコンに接続する。 CH32V003の場合、どのパッケージでもPD1がSWDIO。データシート参照。 CH32V003DS0.PDF - NanjingQinhengMicroelectronics
SWDIOだったり、SWIO だったりと表記が揺れているが、このピンで接続できた。
設定
WCH-LinkUtility.ZIP - 南京沁恒微电子股份有限公司 をダウンロード&展開して、実行。 ドライバーインストールの画面が別途表示されるので、そちらを使ってインストールする。ちなみにこの画面はこのユーティリティを起動するたびに、表示されつづけた。PCを再起動したら表示されなくなった。
上のアイコン、左から2番目(Connect WCH-Link)を押す。 下の方のログ画面に、 Succeed to connect with WCH-Link と表示されれば、無事に接続できている。
WCH-Linkの接続方法を変更する。
下の方にある Active WCH-Link Mode: の所、左端のコンボボックスでWCH-LinkRV を設定、 右端のSetを押す。
Succeeed! と下のログ画面に表示されれば設定できている。
画面上部、 Core: でRISC-Vを選択、 Series で CH32V003を選択する。
その状態で上のアイコン、左から3番目Query Chip Info を押してみて、 右の表っぽい所にMCU ID、 Flash Sizeなど読みこまれたら、 WCH-LinkとMCUとの通信がうまくいっている。左から5番目のアイコン、Query Read-Write Protect Status を押すと、当然だがDisable という表示になる。
こんな感じ。

Refs.
- 40円RISC-Vマイコン(CH32V003)をArduino IDEでLチカをしてみました | きょうのかんぱぱ WCH-Linkの設定などが参考になった。
開発環境
純正の開発環境として、eclipseベースの MounRiver Studio がある。とりあえずインストールしてみたが、こっちは使わないかもしれない。
PlatformIOでやりたい(特に合理的な判断ではないかも)。PlatformIOへCH32Vをインストールする方法はこちら。 Welcome to the PlatformIO CH32V Documentation! — PIO CH32V 0.1 documentation このドキュメントによると、将来的には FreeRTOSとかも使えそうな雰囲気を感じるが、リンク先は20241120 時点では何も書いていない。Ch32v003funとArduinoについては記載が無いなど、開発中な雰囲気を感じる。 20241120 時点で、PlatformIOで選択可能なのは以下の3種類。
Noneos-sdk
Bare Metalっぽいやつ。 platform.iniでスタートアップやC++の有無などまで設定できる。
- GitHub - Community-PIO-CH32V/framework-wch-noneos-sdk: PlatformIO repackaging of W.CH CH32V NoneSDK Source Code
- None OS SDK — PIO CH32V 0.1 documentation
Arduino-sdk
arduinoっぽく使えるやつ。 built on Noneos-sdk(上のやつ)。
Ch32v003fun
CH32V003専用?といいつつチラホラ別の型番も使えるようになりつつあるっぽい。 PlatformIO無しで単体で使うことも可能。 SWDIOでprintfデバッグができる。
-
ch32v003funでCH32V003を便利に開発している話 - @74thの制作ログ ものすごくわかりやすい。
Ch32v003fun + PIO でprintfするには
「SWDIOでprintfデバッグができる。」 とのことだが、これが多少面倒だった。 以下状況を調査しつつ整理中のWIP。
platformIOでprintfするサンプルはここにあって、このような感じでやればprintfは可能なのだが、noneos用。 platform-ch32v/examples/sdi-printf-ch32v003 at develop · Community-PIO-CH32V/platform-ch32v · GitHub
これのplatform.iniのframeworkを変更すると、noneosだと存在する、debug.hが無いのでビルドできない。 debug.h、debug.cをnoneosから拾ってきて、srcフォルダに追加、不要な部分を消す。
Enable SDI Printf をクリックして有効にする。

デバッガ接続した状態とprintfの両立はできないかもしれない。WCHLink経由で接続した状態で、 Enabld SDI printf を選ぶと、プログラムがReleaseモードで再ロードされてしまう。printfはWCHLinkが接続された状態だと、debug.cのwrite_ が無限ループになってしまう。ここを工夫したらいけるかもしれない。 両方使えたら便利。
Neopixel
J4M6は8ピンしか無く、SPIのピンが出ていない。そこでソフトウェア的にやる方法。 CH32V003J4M6でneopixelを光らせる これはうまく動いていない。
結局、ch32v003funのextralibsに入っていた ws2812b_simple.h が動かせた。 ch32v003fun/extralibs/ws2812b_simple.h at master · cnlohr/ch32v003fun
USB
GitHub - cnlohr/rv003usb: CH32V003 RISC-V Pure Software USB Controller