巷でRISC-Vコアを採用したch32v003が話題になっています。そこで、Raspberry Pi 3に開発環境をインストールして、ch32v003でLチカを実行してみました。

開発環境として、3つほど選択技(公式SDK、Arduino、ch32v003fun)がありますが、ここではch32v003funを採用しました。
書き込みには、ハードウェアとしてWCH-LinkEを使用します。ch32v003書き込みには、末尾E付きのものが必要です。
ソフトウェアとして、ch32v003funに付属のminichlinkを使用します。

まずはWCH-LinkEの設定から始めます。
WCH-LinkEのUSBをRaspberryPi3に接続するとLEDが点灯します。
このとき、赤のLEDのみ点灯する場合は、RISC-V対応になっています。
赤と青のLEDが点灯している場合は、ARM対応になっているので、切り替えの設定をする必要があります。
Windowsでの切り替えは下記URLを参考にしてください。

@nanbuwks様のWCH-LinkEを初期化する。
WCH-LinkEが認識しない場合、ダウンロードしたWCH-LinkUtilityのDrv_Link/WCHLinkDrv_WHQL_Sを実行すればドライバーがインストールされるようです。

 CH32V003 開発ボード 評価ボード セットの中のWCH-LinkEはすでにRISC-V対応に切り替わっているものもあるようです。

続いて、RaspberryPi3に開発環境をインストールします。

こちらのch32v003funのインストール手順を参考にしています。

まずは、環境をupdateした後、gcc-riscv64等必要な開発環境、ライブラリーをインストールします。

~$ sudo apt-get update
~$ sudo apt-get install build-essential libnewlib-dev gcc-riscv64-unknown-elf libusb-1.0-0-dev libudev-dev gdb-multiarch

ユーザー直下のディレクトリーに移動して、gitで取得したch32fun-gitを展開します。

~$ cd ~
~$ git clone https://github.com/cnlohr/ch32fun.git
Cloning into 'ch32fun'...
remote: Enumerating objects: 9263, done.
remote: Counting objects: 100% (1767/1767), done.
remote: Compressing objects: 100% (420/420), done.
remote: Total 9263 (delta 1524), reused 1359 (delta 1347), pack-reused 7496 (from 2)
Receiving objects: 100% (9263/9263), 9.50 MiB | 4.40 MiB/s, done.
Resolving deltas: 100% (5922/5922), done.

展開したch32fuに移動します。

~$ cd ch32fun
~/ch32fun $ ls
LICENSE        $ cd ch32fun        examples_v20x  extralibs     platformio.ini
README.md      examples_ch5xx  examples_v30x  minichlink
build_scripts  examples_usb    examples_x00x  misc
ch32fun        examples_v10x   examples_x035  package.jso

実行サンプルのexamplesディレクトリーや書き込みに必要な minichlink、インクルードファイルやmakeに必要なch32fun.mkがお収められているch32funディレクトリーがあります。

次に、 minichlinkをコンパイルし、実行ファイルを生成します。
minichlinkディレクトリーに移動し、makeを実行します。

~/ch32fun $ cd minichlin
~/ch32fun/minichlink $ ls
99-minichlink.rules  cmdserver.h     libusb.h        pgm-esp32s2-ch32xx.c
Makefile             default.nix     microgdbstub.h  pgm-wch-isp.c
README.md            flake.lock      minichgdb.c     pgm-wch-linke.c
ardulink.c           flake.nix       minichlink.c    serial_dev.c
ch5xx.c              funconfig.h     minichlink.exe  serial_dev.h
ch5xx.h              hidapi.c        minichlink.h    terminalhelp.h
chips.c              hidapi.h        nhc-link042.c   winbuild.bat
chips.h              libusb-1.0.dll  pgm-b003fun.c

~/ch32fun/minichlink $ make
gcc -o minichlink minichlink.c pgm-wch-linke.c pgm-wch-isp.c pgm-esp32s2-ch32xx.c nhc-link042.c ardulink.c serial_dev.c pgm-b003fun.c minichgdb.c chips.c ch5xx.c -lpthread -lusb-1.0 -ludev -O0 -g3 -Wall -Wno-unused-function -DCH32V003 -I. -DMINICHLINK 
gcc -o minichlink.so minichlink.c pgm-wch-linke.c pgm-wch-isp.c pgm-esp32s2-ch32xx.c nhc-link042.c ardulink.c serial_dev.c pgm-b003fun.c minichgdb.c chips.c ch5xx.c -lpthread -lusb-1.0 -ludev -O0 -g3 -Wall -Wno-unused-function -DCH32V003 -I. -DMINICHLINK  -shared -fPIC

