今回から、ch32funのライブラリーの1つであるGPIOライブラリーを使用していきたいと思います。
GPIOライブラリーを使用するには、"ch32v003_GPIO_branchless.h"をインクルードすることと、Makefileの中に"extralibs"ディレクトリーの在処を特定するために、”CH32FUN=$(HOME)/ch32fun/ch32fun”を設定することです。
では早速GPIOを使用したLチカのプログラムを書いてみましょう。
2つのLEDを交互に点滅するプログラムです。
デバイスとしてCH32V003F4P6 20pinタイプで前回と同じ回路図で、PD4(1pin)、PD0(8pin)にLEDを接続した回路とします。回路は前回(RISC-Vコアに萌えたい CH32V003でLチカ2(gcc-riscv64、ch32v003fun))と同じです
格納するディレクトリーは prog/ch32v003/ch32fun/GPIO_blinkとしました。
//CH32V003F4P6 20pin GPIO LED 点滅 プログラム
#include "ch32fun.h"
#include "ch32v003_GPIO_branchless.h"
#include <stdio.h>
// 該当LEDと出力PINとの関連付け
#define LED1 GPIOv_from_PORT_PIN(GPIO_port_D, 0)
#define LED2 GPIOv_from_PORT_PIN(GPIO_port_D, 4)
int main() {
SystemInit(); // デバイスの初期化
GPIO_port_enable(GPIO_port_D); // gpio Dポートを活性化
GPIO_pinMode(LED1, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz); // gpioの補給クロックとpinを出力に設定
GPIO_pinMode(LED2, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz); // gpioの補給クロックとpinを出力に設定
while (1) {
GPIO_digitalWrite(LED1, high); // 該当のpin出力をHレベルにする
GPIO_digitalWrite(LED2, low); // 該当のpin出力をLレベルにする
Delay_Ms( 500 );
GPIO_digitalWrite(LED1, low); // 該当のpin出力をLレベルにする
GPIO_digitalWrite(LED2, high); // 該当のpin出力をHレベルにする
Delay_Ms( 500 );
}
}
上記プログラムをGPIO_blink.cとして保存します。
Makefileを作成します。
all : flash
TARGET:=GPIO_blink
CH32FUN=$(HOME)/ch32fun/ch32fun
TARGET_MCU?=CH32V003
include ~/ch32fun/ch32fun/ch32fun.mk
flash : cv_flash
clean : cv_clean
Makefileとして保存します。
funconfig.hを~/ch32fun/examples/GPIOからコピーします。何も編集はしません。
これで必要なファイルが揃いました。
~/prog/ch32v003/ch32fun/GPIO_blink $ ls
GPIO_blink.c Makefile funconfig.h
WCH-LinkEをusbに差して、makeします。
~/prog/ch32v003/ch32fun/GPIO_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 GPIO_blink.elf /home/rika/ch32fun/ch32fun/ch32fun.c GPIO_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=GPIO_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: 332 B 16 KB 2.03%
RAM: 0 GB 2 KB 0.00%
riscv64-unknown-elf-objdump -S GPIO_blink.elf > GPIO_blink.lst
riscv64-unknown-elf-objcopy -O binary GPIO_blink.elf GPIO_blink.bin
riscv64-unknown-elf-objcopy -O ihex GPIO_blink.elf GPIO_blink.hex
make -C /home/rika/ch32fun/ch32fun/../minichlink all
make[1]: ディレクトリ '/home/rika/ch32fun/minichlink' に入ります
make[1]: 'all' に対して行うべき事はありません.
make[1]: ディレクトリ '/home/rika/ch32fun/minichlink' から出ます
/home/rika/ch32fun/ch32fun/../minichlink/minichlink -w GPIO_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チカをやってみます。
PC1(5pin)、PC2(6pin)にLEDを接続した回路とします。回路は前回(RISC-Vコアに萌えたい CH32V003でLチカ2(gcc-riscv64、ch32v003fun))の8pinタイプと同じです
格納するディレクトリーは prog/ch32v003/ch32fun/GPIO_blink_8pとしました。
//CH32V003J4M6 8pin GPIO LED 点滅 プログラム
#include "ch32fun.h"
#include "ch32v003_GPIO_branchless.h"
#include <stdio.h>
// 該当LEDと出力PINとの関連付け
#define LED1 GPIOv_from_PORT_PIN(GPIO_port_C, 1)
#define LED2 GPIOv_from_PORT_PIN(GPIO_port_C, 2)
int main() {
SystemInit(); // デバイスの初期化
GPIO_port_enable(GPIO_port_C); // gpio Cポートを活性化
GPIO_pinMode(LED1, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz); // gpioの補給クロックとpinを出力に設定
GPIO_pinMode(LED2, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz); // gpioの補給クロックとpinを出力に設定
while (1) {
GPIO_digitalWrite(LED1, high); // 該当のpin出力をHレベルにする
GPIO_digitalWrite(LED2, low); // 該当のpin出力をLレベルにする
Delay_Ms( 500 );
GPIO_digitalWrite(LED1, low); // 該当のpin出力をLレベルにする
GPIO_digitalWrite(LED2, high); // 該当のpin出力をHレベルにする
Delay_Ms( 500 );
}
}
上記プログラムをGPIO_blink_8p.cとして保存します
Makefile を作成します。ターゲット名の変更だけです。ここではGPIO_blink_8p.cを対象するので、GPIO_blink_8pとします。
all : flash
TARGET:=GPIO_blink_8p
CH32FUN=$(HOME)/ch32fun/ch32fun
TARGET_MCU?=CH32V003
include ~/ch32fun/ch32fun/ch32fun.mk
flash : cv_flash
clean : cv_clean
Makefileとして保存します。
funconfig.hを~/ch32fun/examples/GPIOからコピーします。何も編集はしません。
これで必要なファイルが揃いました。
~/prog/ch32v003/ch32fun/GPIO_blink_8p $ ls
GPIO_blink_8p.c Makefile funconfig.h
WCH-LinkEをusbに差して、makeします。
~/prog/ch32v003/ch32fun/GPIO_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 GPIO_blink_8p.elf /home/rika/ch32fun/ch32fun/ch32fun.c GPIO_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=GPIO_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: 328 B 16 KB 2.00%
RAM: 0 GB 2 KB 0.00%
riscv64-unknown-elf-objdump -S GPIO_blink_8p.elf > GPIO_blink_8p.lst
riscv64-unknown-elf-objcopy -O binary GPIO_blink_8p.elf GPIO_blink_8p.bin
riscv64-unknown-elf-objcopy -O ihex GPIO_blink_8p.elf GPIO_blink_8p.hex
make -C /home/rika/ch32fun/ch32fun/../minichlink all
make[1]: ディレクトリ '/home/rika/ch32fun/minichlink' に入ります
make[1]: 'all' に対して行うべき事はありません.
make[1]: ディレクトリ '/home/rika/ch32fun/minichlink' から出ます
/home/rika/ch32fun/ch32fun/../minichlink/minichlink -w GPIO_blink_8p.bin flash -b
Found WCH Link
WCH Programmer is LinkE version 2.18
Detected CH32V003
Flash Storage: 16 kB
Part UUID: 57-5c-ab-cd-c0-7d-bd-54
Part Type: 00-33-05-10
Read protection: disabled
Interface Setup
Writing image
Image written.
書き込みが終了したらLED2つが500mS間隔て相反しながら点滅するはずです。
次にSW入力とminichlinkを使ったプログラムの確認方法をやってみます。
まず回路は下記のとおりです。デバイスとしてCH32V003F4P6 20pinタイプです。
PD4(1pin)、PD0(8pin)にLEDを接続し、PC1((11pin)をSW入力として使用します。
GPIOライブラリーの”GPIO_digitalRead”を使うことにより、PINの状態を読むことができます。
また、”GPIO_pinMode(SW1, GPIO_pinMode_I_pullUp, GPIO_Speed_In)”により、内部プルアップに設定するこができます。
次のプログラムはプッシュSWを押すことにより、LED1/LED2を交互に点滅するとともに回数をカウントし、10回カウントすると停止し、またプッシュSWを押されるまで待ちます。
printf関数にカウント変数を与えることにより、minichlinkでの確認ができます。
//CH32V003F4P6 20pin GPIO LED 点滅 SW入力プログラム
#include "ch32fun.h"
#include "ch32v003_GPIO_branchless.h"
#include <stdio.h>
// 該当LEDと出力PINとの関連付け
#define LED1 GPIOv_from_PORT_PIN(GPIO_port_D, 0) //D0 port
#define LED2 GPIOv_from_PORT_PIN(GPIO_port_D, 4) //D4 port
// 該当SWと入力PINとの関連付け
#define SW1 GPIOv_from_PORT_PIN(GPIO_port_C, 1) //C1 port
int main() {
SystemInit(); // デバイスの初期化
GPIO_port_enable(GPIO_port_C); // gpio Dポートを活性化
GPIO_port_enable(GPIO_port_D); // gpio Dポートを活性化
GPIO_pinMode(LED1, GPIO_pinMode_O_openDrain, GPIO_Speed_10MHz); // gpioの補給クロックとpinを出力に設定
GPIO_pinMode(LED2, GPIO_pinMode_O_openDrain, GPIO_Speed_10MHz); // gpioの補給クロックとpinを出力に設定
GPIO_pinMode(SW1, GPIO_pinMode_I_pullUp, GPIO_Speed_In); // gpioの補給クロックとpinを入力に設定
uint8_t i;
printf("Start GPIO LED blink conut !\n\r");
while(1){
GPIO_digitalWrite(LED1, high); // 該当のpin出力をHレベルにする
GPIO_digitalWrite(LED2, high); // 該当のpin出力をHレベルにする
i=0;
while(GPIO_digitalRead(SW1) != 1) {
while( i < 10){
GPIO_digitalWrite(LED1, high); // 該当のpin出力をHレベルにする
GPIO_digitalWrite(LED2, low); // 該当のpin出力をLレベルにする
Delay_Ms( 500 );
GPIO_digitalWrite(LED1, low); // 該当のpin出力をLレベルにする
GPIO_digitalWrite(LED2, high); // 該当のpin出力をHレベルにする
Delay_Ms( 500 );
i=i+1;
printf("i = %d\n\r",i);
}
}
}
}
上記プログラムをGPIO_blink_sw.cとして保存します。
Makefileを作成します。
all : flash
TARGET:=GPIO_blink_sw
CH32FUN=$(HOME)/ch32fun/ch32fun
TARGET_MCU?=CH32V003
include ~/ch32fun/ch32fun/ch32fun.mk
flash : cv_flash
clean : cv_clean
Makefileとして保存します。
funconfig.hを~/ch32fun/examples/GPIOからコピーします。何も編集はしません。
これで必要なファイルが揃いました。
~/prog/ch32v003/ch32fun/GPIO_blink_sw $ ls
GPIO_blink_sw.c Makefile funconfig.h
WCH-LinkEをusbに差して、makeします
~/prog/ch32v003/ch32fun/GPIO_blink_sw $ 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 GPIO_blink_sw.elf /home/rika/ch32fun/ch32fun/ch32fun.c GPIO_blink_sw.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=GPIO_blink_sw.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: 1700 B 16 KB 10.38%
RAM: 0 GB 2 KB 0.00%
riscv64-unknown-elf-objdump -S GPIO_blink_sw.elf > GPIO_blink_sw.lst
riscv64-unknown-elf-objcopy -O binary GPIO_blink_sw.elf GPIO_blink_sw.bin
riscv64-unknown-elf-objcopy -O ihex GPIO_blink_sw.elf GPIO_blink_sw.hex
make -C /home/rika/ch32fun/ch32fun/../minichlink all
make[1]: ディレクトリ '/home/rika/ch32fun/minichlink' に入ります
make[1]: 'all' に対して行うべき事はありません.
make[1]: ディレクトリ '/home/rika/ch32fun/minichlink' から出ます
/home/rika/ch32fun/ch32fun/../minichlink/minichlink -w GPIO_blink_sw.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.
プッシュSWを押すと点滅が始まり、10回で終了します。
minichlink -Tとキーインすることにより、プッシュSWを押すことにより、printf関数より"i"の変化を確認することができます。
停止はCtrl+zです。
~/prog/ch32v003/ch32fun/GPIO_blink_sw $ minichlink -T
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
Terminal started
Start GPIO LED blink conut !
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10
[1]+ 停止 minichlink -T
再度実行するには、一度WCH-LinkEをusbに差しなおす必要がありそうです。
同様にCH32V003J4M6 8pinダイブについても同様にLチカをやってみます。
PD6(1pin)にプッシュSWを接続しました。
回路は下記のとおりです。
プログラムは下記のとおりです。
//CH32V003J4M6 8pin GPIO LED 点滅 SW入力プログラム
#include "ch32fun.h"
#include "ch32v003_GPIO_branchless.h"
#include <stdio.h>
// 該当LEDと出力PINとの関連付け
#define LED1 GPIOv_from_PORT_PIN(GPIO_port_C, 1) //C1 port
#define LED2 GPIOv_from_PORT_PIN(GPIO_port_C, 2) //C2 port
// 該当SWと入力PINとの関連付け
#define SW1 GPIOv_from_PORT_PIN(GPIO_port_D, 6) //D6 port
int main() {
SystemInit(); // デバイスの初期化
GPIO_port_enable(GPIO_port_C); // gpio Dポートを活性化
GPIO_port_enable(GPIO_port_D); // gpio Dポートを活性化
GPIO_pinMode(LED1, GPIO_pinMode_O_openDrain, GPIO_Speed_10MHz); // gpioの補給クロックとpinを出力に設定
GPIO_pinMode(LED2, GPIO_pinMode_O_openDrain, GPIO_Speed_10MHz); // gpioの補給クロックとpinを出力に設定
GPIO_pinMode(SW1, GPIO_pinMode_I_pullUp, GPIO_Speed_In); // gpioの補給クロックとpinを入力に設定
uint8_t i;
printf("Start GPIO LED blink conut !\n\r");
while(1){
GPIO_digitalWrite(LED1, high); // 該当のpin出力をHレベルにする
GPIO_digitalWrite(LED2, high); // 該当のpin出力をHレベルにする
i=0;
while(GPIO_digitalRead(SW1) != 1) {
while( i < 10){
GPIO_digitalWrite(LED1, high); // 該当のpin出力をHレベルにする
GPIO_digitalWrite(LED2, low); // 該当のpin出力をLレベルにする
Delay_Ms( 500 );
GPIO_digitalWrite(LED1, low); // 該当のpin出力をLレベルにする
GPIO_digitalWrite(LED2, high); // 該当のpin出力をHレベルにする
Delay_Ms( 500 );
i=i+1;
printf("i = %d\n\r",i);
}
}
}
}
上記プログラムをGPIO_blink_sw_8p.cとして保存します。
Makefileを作成します。all : flash
TARGET:=GPIO_blink_sw_8p
CH32FUN=$(HOME)/ch32fun/ch32fun
TARGET_MCU?=CH32V003
include ~/ch32fun/ch32fun/ch32fun.mk
flash : cv_flash
clean : cv_clean
funconfig.hを~/ch32fun/examples/GPIOからコピーします。何も編集はしません。
これで必要なファイルが揃いました。
~/prog/ch32v003/ch32fun/GPIO_blink_sw_8p $ ls
GPIO_blink_sw_8p.c Makefile funconfig.h
WCH-LinkEをusbに差して、makeします
~/prog/ch32v003/ch32fun/GPIO_blink_sw_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 GPIO_blink_sw_8p.elf /home/rika/ch32fun/ch32fun/ch32fun.c GPIO_blink_sw_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=GPIO_blink_sw_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: 1700 B 16 KB 10.38%
RAM: 0 GB 2 KB 0.00%
riscv64-unknown-elf-objdump -S GPIO_blink_sw_8p.elf > GPIO_blink_sw_8p.lst
riscv64-unknown-elf-objcopy -O binary GPIO_blink_sw_8p.elf GPIO_blink_sw_8p.bin
riscv64-unknown-elf-objcopy -O ihex GPIO_blink_sw_8p.elf GPIO_blink_sw_8p.hex
make -C /home/rika/ch32fun/ch32fun/../minichlink all
make[1]: ディレクトリ '/home/rika/ch32fun/minichlink' に入ります
make[1]: 'all' に対して行うべき事はありません.
make[1]: ディレクトリ '/home/rika/ch32fun/minichlink' から出ます
/home/rika/ch32fun/ch32fun/../minichlink/minichlink -w GPIO_blink_sw_8p.bin flash -b
Found WCH Link
WCH Programmer is LinkE version 2.18
Detected CH32V003
Flash Storage: 16 kB
Part UUID: 57-5c-ab-cd-c0-7d-bd-54
Part Type: 00-33-05-10
Read protection: disabled
Interface Setup
Writing image
Image written.
プッシュSWを押すと点滅が始まり、10回で終了します。
minichlink -Tとキーインすることにより、プッシュSWを押すことにより、printf関数より"i"の変化を確認することができます。
停止はCtrl+zです。
~/prog/ch32v003/ch32fun/GPIO_blink_sw_8p $ minichlink -T
Found WCH Link
WCH Programmer is LinkE version 2.18
Detected CH32V003
Flash Storage: 16 kB
Part UUID: 57-5c-ab-cd-c0-7d-bd-54
Part Type: 00-33-05-10
Read protection: disabled
Interface Setup
Terminal started
Start GPIO LED blink conut !
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10
[3]+ 停止 minichlink -T