CH32V003 のファームウェアのビルド環境を整える

WCH の RISC-V の安価なマイコン、CH32V003 のファームウェアのビルド環境を整えて、ビルドをする所まで持ってきました。

いくつかCH32Vの利用法についてまとめている所を見つけて、主にそれに従って準備しました。

github.com

tl;dr

CH32V003 は RV32EC である

CH32V003 は拡張命令ポリシーが、CH32V203 の RV32IMAC と異なり、RV32EC です。"E" は組み込み向けにレジスタが少ない命令セットのようです。

msyksphinz.hatenablog.com

現状(2023/03/11)、LLVMも対応していません。

gcc をビルドする

https://github.com/riscv-collab/riscv-gnu-toolchainでは、RV32ECに対応した gcc に加え、gdb など各種ツールをビルドすることができます。

MountRiverStudio がコンパイル済みgccを無料で配布されていますので、そちらを使うのも手です。ただし、現状 ARM64 バイナリはないため、ARM64環境ならば自分でビルドする必要があります。

Ubuntu 22.04 でビルドしてみました。

# ビルドに必要なパッケージ
# https://github.com/riscv-collab/riscv-gnu-toolchain#prerequisites
sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev ninja-build

# git clone する(submoduleはチェックアウト"しない")
git clone https://github.com/riscv-collab/riscv-gnu-toolchain
cd riscv-gnu-toolchain

# ディレクトリ準備
sudo mkdir /opt/riscv
sudo chown nnyn:nnyn /opt/riscv
mkdir build
cd build

# RV32EC も入れる
../configure --prefix=/opt/riscv-gnu-toolchain --disable-linux --with-abi=ilp32 --with-abi=ilp32e --with-arch=rv32imac --with-arch=rv32ec

# ビルド
make

# インストール
make install

/opt/riscv-gnu-toolchain/bin にパスを通しておきます。

SDK 含むリポジトリを準備して、ビルドする

ch32vのSDKを含むリポジトリをセットアップしてくれるものが、https://github.com/cjacker/ch32v_evt_makefile_gcc_project_template にあります。

github.com

# テンプレート生成スクリプト
git clone https://github.com/cjacker/ch32v_evt_makefile_gcc_project_template
cd evt_makefile_gcc_project_template
./generate_project_from_evt.sh ch32v003f4p6

# 実際にコーディングを行うリポジトリにリソースを移動
mkdir ~/ghq/github.com/74th/try-ch32v003/
cp -rf CH32V_firmware_library Makefile User ~/ghq/github.com/74th/try-ch32v003/

Makefile のうち、ツールの接頭辞を示す PREFIX だけを書き換えます。

vi Makefile
#######################################
# binaries
#######################################
# PREFIX = riscv-none-embed-
PREFIX = riscv32-unknown-elf-
# ビルド
make

ビルドが環境すると build/ch32v003f4p6.bin にバイナリができます。

このテンプレートは最初は D0 でLチカをするためのプログラムになっています。

マイコンに書き込む

書き込むには、ハードウェアは WCH-LinkE、ソフトウェアは wlink を使います。

Ch32v003f4p6 qingke RISC-V2A 1線式シディシステムメイン周波数48mhz、1個/キット
https://ja.aliexpress.com/item/1005004895791296.html?spm=a2g0o.order_list.order_list_main.110.58e2585a8hzEfl&gatewayAdapt=glo2jpn

wlink はRust製の、WCH-Link用CLIツールです。wchisp が CH32V203 などにある USB書き込み機能のためのツールのため、USB機能のない CH32V003 ではUSB経由、及び wchisp では書き込むことができません。

github.com

wlink をインストールします。

cargo install --git https://github.com/ch32-rs/wlink.git

CH32V003 の D1 と WCH-LinkE のSWDIOをつなぎ、書き込みを実行します。(wlinkは現状 binary 形式しかサポートされていません。

wlink build/ch32v003f4p6.bin

チップ名は自動で判別するため、特に入力は必要ありません。

ついでの確認

データシートの通り、クリスタルレス、5Vでも動作することを確認できました。写真の自作ボードはVCCと5Vをつなぐジャンパを用意しておいて、USBの5Vを直接流せるようにしてあります(自作ボードの記事は別途作る予定です)。

終わりに

CH32V003 を100個購入し、これで開発環境が整ったため、CH32V003 を使っていこうと思います。

現状専用ライタ WCH-LinkE が必要ですが、プロトコルが公開されたたり、ARM CH32F103 を使ったデバッグ方法があるようなので、入手性の高い代替ツールがそのうち出てこないか期待します。

github.com