WCH社のRISC-Vチップ CH32V103開発ボード

概要

去年に販売されたのですが、当初は中国国内向けで海外には発送してくれなかった開発ボードをついに入手しました。

製品

Ch32v103 Development Board Integrated Link Debug Downloader - Integrated Circuits - AliExpress
Smarter Shopping, Better Living! Aliexpress.com

上記の製品になります。AliExpressにはWCHオフィシャルストアもありますが、このショップのほうが送料などが安いことがあります。

こんな感じの開発ボードとなります。この開発ボードは書き込み機が必要なのですがなんと上部にWCH-Linkが内蔵しており、このボードだけで開発が可能です。下の方をみるとArduino互換のピンソケットもあります。画期的で使いやすそうなレイアウトですね。

裏側はなにもないですね。

32-bit General Enhanced RISC-V MCU – CH32V103 - NanjingQinhengMicroelectronics
The CH32V103 is a general purpose microcontroller based on the 32-bit RISC processor RISC-V3A. The CH32V103 provides clo...

英語の資料は上記にあります。ただし開発ボードの資料は英語版にはないはずです。

产品中心 - 南京沁恒微电子股份有限公司

中国語版のページからダウンロード可能です。

GitHub - openwch/ch32v103
Contribute to openwch/ch32v103 development by creating an account on GitHub.

GitHubにもアップされていたので、こちらのページの方がいいのかもしれません。

Arduino IDEでの開発

GitHub - openwch/arduino_core_ch32: Core library for CH32duino
Core library for CH32duino. Contribute to openwch/arduino_core_ch32 development by creating an account on GitHub.

上記にてArduinoライブラリの保守が行われています。

ボードマネージャーのURL追加

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

上記のURLをArduino IDEに登録します。

ボード追加

ボードマネージャーよりCH32で検索して「CH32 MCU ENV Boards」を登録します。

接続確認

接続してシリアル認識したらそのままでたぶん大丈夫です。認識しなかったり、転送に失敗する場合にはWCH-LinkUtilityを一度実行してみてください。

WCH-Link Emulation Debugger Module - NanjingQinhengMicroelectronics
WCH-Link module can be used for online debugging and downloading of WCH RISC-V MCU, and also for online debugging and do...

Windowsのみですが、上記からダウンロードできます。初回実行時に各種ドライバーも一緒にインストールされるようです。

宣言からLEDのピンを探す

// https://github.com/openwch/arduino_core_ch32/blob/main/variants/CH32V10x/CH32V103R8T6/variant_CH32V103R8T6.h

// On-board LED pin number
#ifndef LED_BUILTIN
  #define LED_BUILTIN           PNUM_NOT_DEFINED
#endif

LED_BUILTINを使おうとしたらエラーにはなりませんが光りませんでした。宣言をみたらPNUM_NOT_DEFINEDと書いてあります。

// https://github.com/openwch/arduino_core_ch32/blob/main/cores/arduino/pins_arduino.h

/* Pin not defined */
#define PNUM_NOT_DEFINED            NUM_DIGITAL_PINS

PNUM_NOT_DEFINEDはNUM_DIGITAL_PINSと定義されています。

// https://github.com/openwch/arduino_core_ch32/blob/main/variants/CH32V10x/CH32V103R8T6/variant_CH32V103R8T6.h

#define NUM_DIGITAL_PINS        22

NUM_DIGITAL_PINSはピンの数を表しています。つまり0から21まであるので22を指定すると範囲外のため動きません。ESP32だと未定義でエラーになることが多いのですがSTM32とかだと無効なGPIOを指定しているようでした。

開発ボードのマニュアルから探す

https://github.com/openwch/ch32v103/blob/main/EVT/PUB/CH32V103%20Evaluation%20Board%20Reference-EN.pdf

上記がマニュアルになります。

3の場所にLEDが2つあるのがわかります。

説明文を読みます。J3でコントロールできる?

左側のピンヘッダがJ3のようです。なんとなく中程にLEDの文字が見えますが、これだけだとよくわかりません。

データシートからLEDのピンを探す

https://github.com/openwch/ch32v103/blob/main/EVT/PUB/CH32V103SCH.pdf

上記の2ページ目がWCH Linkがあるので、今回の開発ボードだと思います。

