CH32V203覚え書き
CH32V003 に続いて CH32V203 のメモ
概要
STM32F103 とピン互換な RISC-V マイコンといえば大体あってる感じです。 元々 WCH は CH32F シリーズの STM32 互換マイコンを出していたのですが、これの CPU を RISC-V に変えたものになります。 さらに USB ホスト機能があるので、ほかの USB 機器を接続することもできます。
良いところ
- 安い
秋月電子で LQFP32 版が 120 円、 Aliexpress で 20個 2500円前後と USB が使えるマイコンとしては激安です。 USB を抜きにしても、フラッシュ 64KiB の 32bit マイコンとしても激安の部類になるかと思います。
- 速い
STM32F103 が 72MHz なのに対して、最大 144MHz で動作します
- USB が使える
USB FS/OTG と 2 系統の USB があるので、USB 変換器などを作ることも可能です。 また、内部クロックで充分な精度の 48MHz を生成できるので、外部クロックを接続する必要はありません。
悪いところ
- 一部 STM32 と互換性のないところがある
USB ホスト機能を持つ STM32 は存在しますが、CH32V203 の USB ホスト機能は、CH552 由来と思われ STM32 と互換性がありません。
- ピン配置が複雑
小ピン版は品番によって省略されているピンが違うので、単純に下位互換というわけではありません。 (特に boot0/1 あたりが… ) 困ったことに F6 と F8 でピン配置が違います。 LQFP48 の扱いに抵抗がなければ、48ピン版を使うことをお勧めします。 これなら STM32 と同じピン配置です。
CH32V003 と違って専用書き込み機がなくても USB 経由でフラッシュに書き込みが可能ですので、 こちらの方が使いやすいかもしれません。 LQFP32版なら手はんだも可能な範囲かと思います。
品薄な STM32 マイコンの代わりに十分使えるものと思います。 もちろん ATMega328p とかの 8ビットマイコンの代わりに使っちゃっても安いから問題ないかと思います。
世間的には CH32V003 の方が話題ですけど、個人的には実用度の上で CH32V203 の方が好きですね。
入手
秋月電子で LQFP32 版のみ扱っています。 LQFP48 版などが必要なら送料無料なので WCH 公式から買うのがお勧めです。 CH32V003 の開発キットを買うとき CH32V203 の開発キットがセットになっている物を頼むのも良いかと思います。(開発キットに LQFP48 版が5個がついてきます)
開発環境
ch32v003fun が正式には対応していない以外は、CH32V003 とほぼ同じです。 公式 SDK を使う場合、CH32V203 なら FreeRTOS などの RTOS を使うことも可能です。 自分は MounRiverStudio で公式 SDK を使っています。
- WCH公式SDK
公式 IDE の MounRiverStudio や Platform IO で使える、公式ライブラリです。 PlatformIO 用はコミュニティ製パッケージを使います。 STM32 の Standard Peripheral Library とよく似ています。
- Arduino
CH32V003 と違って、WCH 公式 Arduino Core for CH32V が唯一の解となります。 公式 SDK を Arduino で包んだものになります。 ただし、フットプリントが大きいので、凝ったことに使うには向かないかもしれないです。 なお STM32 の Arduino と同じレベルの完成度を期待してはいけません。
Tips
- 浮動小数点
CH32V003 と同じく、CH32V203 に乗っている RISC-V コア(RV32IMAC) にも浮動小数点演算はついていません。 CH32V203 ならフラッシュ容量的には余裕があるかと思いますが、浮動小数点ライブラリで容量が使われることに注意しましょう。 また、標準で使用する printf ライブラリは浮動小数点を無視するようになっています。 必要であれば、浮動小数点付きの printf を使うようにリンカーの設定を変える必要があります。 これもまた容量を占拠する原因になります。
- USB について
公式 SDK の USB ライブラリの完成度が低いので使いにくいかと思います。 USB-FS 側は STM32 と同じハードウェア構成なのでまだマシなのですが、 USB OTG(ホスト対応)側は、SDK のサンプルプログラムを丸パクリすることになるかと思います。 TinyUSBが OTG 側のデバイスのみサポートしています。
- SystemCoreClock
開発環境によって、内部クロックだったり外部クロックだったりデフォルト値が異なります。
system_ch32v203.c
で適切なクロックの設定を行う必要があります。
- 最適化
MounRiverStudio デフォルト設定は -Os
(サイズ最適化)になっています。
フラッシュの容量に余裕がある場合は -O2
などにすると動作が速くなる場合があります。
- 隠しフラッシュ
公式には 64KB しかフラッシュは積んでいないように見えますが、 実際には 224KB 積まれています。 64KB はノーウエイトでアクセスできますが、 残りの 160KB へのアクセスはかなり遅くなります。
たまにしかアクセスしないデータを置く用途にしか使えないと思った方がよいです。
作例
- BeepMidi USB-OTG を USB デバイスとして使う例
- JR-100 エミュレータ
- BasicMaster Jr. エミュレータ USB-OTG を USB ホストとして使う例
- TK-80BS エミュレータ おなじく USB-OTG を USB ホストとして使う例
- TOTP キーボード USB-FS と RTC の実装例