ch32v003fun First Try

「50円マイコン ch32v003 を使った簡単キット(AKBONE2024)を組み立てる」
https://qiita.com/nanbuwks/items/22680849ee7674d66a89

のキットのファームウェア開発のための環境はいくつかありますが、今回は「ch32v003fun」 を使い、Ubuntu Linux のPCを使ってビルド&書き込むところまで試してみます。


# 環境

- Ubuntu 22.04 LTS


# ch32v003fun 

以下のページのうち、

https://github.com/cnlohr/ch32v003fun

インストールは以下をもとにやっていきます。

https://github.com/cnlohr/ch32v003fun/wiki/Installation


# 下準備

WCH-LinkE を用意し、WindowsPC を用いてファームウェアの更新およびRISC-Vモードの設定を行います。
「WCH-LinkE を初期設定する」
https://qiita.com/nanbuwks/items/fd43cb92c6d381917f7e

その後、Ubuntu 上で WCH-LinkE のためのデバイス設定を以下のようにしておきます。

```
$ sudo usermod -aG $USER plugdev
$ sudo chmod a+r /etc/udev/rules.d/10-wch-linke.rules
```

# cch32v003fun をインストール、ビルド

レポジトリをクローン。
```
$ git clone git@github.com:cnlohr/ch32v003fun.git
$ cd ch32v003fun
$ ls
LICENSE        ch32v003fun    examples_v20x  extralibs   package.json
README.md      examples       examples_v30x  minichlink  platformio.ini
build_scripts  examples_v10x  examples_x035  misc
```

Make 環境などは examples* などに入っているようだ。

```
$ cd  examples/blink
```

ここで make でいいのかな。

```
$ make
riscv64-elf-gcc -E -P -x c -DTARGET_MCU=CH32V003 -DMCU_PACKAGE= -DTARGET_MCU_LD=0 -DTARGET_MCU_MEMORY_SPLIT= ../../ch32v003fun/ch32v003fun.ld > ../../ch32v003fun/generated_ch32v003.ld
/bin/sh: 1: riscv64-elf-gcc: not found
make: *** [../../ch32v003fun/ch32v003fun.mk:225: ../../ch32v003fun/generated_ch32v003.ld] エラー 127

```

クロスコンパイル環境が入ってないのでここでエラーが出ます。


```
$ cd ../..
```
minichlink が書き込みツールかな?

```
$ cd ch32v003fun/minichlink/

```
必要なライブラリをインストールします。
```
$ sudo apt-get install build-essential libnewlib-dev gcc-riscv64-unknown-elf libusb-1.0-0-dev libudev-dev
```

先にエラーの出た、クロス開発環境も一緒に設定しました。

minichlink をビルドします。

```
$ make
gcc -o minichlink minichlink.c pgm-wch-linke.c pgm-esp32s2-ch32xx.c nhc-link042.c ardulink.c serial_dev.c pgm-b003fun.c minichgdb.c -lpthread -lusb-1.0 -ludev -O0 -g3 -Wall -DCH32V003 -I. 
gcc -o minichlink.so minichlink.c pgm-wch-linke.c pgm-esp32s2-ch32xx.c nhc-link042.c ardulink.c serial_dev.c pgm-b003fun.c minichgdb.c -lpthread -lusb-1.0 -ludev -O0 -g3 -Wall -DCH32V003 -I.  -shared -fPIC
$ ls -alh minichlink*
-rwxrwxr-x 1 nanbuwks nanbuwks 459K  9月  8 12:55 minichlink
-rw-rw-r-- 1 nanbuwks nanbuwks  61K  9月  7 16:38 minichlink.c
-rw-rw-r-- 1 nanbuwks nanbuwks 101K  9月  7 16:38 minichlink.exe
-rw-rw-r-- 1 nanbuwks nanbuwks 6.8K  9月  7 16:38 minichlink.h
-rwxrwxr-x 1 nanbuwks nanbuwks 480K  9月  8 12:55 minichlink.so
```

これで minichlink と minichlink.so が生成されました。 なお Windows 環境のためには minichlink.exe  はバイナリがもともと用意されていたようです。

