CH32V003 シリーズをArduino IDE & macOSで使う

超安価でRISC-VなマイコンCH32V003シリーズをArduino IDEとmacOS(Apple Silicon)環境で使おうとしたところ、情報が少なく苦労したので手順をまとめておきます。

環境

  • macOS Tahoe
  • CH32V003
  • WCH-LinkE
  • Arduino IDE 2.3.10

要点

  • Arduino IDEでCH32をボードマネージャから追加する
  • そのままだとx86_64向けのopenocdが入るため、Apple Silicon(arm64)向けのopenocdをビルドして差し替える必要がある

手順

筆者はMacPortsを利用しているので、それを前提として記載しています。

Arduino IDEにCH32Vのボードマネージャーを導入する

  1. メニュー Arduino IDE -> Preferences を開き Additional boards manager URLs に以下のURLを入力

https://github.com/openwch/board_manager_files/raw/main/package_ch32v_index.json

  1. メニュー Tool -> Board -> Boards Managerを開き、検索に ch32 と入力し CH32 MCU EVT Boards をインストール

riscv-openocd-wchのビルド

オリジナルのriscv-openocd-wchはApple Silicon(arm64)ではビルドエラーになる上、リポジトリがアーカイブされているため修正版をforkしました。
https://github.com/ayumu-bekki/riscv-openocd-wch

# 依存パッケージの追加
sudo port install libtool automake autoconf pkgconfig libusb libusb-compat texinfo git

# riscv-openocd-wchのソース取得
git clone https://github.com/ayumu-bekki/riscv-openocd-wch
cd riscv-openocd-wch

# 環境変数の指定
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export PKG_CONFIG_PATH=/opt/local/lib/pkgconfig
export CPPFLAGS="-I/opt/local/include"
export LDFLAGS="-L/opt/local/lib"
export CFLAGS="-std=gnu11 -Wno-error=incompatible-function-pointer-types -Wno-incompatible-function-pointer-types -Wno-error=int-conversion -Wno-error=implicit-function-declaration"

# ビルド
./bootstrap
./configure --enable-wlinke \
  --disable-ch347 \
  --disable-linuxgpiod \
  --disable-werror

make -j

Arduino IDEへの組み込み

ボードマネージャ導入時に配置されたx86_64向けの openocdを、今回ビルドしたarm64向けのバイナリで上書きします。

cp src/openocd ~/Library/Arduino15/packages/WCH/tools/openocd/1.0.0/bin/openocd

プロジェクトでの利用方法

メニューから設定する方法

  1. Tools -> Board -> CH32 MCU EVT Boards -> CH32V00x を選択
  2. Tools -> Port -> /dev/cu.usbmodemXXXXXXXXXXXXX を選択

Select Other Board and Port で設定する方法

実際に動かしてみた

Lチカサンプル (ch32v003_led_blinker.ino)

// CH32V003 Lチカ
#define LED_PIN PD6 // 使用ピン

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(100);
  digitalWrite(LED_PIN, LOW);
  delay(100);
}

WCH-LinkEとCH32V003をVDD(3.3V) VSS(GND)と通信用のSWIO (SWDIO) を繋げば書き込みできます。 CH32V003J4M6/CH32V003F4P6にてLEDの点滅を確認できました。

CH32V003はとにかく安く、他の外付けパーツも不要でArduino言語が利用できるというのは魅力的です。 メモリサイズが小さい・浮動小数点演算のハードウェアサポートなし・Arduino言語のライブラリでは一部ハードウェアのサポートがないなど気を使う点はありますが、用途次第では活用できそうです。

この記事へのコメント