RX62N用のRS232C通信プログラムです。割込みとバッファリングを使用しています。環境はkpitです。
/***********************************************************************/ /* */ /* FILE :rs232ctest02.c */ /* DATE :Thu, Dec 06, 2012 */ /* DESCRIPTION :Main Program */ /* CPU TYPE :RX62N */ /* */ /* This file is generated by KPIT GNU Project Generator. */ /* */ /***********************************************************************/ #include <stdio.h> #include "iodefine.h" #include "interrupt_handlers.h" #define PCLK 48 //PクロックMHz #define TX_ACTIVE 1 //送信動作中 #define TX_INACTIVE 0 //送信停止中 #define TX_RING_BUFF_SIZE 32 //リングバッファのサイズ #define RX_RING_BUFF_SIZE 32 //リングバッファのサイズ //リングバッファ unsigned char rx_buff[RX_RING_BUFF_SIZE]; //受信用 unsigned char tx_buff[TX_RING_BUFF_SIZE]; //送信用 //データポインタ volatile int ptr_rx_top,ptr_rx_bottom; volatile int ptr_tx_top,ptr_tx_bottom; //送信フラグ データ送信中かどうか volatile int tx_flag = TX_INACTIVE; //受信エラー処理 void INT_Excep_SCI0_ERI0(void) { SCI0.SSR.BYTE &= ~0x38; //エラーフラグクリア } //受信完了割込み void INT_Excep_SCI0_RXI0(void) { /* Read data */ rx_buff[ptr_rx_top] = SCI0.RDR; ptr_rx_top++; ptr_rx_top = ptr_rx_top % RX_RING_BUFF_SIZE; } //送信完了割込み void INT_Excep_SCI0_TXI0(void) { /* Write the character out */ SCI0.TDR = tx_buff[ptr_tx_bottom]; ptr_tx_bottom++; ptr_tx_bottom = ptr_tx_bottom % TX_RING_BUFF_SIZE; //すべてのデータを送信したら割込み禁止 if( ptr_tx_bottom == ptr_tx_top ) { IEN(SCI0, TXI0) = 0; tx_flag = TX_INACTIVE; } } /* SCI初期化 引数はボーレート */ void InitSCI(int bps) { /* Enable SCI0 */ MSTP(SCI0) = 0; /* RxD0 is input */ PORT2.DDR.BIT.B1 = 0; /* Enable Input Buffer on RxD0 */ PORT2.ICR.BIT.B1 = 1; /* TxD0 is output */ PORT2.DDR.BIT.B0 = 1; /* Disable Tx/Rx */ SCI0.SCR.BYTE = 0; /* Set mode register -Asynchronous Mode -8 bits -no parity -1 stop bit -PCLK clock (n = 0) */ SCI0.SMR.BYTE = 0x00; //SCI0.SEMR.BIT.ABCS = 1; /* 送受信で割込み発生 */ SCI0.SCR.BIT.RIE = 1; SCI0.SCR.BIT.TIE = 1; /* 割込み優先度 */ IPR(SCI0,RXI0) = 0x04; IPR(SCI0,TXI0) = 0x04; /* Clear IR bits for TIE and RIE */ IR(SCI0, RXI0) = 0; IR(SCI0, TXI0) = 0; /* 受信・送信割込み許可 */ IEN(SCI0, RXI0) = 1; IEN(SCI0, TXI0) = 1; /* Set baud rate to 115200 N = (PCLK Frequency) / (64 * 2^(2*n - 1) * Bit Rate) - 1 N = (48,000,000) / (64 * 2^(2*0 - 1) * 115200) - 1 115200bps N = 12 38400bps N=38 */ //SCI0.BRR = 38; SCI0.BRR = PCLK *1000000 / 32 / bps - 1; /* Enable Tx/Rx */ SCI0.SCR.BYTE |= 0x30; /*リングバッファ初期化*/ ptr_rx_top = ptr_rx_bottom = 0; ptr_tx_top = ptr_tx_bottom = 0; } /* データの送信 */ void charput(unsigned char output_char) { int tmp; tmp = ptr_tx_top + 1; tmp = tmp % TX_RING_BUFF_SIZE; while(tmp == ptr_tx_bottom) ; //バッファに空きができるまで待つ tx_buff[ptr_tx_top] = output_char; ptr_tx_top++; ptr_tx_top = ptr_tx_top % TX_RING_BUFF_SIZE; if(tx_flag == TX_INACTIVE) { tx_flag = TX_ACTIVE; IEN(SCI0, TXI0) = 1; SCI0.SCR.BYTE |= 0xA0; //送信割込み発生 } } /* データの受信 バッファに受信したデータがなければ受信するまで待つ */ unsigned char charget(void) { unsigned char c; while(ptr_rx_bottom == ptr_rx_top); //データを受信するまで待つ c = rx_buff[ptr_rx_bottom]; ptr_rx_bottom++; ptr_rx_bottom = ptr_rx_bottom % RX_RING_BUFF_SIZE; return c; } /* 文字列の出力 */ void printString(char *s) { while( *s != 0 ) { if(( *s == '\r' ) && ( *(s+1) != '\n')) { charput('\r');charput('\n'); } else if( (*s == '\n') && ( *(s-1) != '\r') ) { charput('\r');charput('\n'); } else { charput(*s); } s++; } } /* printf関数で使用 */ int _write(int file,char *ptr,int len) { int i; for(i=0;i<len;i++) { if( (ptr[i]=='r') || (ptr[i]=='n')) { charput('r');charput('n'); } else { charput(ptr[i]); } } return len; } /* scanf関数で使用 */ int _read (int file, char *ptr, int len) { *ptr = charget(); return 1; } int main(void) { char c; // TODO: add application code here SYSTEM.SCKCR.BIT.ICK = 0x00; //システムクロック x16 96MHz SYSTEM.SCKCR.BIT.PCK = 0x01; //周辺クロック x4 48MHz SYSTEM.SCKCR.BIT.BCK = 0x01; //外部バスクロック x4 48MHz InitSCI(38400); //38400bpsで初期化 printf("Startn"); while (1) { c = charget(); printf("%c",c); } return 0; }