Renesas RX621 I/O
次に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
とデファイン等しておくと可読性が上がるかと思います。
20160822の記事