前回に引き続き、RISC-VコアであるCH32V003でLチカをやっていきたいと思います。
前回では、ch32funのexamplesディレクトリーのblinkディレクトリーのCH32V003をコンパイルしました。せっかくなので、開発用のディレクトリーを新たに作成し、その開発用のディレクトリーで作成したblink.cをコンパイルしてみます。
前提条件として、ch32v003funは、ユーザーディレクトリーの直下に作成されているとものとします。
(前回のインスト-ルの手順であれば問題ありません)
例として、ユーザーディレクトリーの直下にprog/ch32v003/ch32fun/blinkというディレクトリーを作成しました
home/ユーザー/ch32fun/examples
| +--/ch32fun
| +--/minichlink
|
+ /prog/ch32v003/ch32fun/blink
まずは、デバイスとしてCH32V003F4P6 20pinタイプで前回と同じ回路図で、PD4(1pin)、PD0(8pin)にLEDを接続した回路とします。
2つのLEDを500msでお互いの点滅が相反するようプログラムを作成します。
//CH32V003F4P6 20pin LED 点滅 プログラム
#include "ch32fun.h"
#include <stdio.h>
// 該当LEDと出力PINとの関連付け
#define PIN_LED1 PD0
#define PIN_LED2 PD4
int main()
{
SystemInit(); // デバイスの初期化
funGpioInitAll(); // gpioを活性化
funPinMode( PIN_LED1, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP ); // gpioの補給クロックとpinを出力に設定
funPinMode( PIN_LED2, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP ); // gpioの補給クロックとpinを出力に設定
while(1)
{
funDigitalWrite( PIN_LED1, FUN_HIGH ); // 該当のpin出力をHレベルにする
funDigitalWrite( PIN_LED2, FUN_LOW); // 該当のpin出力をLレベルにする
Delay_Ms( 500 );
funDigitalWrite( PIN_LED1, FUN_LOW ); // 該当のpin出力をLレベルにする
funDigitalWrite( PIN_LED2, FUN_HIGH ); // 該当のpin出力をHレベルにする
Delay_Ms( 500 );
}
}
上記プログラムをblink.cとして保存します。
makeフィルを作成します。
ターゲット名を記述します。ここではblink.cを対象するので、blinkとします。
ターゲットデバイスを指定します。 ここでは CH32V003とします。
minichlinkの居所を指定します。ユーサーディレクトリー直下にあるので、~/ch32fun/minichlink/としました。
makeに必要なch32fun.mkを指定します、 ここではユーサーディレクトリー直下にあるので~/ch32fun/ch32fun/ch32fun.mkとしました。
all : flash
TARGET:=blink
TARGET_MCU?=CH32V003
MINICHLINK=~/ch32fun/minichlink/
include ~/ch32fun/ch32fun/ch32fun.mk
flash : cv_flash
clean : cv_clean
Makefileとして保存します。
funconfig.hを~/ch32fun/examples/blinkからコピーします。何も編集はしません。
これで必要なファイルが揃いました。
~/prog/ch32v003/ch32fun/blink $ ls
Makefile blink.c funconfig.h
WCH-LinkEをusbに差して、makeします。
~/prog/ch32v003/ch32fun/blink $ make
riscv64-unknown-elf-gcc -E -P -x c -DTARGET_MCU=CH32V003 -DMCU_PACKAGE=1 -DTARGET_MCU_LD=0 -DTARGET_MCU_MEMORY_SPLIT= /home/rika/ch32fun/ch32fun//ch32fun.ld > /home/rika/ch32fun/ch32fun//generated__.ld
riscv64-unknown-elf-gcc -o blink.elf /home/rika/ch32fun/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/home/rika/ch32fun/ch32fun//../extralibs -I/home/rika/ch32fun/ch32fun/ -nostdlib -I. -Wall -Wl,--print-memory-usage -Wl,-Map=blink.map -L/home/rika/ch32fun/ch32fun//../misc -lgcc -lgcc -T /home/rika/ch32fun/ch32fun//generated__.ld -Wl,--gc-sections
Memory region Used Size Region Size %age Used
FLASH: 652 B 16 KB 3.98%
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.18
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.
書き込みが終了したらLED2つが500mS間隔て相反しながら点滅するはずです。
次に CH32V003J4M6 8pinダイブについても同様にLチカをやってみます。
LEDは PC1(5pin)、PC2(6pin)に接続しました。回路図は下記のとおりです。
2つのLEDを500msでお互いの点滅が相反するようプログラムを作成します。
格納するディレクトリーは prog/ch32v003/ch32fun/blink_8pとしました。
//CH32V003J4P6 8pin LED 点滅 プログラム
#include "ch32fun.h"
#include <stdio.h>
// 当LEDと出力PINとの関連付け
#define PIN_LED1 PC1
#define PIN_LED2 PC2
int main()
{
SystemInit(); // デバイスの初期化
funGpioInitAll(); // gpioを活性化
funPinMode( PIN_LED1, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP ); // gpioの補給クロックとpinを出力に設定
funPinMode( PIN_LED2, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP ); // gpioの補給クロックとpinを出力に設定
while(1)
{
funDigitalWrite( PIN_LED1, FUN_HIGH ); // 該当のpin出力をHレベルにする
funDigitalWrite( PIN_LED2, FUN_LOW); // 該当のpin出力をLレベルにする
Delay_Ms( 500 );
funDigitalWrite( PIN_LED1, FUN_LOW ); // 該当のpin出力をLレベルにする
funDigitalWrite( PIN_LED2, FUN_HIGH ); // 該当のpin出力をHレベルにする
Delay_Ms( 500 );
}
}
上記プログラムをblink_8p.cとして保存します
Makefile を作成します。ターゲット名の変更だけです。ここではblink_8p.cを対象するので、blink_8pとします。
all : flash
TARGET:=blink_8p
TARGET_MCU?=CH32V003
MINICHLINK=~/ch32fun/minichlink/
include ~/ch32fun/ch32fun/ch32fun.mk
flash : cv_flash
clean : cv_clea
Makefileとして保存します。
funconfig.hを~/ch32fun/examples/blinkからコピーします。何も編集はしません。
これで必要なファイルが揃いました。
~/prog/ch32v003/ch32fun/blink_8p $ ls
Makefile blink_8p.c funconfig.h
WCH-LinkEをusbに差して、makeします。
~/prog/ch32v003/ch32fun/blink_8p $ make
riscv64-unknown-elf-gcc -E -P -x c -DTARGET_MCU=CH32V003 -DMCU_PACKAGE=1 -DTARGET_MCU_LD=0 -DTARGET_MCU_MEMORY_SPLIT= /home/rika/ch32fun/ch32fun//ch32fun.ld > /home/rika/ch32fun/ch32fun//generated__.ld
riscv64-unknown-elf-gcc -o blink_8p.elf /home/rika/ch32fun/ch32fun//ch32fun.c blink_8p.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/home/rika/ch32fun/ch32fun//../extralibs -I/home/rika/ch32fun/ch32fun/ -nostdlib -I. -Wall -Wl,--print-memory-usage -Wl,-Map=blink_8p.map -L/home/rika/ch32fun/ch32fun//../misc -lgcc -lgcc -T /home/rika/ch32fun/ch32fun//generated__.ld -Wl,--gc-sections
Memory region Used Size Region Size %age Used
FLASH: 652 B 16 KB 3.98%
RAM: 0 GB 2 KB 0.00%
riscv64-unknown-elf-objdump -S blink_8p.elf > blink_8p.lst
riscv64-unknown-elf-objcopy -O binary blink_8p.elf blink_8p.bin
riscv64-unknown-elf-objcopy -O ihex blink_8p.elf blink_8p.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_8p.bin flash -b
Found WCH Link
WCH Programmer is LinkE version 2.18
Detected CH32V003
Flash Storage: 16 kB
Part UUID: 57-42-ab-cd-c0-63-bd-54
Part Type: 00-33-05-10
Read protection: disabled
Interface Setup
Writing image
Image written.
書き込みが終了したらLED2つが500mS間隔て相反しながら点滅するはずです。