UART（RXI割り込み）

# はじめに
受信時のUARTで割り込み処理を行う場合についての記述をする．マイコンボードはGR-CITRUSとする．ハードウェアマニュアルの参考先はHM ＊.＊.＊と表記する（例：HM 3.3.4ならばハードウェアマニュアルの3.3.4節を参考）．

資料（必需品）
・ [RX63Nグループ、RX631グループ ユーザーズマニュアル](https://www.marutsu.co.jp/contents/shop/marutsu/datasheet/R5F563.pdf)
・ [GR-CITRUS回路図](https://www.renesas.com/jp/ja/doc/gr/gr-citrus/citrus-1.0.pdf)

# 設定
初期化と割り込み関数の作成を行う．

### 初期化関数
初期化関数の詳細は，[UART](https://qiita.com/shiduku/private/2dcd56418ed5201287da)に記載されているものとする．ここに，割り込み関連の許可や設定が加わる．

流れ
1. UARTの基本設定をする．
2. REIレジスタを1とする．
3. 割り込み許可と優先度を設定する．

```c:"hwsetup.c"
void SCI6_init(void);

void HardwareSetup(void)
{
	SCI6_init();
}
```
```c:
/*=================================
 * 関数名 : SCI6_init
 * 機能 : SCI6の初期化
 * 引数 : なし
 * 戻り値 : なし
 * 備考 :通信速度 2400bps，RXI及びERI割り込み
 * ===============================*/
void SCI6_init(void)
{
    /*=== プロテクト解除 ===*/
    SYSTEM.PRCR.WORD = 0xA502;
    /*=== SCI6を有効化 ===*/
    MSTP(SCI6) = 0;
    /*=== プロテクト ===*/
    SYSTEM.PRCR.WORD = 0xA500;
    /*=== 端子機能の有効化 ===*/
    PORT3.PMR.BIT.B2 = 1;
    PORT3.PMR.BIT.B3 = 1;
    /*=== ピン機能設定 プロテクト解除===*/
    MPC.PWPR.BIT.B0WI = 0;
    MPC.PWPR.BIT.PFSWE = 1;
    /*=== ピン機能設定 ===
    * P32 > TXD0
    * P33 > RXD0
    * ================*/
    MPC.P32PFS.BIT.PSEL = 0x0A;
    MPC.P33PFS.BIT.PSEL = 0x0A;
    /*=== ピン機能設定 プロテクト===*/
    MPC.PWPR.BIT.PFSWE = 0;
    MPC.PWPR.BIT.B0WI = 1;
    /*=== SCR設定 割り込み禁止 SCK未使用 ===*/
    SCI6.SCR.BIT.TEIE = 0;
    SCI6.SCR.BIT.MPIE = 0;
    SCI6.SCR.BIT.RE = 0;
    SCI6.SCR.BIT.TE = 0;
    SCI6.SCR.BIT.RIE = 1;
    SCI6.SCR.BIT.TIE = 0;
    SCI6.SCR.BIT.CKE = 0;
    /*=== シリアルインターフェース ===*/
    SCI6.SIMR1.BIT.IICM = 0;
    /*=== クロックセレクト > 極性反転なし 遅れなし ===*/
    SCI6.SPMR.BIT.CKPH = 0;
    SCI6.SPMR.BIT.CKPOL = 0;
    /*=== 通信フォーマット設定 ===
     * クロック : PCLK
     * ストップビット : 1bit
     * パリティ : なし
     * データ長 : 8bit
     * 調歩同期式
     * ====================*/
    SCI6.SMR.BIT.CKS = 2;
    SCI6.SMR.BIT.MP = 0;
    SCI6.SMR.BIT.STOP = 0;
    SCI6.SMR.BIT.PM = 0;
    SCI6.SMR.BIT.PE = 0;
    SCI6.SMR.BIT.CHR = 0;
    SCI6.SMR.BIT.CM = 0;
    /*=== 通信ビットレート設定 ===
     * 転送速度 2400bps
     * ===============*/
    SCI6.SEMR.BIT.ABCS = 0;
    SCI6.BRR = 38;
    /*=== 割り込み優先度設定 ===*/
    IPR(SCI6,RXI6) = 5;
    /*=== 割り込み許可 ===*/
    IEN(SCI6,RXI6) = 1;
    /*=== 通信開始 ===*/
    SCI6.SCR.BIT.RE = 1;
    SCI6.SCR.BIT.TE = 1;
}
```

### 割り込み関数
受信データをリードする割り込み関数を作成する．

```c:"vect.h"
// SCI6 RXI6
//#pragma interrupt (Excep_SCI6_RXI6(vect=232))
//void Excep_SCI6_RXI6(void);
#pragma interrupt (Ctrl_read(vect=232))
void Ctrl_read(void);
```

```c:"sci.h"
extern unsigned char ctrl_cmd[8];
```

```c:"sci.c"
#include"iodefine.h"
#include"sci.h"
#include"vect.h"

unsigned char ctrl_cmd[8];

/*=================================
 * 関数名 : Ctrl_read
 * 機能 : コントローラからの情報(8byte)を受信する
 * 引数 : なし
 * 戻り値 : なし
 * 備考 :UART(SCI6)，RXI割り込み
 * ===============================*/
void Ctrl_read(void)
{
	static int n = 0;

	/*=== データ受信 ===*/
	ctrl_cmd[n] = SCI6.RDR;
	/*=== データ格納先更新 ===*/
		n++;
	/*=== 全データ受信完了 ===*/
	if(n == 8)
	{
		/*=== カウントクリア ===*/
		n = 0;

	}
}
```

### エラー処理関数
SCIの受信エラーのフラグは，次の3つがある(HM 35.2.7)．
SSR.ORER：オーバランエラーフラグ
SSR.PER：パリティエラーフラグ
SSR.FER：フレーミングエラーフラグ
SCR.RIE=1に設定しているときに，いずれかのフラグが立つと，ERI割り込みが発生する(HM 35.2.6)．

ERI割り込みはグループ化されてベクタ番号114に割り当てられている．表15.4のグループ12に記載されている． 図35.14のフローチャートを参考にエラー処理関数を作成する．

オーバーランエラー処理は，RDRレジスタをリードした後にフラグをクリアする．他は詳細不明．

# 参考文献
- https://www.renesas.com/jp/ja/doc/products/mpumcu/apn/rx/001/r01an1449jj0100_rx63n.pdf
- https://japan.renesasrulz.com/cafe_rene/f/forum5/1595/rx