# WCH-LinkE の認識

WCH-LinkE をつないでおきます。そのまま起動するとエラー。
```
$ ./minichlink
Error: couldn't open wch link device (libusb_open() = -3)
Error: Could not initialize any supported programmers
Error: Could not initialize any supported programmers
```

sudo すると認識しました。

```
$ sudo ./minichlink
WARNING: You are not in the plugdev group, the canned udev rules will not work on your system.
Found WCH Link
WCH Programmer is LinkE version 2.11
Already Connected
Full Chip Type Reply: [4] 81-55-01-01-11-00-00-00
Detected: CH32V10x
```

パスの通った場所にコピーしておきます。
```
$ sudo cp minichlink /usr/local/bin/
```

# サンプルプログラムのビルド




```
$ make
riscv64-unknown-elf-gcc -E -P -x c -DTARGET_MCU=CH32V003 -DMCU_PACKAGE= -DTARGET_MCU_LD=0 ../../ch32v003fun/ch32v003fun.ld > ../../ch32v003fun/generated_ch32v003.ld
riscv64-unknown-elf-gcc -o blink.elf ../../ch32v003fun/ch32v003fun.c blink.c   -g -Os -flto -ffunction-sections -fdata-sections -fmessage-length=0 -msmall-data-limit=8 -march=rv32ec -mabi=ilp32e -DCH32V003=1 -static-libgcc -I/usr/include/newlib -I../../ch32v003fun/../extralibs -I../../ch32v003fun -nostdlib -I. -Wall  -Wl,--print-memory-usage -L../../ch32v003fun/../misc -lgcc -T ../../ch32v003fun/generated_ch32v003.ld -Wl,--gc-sections
Memory region         Used Size  Region Size  %age Used
           FLASH:         560 B        16 KB      3.42%
             RAM:          0 GB         2 KB      0.00%
riscv64-unknown-elf-objdump -S blink.elf > blink.lst
riscv64-unknown-elf-objdump -t blink.elf > blink.map
riscv64-unknown-elf-objcopy -O binary blink.elf blink.bin
riscv64-unknown-elf-objcopy -O ihex blink.elf blink.hex
make -C ../../ch32v003fun/../minichlink all
make[1]: ディレクトリ '/home/nanbuwks/Downloads/ch32v003fun/minichlink' に入ります
make[1]: 'all' に対して行うべき事はありません.
make[1]: ディレクトリ '/home/nanbuwks/Downloads/ch32v003fun/minichlink' から出ます
../../ch32v003fun/../minichlink/minichlink -w blink.bin flash -b
Error: Could not initialize any supported programmers
Error: Could not initialize any supported programmers
make: *** [../../ch32v003fun/ch32v003fun.mk:229: cv_flash] エラー 224
```
ビルドはうまくできているみたいです。

WCH-LINKE を接続してもう一度。
```
$ make
riscv64-unknown-elf-gcc -E -P -x c -DTARGET_MCU=CH32V003 -DMCU_PACKAGE= -DTARGET_MCU_LD=0 ../../ch32v003fun/ch32v003fun.ld > ../../ch32v003fun/generated_ch32v003.ld
riscv64-unknown-elf-gcc -o blink.elf ../../ch32v003fun/ch32v003fun.c blink.c   -g -Os -flto -ffunction-sections -fdata-sections -fmessage-length=0 -msmall-data-limit=8 -march=rv32ec -mabi=ilp32e -DCH32V003=1 -static-libgcc -I/usr/include/newlib -I../../ch32v003fun/../extralibs -I../../ch32v003fun -nostdlib -I. -Wall  -Wl,--print-memory-usage -L../../ch32v003fun/../misc -lgcc -T ../../ch32v003fun/generated_ch32v003.ld -Wl,--gc-sections
Memory region         Used Size  Region Size  %age Used
           FLASH:         560 B        16 KB      3.42%
             RAM:          0 GB         2 KB      0.00%
riscv64-unknown-elf-objdump -S blink.elf > blink.lst
riscv64-unknown-elf-objdump -t blink.elf > blink.map
riscv64-unknown-elf-objcopy -O binary blink.elf blink.bin
riscv64-unknown-elf-objcopy -O ihex blink.elf blink.hex
make -C ../../ch32v003fun/../minichlink all
make[1]: ディレクトリ '/home/nanbuwks/Downloads/ch32v003fun/minichlink' に入ります
make[1]: 'all' に対して行うべき事はありません.
make[1]: ディレクトリ '/home/nanbuwks/Downloads/ch32v003fun/minichlink' から出ます
../../ch32v003fun/../minichlink/minichlink -w blink.bin flash -b
Found WCH Link
WCH Programmer is LinkE version 2.14
Already Connected
Full Chip Type Reply: [4] 81-55-01-01-11-00-00-00
Detected: CH32V10x
^Cmake: *** [../../ch32v003fun/ch32v003fun.mk:229: cv_flash] 割り込み
```
WCH-LinkE は認識しているみたいです。
ではWCH-LinkEにターゲットボードを接続します。

