CH32V003 の開発に ch32v003fun を使う

より詳細な記事を書き直しました。

74th.hateblo.jp

tl;dr

  • CH32V003 は秋月で40円から買える、安い割に機能が多く、必要な部品も少ないMCUだよ
  • ch32v003fun はコミュニティベースの開発ライブラリおよび開発環境だよ。環境構築も簡単だよ。
  • ch32v003fun は開発ライブラリといっても、基本的にはMCUレジスタを操作しよう!というライブラリのため、リファレンスマニュアルからレジスタに何を与えるべきかを読み込んで使うものだよ。
  • なによりサンプルコードが次々とコミットされていて、充実しているよ

CH32V003 とは

秋月で CH32V003 の取り扱いが始まりました。なんと40円から買うことができます。

akizukidenshi.com

akizukidenshi.com

CH32V003 は RISC-V のCPUをもち、安価なMCUのわりに、ADC、Timer、DMA、I2C、SPI などの機能をしっかり持っています。

しかも、クリスタルレスで動かすことができ、さらに 3.3V だけでなく、 5V でも動作できます。 VCCに1uFくらいのコンデンサを入れておけば動作しそうです。

ただし、書き込みには専用のツール WCH-LinkE が必要です。

akizukidenshi.com

CH32V003 の開発環境と、ch32v003fun とは

CH32V003 はMCU提供元のWCHが Arduino をサポートを開始しましたが、2023/06/25現在、使える機能はまだ少ないです。 さらに通常開発にはSTM32CubeIDEのようなMountRiverStudioというプロプラツール(無償版もある)で提供されていますが、Windows にしか対応していません(LinuxMacOSはツールのみ)。 これでは開発がしにくいです。

そんな中、ch32v003 のコミュニティベースのCライブラリ ch32v003fun があります。 抽象レイヤを提供するというよりも、ch32v003のための処理効率が高く開発できるライブラリを提供しようとしています。 レジスタを直接操作するのが基本です。レジスタマップの構造体が提供されるのみです。 公式のライブラリは規模が大きく開発環境構築も必要になりますが、それに比べて、ch32v003fun はMCUを理解して、小さな試作をさくっとできるように提供しているように見えます。

ch32v003fun はライブラリだけではなく、開発環境がサクッとできるように、アップロードツール minichlink も提供しています。 このツールだけでもわりと役に立ちます。

github.com

ch32v003fun の環境構築

必要なツールは、Linuxパッケージマネージャでインストールできるツールや、Mac の Homebrew など、特別な準備なしに構築できるようになっています。

github.com

私は Orange Pi 5+ という SBC 上の Ubuntu 22.04 で開発していますが、以下のコマンドを入れるだけでした。

apt-get install build-essential libnewlib-dev gcc-riscv64-unknown-elf libusb-1.0-0-dev libudev-dev

あと、make、clangなども必要だったりします。

開発プロジェクトを作るのも、example/template のディレクトリをコピーして、Makefile に ch32v003fun のパスを追加するだけです。私は submodule として ch32v003fun を追加したため、以下のようにCH32V003FUN、MINICHLINKのパス Makefile に追加浸ました。

# プロジェクトを作るためのコマンド
mkdir test-ch32v003fun
cd test-ch32v003fun
git init
git submodule add https://github.com/cnlohr/ch32v003fun.git ch32v003fun
cp -rf ch32v003fun/examples/template/* ./
cp -rf ch32v003fun/examples/template/.* ./
mv template.c test.c
# Makefile
all : flash

# template.c を書き換えた名前を入れる
TARGET:=test

# ch32v003fun のパスを指定する
CH32V003FUN=./ch32v003fun/ch32v003fun
MINICHLINK=./ch32v003fun/minichlink

include ./ch32v003fun/ch32v003fun/ch32v003fun.mk
flash : cv_flash
clean : cv_clean

ここには .vscode ディレクトリもあり、VS Code のタスクやデバッグの設定が作り込まれています。

ビルドして書き込む

以下のコマンドを実行すると、プログラムをビルドし、さらに WCH-LinkE での書き込みをも行います。裏ではアップロードツールのminichlink もビルドされるようになっています。

make all

なお、WCH-LinkE との接続は以下のようにします。

  • SWDIO: D1(F4P6: 18ピン、J4M6: 8ピン)
  • 3V3: VDD(F4P6: 9ピン、J4M6: 4ピン)
  • GND: GND(G4P6: 7ピン、J4M6: 2ピン)

template.c はD0、D4、C0のLチカになっています。

サンプルコードが豊富

ch32v003fun のコードを追っていますが、多くのMCUの機能のサンプルコードが追加されています。ADC、Timer、I2Cのスレーブなど、多くのコードがあります。開発元のEVTと呼ばれるライブラリにもサンプルコードは多いですが、こちらも日々増えています。

github.com

このようなサンプルコードがあるのが非常にありがたく、助かります。

ch32v003fun ベースで開発したくなりました

開発環境構築が簡単で、サンプルコードが多く、ライブラリも薄くFlashを圧迫しない ch32v003fun を開発に使ってみたいと思います!!

なお、私は CH32V003 を使いこなしたく、ProMicroサイズ、互換ピン配置の開発ボードを作りました。Boothにて販売中です。

74th.booth.pm

この製作については過去に記事にしています。

74th.hateblo.jp

おまけ:WCH-LinkE の代わりになるもの

どうしても CH32V003 は専用のアップロードツールが必要です。 しかし、WCHはこのデバッグプロトコルを公開してくれており、またコミュニティベースで解析が進んでいます。

github.com

まだ WCH-LinkE 以外のツールが動くところを私は確認できていませんが、以下のツールが公開されています。

ラズピコで動くならばと PicoRVD を試してみましたが、私の所では動きませんでした。

一方私は WCH-LinkE のソースコードは公開されていませんが、回路図とファームウェアバイナリは公開されているので、それを使って公式のWCH-LinkEと同じ CH32V305 を使って、WCH-LinkEクローンを作りました。Lチカの写真右側にあるのがそれです。これについてはまた記事にしようと思います。