~/ch32fun/minichlink $ ls
99-minichlink.rules  default.nix     minichgdb.c           pgm-wch-isp.c
Makefile             flake.lock      minichlink            pgm-wch-linke.c
README.md            flake.nix       minichlink.c          serial_dev.c
ardulink.c           funconfig.h     minichlink.exe        serial_dev.h
ch5xx.c              hidapi.c        minichlink.h          terminalhelp.h
ch5xx.h              hidapi.h        minichlink.so         winbuild.bat
chips.c              libusb-1.0.dll  nhc-link042.c
chips.h              libusb.h        pgm-b003fun.c
cmdserver.h          microgdbstub.h  pgm-esp32s2-ch32xx.c

minichlinkとminichlink.soが生成されました。
minichlinkを実行できるように、/use/local/binにコピーします。

~/ch32fun/minichlink $ sudo cp minichlink /usr/local/bin

一般ユーサーがminichlinkを利用できるように、udevに登録します。
まずは既存のルールファイルの確認をします。

$ ls /etc/udev/rules.d
99-com.rules

minichlinkデレクトリー内のルールファイルは、99-minichlink.rulesとなっており、既存の99-com.rlesと重なるので80に変更した80-minichlink.rulesとしました。
なおファイルの命名ルールは
80- :は実行される順番、若い番号が先に実行される。同じ番号にならないようにした
.rules :はルール定義ファイル
最後にルールファイルを更新します。

~/ch32fun/minichlink $ sudo cp 99-minichlink.rules /etc/udev/rules.d/80-minichlink.rules
~/ch32fun/minichlink $ ls /etc/udev/rules.d
80-minichlink.rules  99-com.rules

~/ch32fun/minichlink $ sudo udevadm control --reload-rules && sudo udevadm trigger

ここまでで、開発環境が構築できました。

examplesディレクトリー内にあるBlinkディレクトリーにあるblink.cを実行してみます。
blink.cで定義されている端子にLEDを接続しました回路図は下記とおりです。
実行にあたり、デバイスとしてCH32V003F4P6 20pinタイプのものにPD4(1pin)、PD0(8pin)にLEDを接続しました。

examplesディレクトリー内にあるBlinkディレクトリーに移動します。makeを実行します。
このとき、makeではデバイスへの書き込みも合わせて実行されるので、Raspberry Pi のUSBにWCH-LinkE
を接続する必要があります。

~/ch32fun/examples/blink $ make
riscv64-unknown-elf-gcc -E -P -x c -DTARGET_MCU=CH32V003 -DMCU_PACKAGE=1 -DTARGET_MCU_LD=0 -DTARGET_MCU_MEMORY_SPLIT= ../../ch32fun//ch32fun.ld > ../../ch32fun//generated__.ld
riscv64-unknown-elf-gcc -o blink.elf ../../ch32fun//ch32fun.c blink.c   -g -Os -flto -ffunction-sections -fdata-sections -fmessage-length=0 -msmall-data-limit=8 -march=rv32ec -mabi=ilp32e -DCH32V003 -static-libgcc -I/usr/include/newlib -I../../ch32fun//../extralibs -I../../ch32fun/ -nostdlib -I. -Wall  -Wl,--print-memory-usage -Wl,-Map=blink.map -L../../ch32fun//../misc -lgcc -lgcc -T ../../ch32fun//generated__.ld -Wl,--gc-sections
Memory region         Used Size  Region Size  %age Used
           FLASH:         708 B        16 KB      4.32%
             RAM:          0 GB         2 KB      0.00%
riscv64-unknown-elf-objdump -S blink.elf > blink.lst
riscv64-unknown-elf-objcopy  -O binary blink.elf blink.bin
riscv64-unknown-elf-objcopy -O ihex blink.elf blink.hex
make -C ../../ch32fun//../minichlink all
make[1]: ディレクトリ '/home/rika/ch32fun/minichlink' に入ります
make[1]: 'all' に対して行うべき事はありません.
make[1]: ディレクトリ '/home/rika/ch32fun/minichlink' から出ます
../../ch32fun//../minichlink/minichlink -w blink.bin flash -b
Found WCH Link
WCH Programmer is LinkE version 2.15
Detected CH32V003
Flash Storage: 16 kB
Part UUID: 77-53-ab-cd-df-a0-bc-80
Part Type: 00-30-05-00
Read protection: disabled
Interface Setup
Writing image

Image written.

250mS周期で2つのLEDが点滅するするはずです。

次は、CH32V003J4M6 8pinタイプのデバイスでもLチカできるか確認したいと思います。

コメントを残す

CH32V003, CH32V003F4P6, RISC-Vの関連記事
おすすめの記事