![IMG_20241115_005204.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/4d0e7eff-9017-2184-5363-a2274b4911ff.jpeg)
必要なのは3線のみです。

![IMG_20241115_005154.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/34627f0f-76bd-d3c7-47ac-3800cc376aae.jpeg)
ターゲットボードは今回ははんだづけせず、L字ピンをひっかけました。

```
$ make
riscv64-unknown-elf-gcc -E -P -x c -DTARGET_MCU=CH32V003 -DMCU_PACKAGE= -DTARGET_MCU_LD=0 ../../ch32v003fun/ch32v003fun.ld > ../../ch32v003fun/generated_ch32v003.ld
riscv64-unknown-elf-gcc -o blink.elf ../../ch32v003fun/ch32v003fun.c blink.c   -g -Os -flto -ffunction-sections -fdata-sections -fmessage-length=0 -msmall-data-limit=8 -march=rv32ec -mabi=ilp32e -DCH32V003=1 -static-libgcc -I/usr/include/newlib -I../../ch32v003fun/../extralibs -I../../ch32v003fun -nostdlib -I. -Wall  -Wl,--print-memory-usage -L../../ch32v003fun/../misc -lgcc -T ../../ch32v003fun/generated_ch32v003.ld -Wl,--gc-sections
Memory region         Used Size  Region Size  %age Used
           FLASH:         560 B        16 KB      3.42%
             RAM:          0 GB         2 KB      0.00%
riscv64-unknown-elf-objdump -S blink.elf > blink.lst
riscv64-unknown-elf-objdump -t blink.elf > blink.map
riscv64-unknown-elf-objcopy -O binary blink.elf blink.bin
riscv64-unknown-elf-objcopy -O ihex blink.elf blink.hex
make -C ../../ch32v003fun/../minichlink all
make[1]: ディレクトリ '/home/nanbuwks/Downloads/ch32v003fun/minichlink' に入ります
make[1]: 'all' に対して行うべき事はありません.
make[1]: ディレクトリ '/home/nanbuwks/Downloads/ch32v003fun/minichlink' から出ます
../../ch32v003fun/../minichlink/minichlink -w blink.bin flash -b
Found WCH Link
WCH Programmer is LinkE version 2.14
Full Chip Type Reply: [8] 82-0d-05-09-00-30-05-00
Detected: CH32V003
Setup success
Flash Storage: 16 kB
Part UUID    : 53-a5-ab-cd-bb-73-bc-01
PFlags       : ff-ff-ff-ff
Part Type (B): 07-13-bb-91
Read protection: disabled
Interface Setup
Image written.
```
うまく書けたようです。

# blink の変更

AKBONE2024 は PD5 に LED 
が接続されています。サンプルプログラムでは、PD0,PD4,PD6,PC0 を blink していますが、
それを書き換えて PD0,PD4,PD5,PC0 にしました。

![IMG_20241115_005722.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/abff94e8-c0b1-ba7a-dfa4-24ca32c43a06.jpeg)

右上のLEDが点滅し、無事プログラム変更が確認できました。