概要
去年に販売されたのですが、当初は中国国内向けで海外には発送してくれなかった開発ボードをついに入手しました。
製品
![](https://ae01.alicdn.com/kf/Sd6edc2d0dcc543d0b7eea25b0a874f83b/CH32V103-development-board-on-board-WCH-Link-debugger-CH32V103R8T6-Microcontroller-Evaluation-Boards.jpg)
上記の製品になります。AliExpressにはWCHオフィシャルストアもありますが、このショップのほうが送料などが安いことがあります。
![](https://lang-ship.com/blog/wp-content/uploads/2023/12/image-24.png)
こんな感じの開発ボードとなります。この開発ボードは書き込み機が必要なのですがなんと上部にWCH-Linkが内蔵しており、このボードだけで開発が可能です。下の方をみるとArduino互換のピンソケットもあります。画期的で使いやすそうなレイアウトですね。
![](https://lang-ship.com/blog/wp-content/uploads/2023/12/image-25.png)
裏側はなにもないですね。
![](https://www.wch-ic.com/assets/site/img/logo.png)
英語の資料は上記にあります。ただし開発ボードの資料は英語版にはないはずです。
中国語版のページからダウンロード可能です。
GitHubにもアップされていたので、こちらのページの方がいいのかもしれません。
Arduino IDEでの開発
上記にて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を一度実行してみてください。
![](https://www.wch-ic.com/assets/site/img/logo.png)
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://lang-ship.com/blog/wp-content/uploads/2023/12/image-26.png)
3の場所にLEDが2つあるのがわかります。
![](https://lang-ship.com/blog/wp-content/uploads/2023/12/image-27.png)
説明文を読みます。J3でコントロールできる?
![](https://lang-ship.com/blog/wp-content/uploads/2023/12/image-28.png)
左側のピンヘッダがJ3のようです。なんとなく中程にLEDの文字が見えますが、これだけだとよくわかりません。
データシートからLEDのピンを探す
https://github.com/openwch/ch32v103/blob/main/EVT/PUB/CH32V103SCH.pdf
上記の2ページ目がWCH Linkがあるので、今回の開発ボードだと思います。
![](https://lang-ship.com/blog/wp-content/uploads/2023/12/image-29.png)
おそらくこちらです。
![](https://lang-ship.com/blog/wp-content/uploads/2023/12/image-31.png)
真ん中上にLEDがありました。配線的には3.3Vに繋がっているのでLOWにすると光る感じですね。
![](https://lang-ship.com/blog/wp-content/uploads/2023/12/image-32.png)
J3を見てみます。このピンヘッダは左右が繋がっていないので、LED1とLED2は未接続です。どこでも好きな場所に自分で接続して使うタイプですね。
![](https://lang-ship.com/blog/wp-content/uploads/2023/12/image-33.png)
とりあえず、近くにあった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だとほぼ同じ形でかけて便利ですね。
![](https://lang-ship.com/blog/wp-content/uploads/2023/12/image-34.png)
意図したとおりに動いています。
PlatformIOでの開発
Arduino IDEで開発できたので次はPlatformIOで開発してみたいと思います。
ボードマネージャーを確認
なんとWCH社のボードはありません。
PlatformIO用プラットフォーム
ドイツの方がPlatformIOのプラットフォームを整備してくれています。PlatformIOは標準以外にもボードマネージャーを追加できるのですね。
![](https://lang-ship.com/blog/wp-content/uploads/2023/12/image-35.png)
上記から追加可能です。
https://github.com/Community-PIO-CH32V/platform-ch32v.git
上記にリポジトリを指定します。このままだとボードが追加されなかったのでPlatformIOを再起動します。
![](https://lang-ship.com/blog/wp-content/uploads/2023/12/image-36.png)
増えました。ただ4種類ありますね。
![](https://lang-ship.com/blog/wp-content/uploads/2023/12/image-37.png)
CH32V103R8T6が使われていました。
![](https://lang-ship.com/blog/wp-content/uploads/2023/12/image-38.png)
フレームワークが複数ありますね。そしてArduinoはありません。現状CH32V003のみArduino対応があるようでした。今後増えそうな気もします。
![](https://lang-ship.com/blog/wp-content/uploads/2023/12/image-39.png)
srcにはmain.cppもありません。雛形無しなので結構ハードモードですね。
サンプルを探す
上記に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で触ってみたいと思います。
コメント