おそらくこちらです。

真ん中上にLEDがありました。配線的には3.3Vに繋がっているのでLOWにすると光る感じですね。

J3を見てみます。このピンヘッダは左右が繋がっていないので、LED1とLED2は未接続です。どこでも好きな場所に自分で接続して使うタイプですね。

とりあえず、近くにあったPA0とPA1に接続しました。本当はPA0はArduinoだとA0にアサインされています。D0はPA10ですが反対側で遠いので近いところに接続しました。回路図には書いてありますが、ボードにはArduinoのピン番号が書いていないのでちょっとわかりにくいですね。

コードを書いてみる

#define LED1_PIN PA0
#define LED2_PIN PA1

void setup() {
  Serial.begin(115200);
  pinMode(LED1_PIN, OUTPUT);
  pinMode(LED2_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED1_PIN, HIGH);
  digitalWrite(LED2_PIN, LOW);
  Serial.println("HIGH, LOW");
  delay(1000);
  digitalWrite(LED1_PIN, LOW);
  digitalWrite(LED2_PIN, HIGH);
  Serial.println("LOW, HIGH");
  delay(1000);
}

こんな感じのコードになりました。Arduinoだとほぼ同じ形でかけて便利ですね。

意図したとおりに動いています。

PlatformIOでの開発

Arduino IDEで開発できたので次はPlatformIOで開発してみたいと思います。

ボードマネージャーを確認

なんとWCH社のボードはありません。

PlatformIO用プラットフォーム

GitHub - Community-PIO-CH32V/platform-ch32v: PlatformIO platform for CH32V RISC-V chips (CH32V003, CH32V103, CH32V20x, CH32V30x, CH32X035) and CH56x, CH57x, CH58x, CH59x
PlatformIO platform for CH32V RISC-V chips (CH32V003, CH32V103, CH32V20x, CH32V30x, CH32X035) and CH56x, CH57x, CH58x, C...

ドイツの方がPlatformIOのプラットフォームを整備してくれています。PlatformIOは標準以外にもボードマネージャーを追加できるのですね。

上記から追加可能です。

https://github.com/Community-PIO-CH32V/platform-ch32v.git

上記にリポジトリを指定します。このままだとボードが追加されなかったのでPlatformIOを再起動します。

増えました。ただ4種類ありますね。

CH32V103R8T6が使われていました。

フレームワークが複数ありますね。そしてArduinoはありません。現状CH32V003のみArduino対応があるようでした。今後増えそうな気もします。

srcにはmain.cppもありません。雛形無しなので結構ハードモードですね。

サンプルを探す

ch32v103/EVT/EXAM/GPIO/GPIO_Toggle/User/main.c at main · openwch/ch32v103
Contribute to openwch/ch32v103 development by creating an account on GitHub.

上記にGPIOのサンプルがありましたので、これをベースに作ってみたいと思います。まずはコピーしてコンパイルでエラーになる場所をすべて消します。

作成物

#include "debug.h"

void GPIO_Toggle_INIT(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

int main(void)
{
    u8 i = 0;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    SystemCoreClockUpdate();
    Delay_Init();
    USART_Printf_Init(115200);
    printf("GPIO Toggle TEST\r\n");
    GPIO_Toggle_INIT();

    while (1)
    {
        Delay_Ms(1000);
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));
        printf("GPIO Toggle %d\r\n", i);
    }
}

たまたまPA0でBlinkしているサンプルだったので、ピン番号は変更しなくてすみました。詳細はよくわからないですが、とりあえずDelayを250から1000に伸ばして、printfを追加しています。

[env:genericCH32V103R8T6]
platform = ch32v
board = genericCH32V103R8T6
framework = noneos-sdk
monitor_speed = 115200

platformio.iniは上記で、最後にシリアルの速度を指定しています。デフォルトがたぶん9600ぐらいなので115200とかに変更するのが定番ですね。

まとめ

PlatformIOでプログラムをするのはハードウエアをしっかりと把握しないと難しそうですね。本当はMounRiverというEclipseベースの公式開発環境があります。実は公開直後に触っていた気がするのですが、パスしていました。

とりあえずはArduinoで触ってみたいと思います。

コメント