読者です 読者をやめる 読者になる 読者になる

CCWO

挫けそうになるブログ

RX621開発 I/O

Renesas RX621

次にI/Oピンの設定をします。
出力ピンにPA2,PA3,PA4,PA5
入力ピンにPD0,PD1,PD2,PD3
を設定します。

hardware_setup.cにて以下のようにPin_initialzie関数を作成し、HardwareSetup関数にて呼び出します。

#include "iodefine.h"

void Clock_initialize(void);
void Pin_initialize(void);

void HardwareSetup(void)
{
	Clock_initialize();
	Pin_initialize();
}

void Clock_initialize(void)
{
	SYSTEM.SCKCR.BIT.ICK = 0x0;	// ICLK: XTAL*8
	SYSTEM.SCKCR.BIT.PCK = 0x1;	// PCLK: XTAL*4
	SYSTEM.SCKCR.BIT.BCK = 0x2;	// BCLK: XTAL*2
}

void Pin_initialize(void)
{
	PORTD.DDR.BIT.B0 = 0;	// BUTTON3
	PORTD.DDR.BIT.B1 = 0;	// BUTTON2
	PORTD.DDR.BIT.B2 = 0;	// BUTTON1
	PORTD.DDR.BIT.B3 = 0;	// BUTTON0
	PORTA.DDR.BIT.B2 = 1;	// LED0
	PORTA.DDR.BIT.B3 = 1;	// LED1
	PORTA.DDR.BIT.B4 = 1;	// LED2
	PORTA.DDR.BIT.B5 = 1;	// LED3
}

DDRレジスタにて、入力出力方向を設定します。0: 入力,1: 出力となります。
今回のようにHardwareSetup関数で一度だけ呼ばれる場合はビット単位でアクセスしても問題はありませんが、高速で何度も呼ばれる場合には、レジスタ単位でのアクセスを推奨します。
これでピンの入出力設定が完了したので、BUTTON0~3ボタンの入力に応じて、LEDがそれぞれ点灯するようにmain文にて処理します。

main

#include "iodefine.h"

void main(void)
{
	while(1){
		if(!PORTD.PORT.BIT.B3)	PORTA.DR.BIT.B2 = 1;
		else PORTA.DR.BIT.B2 = 0;
		if(!PORTD.PORT.BIT.B2)	PORTA.DR.BIT.B3 = 1;
		else PORTA.DR.BIT.B3 = 0;
		if(!PORTD.PORT.BIT.B1)	PORTA.DR.BIT.B4 = 1;
		else PORTA.DR.BIT.B4 = 0;
		if(!PORTD.PORT.BIT.B0)	PORTA.DR.BIT.B5 = 1;
		else PORTA.DR.BIT.B5 = 0;
	}
}

ボタンの入力情報はPORTレジスタに収納されます。
また、出力するためにはDRレジスタを設定します。1: High, 0: Lowを出力となります。
今、ボタンは10kΩの抵抗でプルアップされているため、通常時はHighであり、押されているときはLowになります。
なので、if文条件式にてPORTレジスタの負論理をとり、ボタンがHighのときにLEDの出力はLowになるようにしました。
ただ、if文にてこの操作をするのはあまり効率的とは言えないので、レジスタ間を直接操作するほうが効率的かと思われます。
その際には

#define PORTA.DR.BIT.B2 LED0
#define PORTD.PORT.BIT.B3 BUTTON0

とデファイン等しておくと可読性が上がるかと思います。