今回から、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

おすすめの記事