巷で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チカできるか確認したいと思います。