guiメモ

技術寄りの雑記(予定)

CH32マイコンの環境構築からHello worldまで

概要

中国製マイコンの一つであるCH32マイコンに入門してみました。CH32マイコンの最初の一歩として評価ボードを用いてシリアルでHello worldするまでのメモを残します。筆者の環境では特に躓く工程が無く、ファーストインプレッションとしては扱いやすいマイコンという感じです。

はじめに

様々な部品屋からSTM32マイコンを始めとした各種マイコンの在庫が消えたり値段が跳ね上がったりと、マイコンを扱うホビイストにとって厳しい状況が続いています。そんな状況下において安価でそこそこの性能を有する中国製マイコンに白羽の矢が立つのはある意味自然な流れではないでしょうか。
そんな中国製マイコンの一つにCH32シリーズがあります。このシリーズにはArmコアを積んだCH32FシリーズとRISC-Vコアを積んだCH32Vシリーズがあり、型番が瓜二つのSTM32マイコンと比べてクロック周波数が高いことや何しろ安価であることが魅力的なマイコンになっています。
そこで、今回はCH32Vシリーズの現状で一番強いCH32V307の評価ボードを入手して入門することにしました。CH32V307には何とUSB HS PHYが搭載しており、少しレベルの高い電子工作ができる気がしています。

評価ボードの入手と下準備

CH32V307の評価ボードには幾つか種類があり、今回は下の写真に示すような外部にWCH-Linkを取り付けるタイプを選びました。理由はNucleoライクな評価ボードと比べて安価であったことと、WCH-Linkが別個で入手できると自作基板に組み込んだ時に使い勝手が良いと考えたためです。

購入したCH32V307評価ボードセット (左: WCH-Link、右: 評価ボード本体)

Hello worldをする分には特にはんだ付け等の準備は不要ですが、オンボードLEDを用いてLチカする場合やUSBコネクタを利用する場合は簡単なはんだ付けが必要になります。これは、Nucleoボードと異なりオンボードLEDはマイコンの特定のピンに接続されていないためピンヘッダ等が必要になり、またUSB-CコネクタのCCピンのプルダウン抵抗がデフォルトで付いていないためです。回路図はgithubにて公開されています。

ピンヘッダを取り付けた後の評価ボード

評価ボードの裏面に5.1 kΩの1608Mチップ抵抗を取り付ける(R8, 9, 20, 22)

ピンヘッダとチップ抵抗を取り付けたら評価ボードの下準備は完了です。

環境構築

CH32マイコンにはMounRiver Studioと呼ばれるEclipseベースの開発環境が用意されています。特に会員登録等せずにインストールすることができます。STM32をSystem Workbench for STM32(SW4STM32)で開発したことがある方なら操作感が近いのですぐに慣れると思います。

テストプログラムの実行

MounRiver Studioを開き、File→New→MounRiver Projectを選択します。

プロジェクトの新規作成

するとマイコンを選ぶ画面が出てくるので、評価ボードに搭載されているCH32V307VCT6を選びます。また、プロジェクト名を適当な名前に設定します。ここではHello worldにしています。

使用するマイコンの型番を選択し、プロジェクト名を設定する

Finishを押すとプロジェクトが作成されます。作成したプロジェクトのUserフォルダにmain.cが配置されています。

プロジェクト作成後の画面 (main.cの内容を表示)

特にプログラムを改変せずにBuildします。Project→Build Projectを選択します。

Build

PCにWCH-Linkを、WCH-Linkに評価ボードをそれぞれ接続します。筆者の環境ではPCにWCH-Linkを接続する際にUSB3.0の端子に接続するとうまく認識しないことがあったため、USB2.0の端子に接続することをお勧めします。接続後に評価ボードの左下のUSBコネクタ付近にあるPWR LEDが点灯したら準備は完了です。Run→Runを選択すると評価ボード上のマイコンにプログラムが書き込まれます。

プログラムの実行

TeraTerm等のターミナルソフトでWCH-Linkのシリアルポートを開き、評価ボード右上にあるRESETボタンを押すと文字列が表示されます。ボーレートはmain.cの記述から察せる通り115200です。

ターミナルソフト上の表示

サンプルプログラムの動作確認ができたので、プログラムの簡単な改変に移ります。main.cのmain関数を以下のように書き換えます。

int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);

    while(1)
    {
        Delay_Ms(1000);
        printf("Hello, world!\r\n");
    }
}

Delay_Ms関数で1秒間待ち、文字列Hello, world!を送りつけるプログラムになっています。先と同様の手順でBuildし、マイコンに書き込んで1秒毎にHello, world!が表示されたら成功です。

コンニチハ

まとめ

本稿ではCH32マイコンによりHello worldするまでの簡単な流れについて示しました。開発環境の構築は想像していたよりもずっと簡単で、STM32を触ったことがある人なら似た感触で開発できると思います。ただしライブラリなどの情報が少ないため、しばらくは手探り状態で開発することになりそうです。今後は簡単な処理はRP2040、少し込み入った処理はCH32、CH32でもキツい場合はSTM32のようなマイコンの使い分けをしようと考えています。