外部割込み

# はじめに
外部割込みの設定諸々についての記述．マイコンボードは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)


# 外部割込みとは
外部から信号が入力されたら，任意のプログラムを実行する．


# 外部割込み設定
HM 1.5 表1.9より，外部割込みをしたい端子に対応するIRQnを確認する（例：PC0 > IQR14）．基本的に，HM 15.5.7の動作手順に従って設定を行う．
流れ
1. 割り込み要求の禁止
2. デジタルフィルタの無効
3. サンプリングクロックの設定
4.  I/O ポートの設定
5.  検出方法の設定
6.  IRn.IRフラグクリア
7.  デジタルフィルタの有効
8.  割り込み要求の許可

### 初期化関数
```c:"hwsetup.c"
void IRQ14_init(void);

void HardwareSetup(void)
{
	IRQ14_init();
}
```
```
/*=================================
 * 関数名 : IRQ14_init
 * 機能 : 外部割込みIRQ14の初期化
 * 引数 : なし
 * 戻り値 : なし
 * 備考 : サンプリングクロック設定:PCLK/8 割り込み優先度:3
 * ===============================*/
void IRQ14_init(void)
{
	/*=== 割り込み要求の禁止 ===*/
	IEN(ICU,IRQ14) = 0;
	/*=== デジタルフィルタの無効 ===*/
	ICU.IRQFLTE1.BIT.FLTEN14 = 0;
	/*=== サンプリングクロック設定  > PCLK/8 ===*/
	ICU.IRQFLTC1.BIT.FCLKSEL14 = 0x01;
	/*=== I/Oポート設定 ===*/
	PORTC.PDR.BIT.B0 = 0;
	/*=== ピン機能設定 プロテクト解除===*/
	MPC.PWPR.BIT.B0WI = 0;
	MPC.PWPR.BIT.PFSWE = 1;
	/*=== ピン機能設定 ===
	 * PC0 > IRQn入力端子として使用する
	 * ================*/
	MPC.PC0PFS.BIT.ISEL = 1;
	/*=== ピン機能設定 プロテクト===*/
	MPC.PWPR.BIT.PFSWE = 0;
	MPC.PWPR.BIT.B0WI = 1;
	/*=== 検出方法設定 ===*/
	ICU.IRQCR[14].BIT.IRQMD = 0x00;
	/*=== フラグクリア ===*/
	ICU.IR[14].BIT.IR = 0;
	/*=== 割り込み優先度設定 ===*/
	IPR(ICU,IRQ14) = 3;
	/*=== デジタルフィルタの有効 ===*/
	ICU.IRQFLTE1.BIT.FLTEN14 = 1;
	/*=== 割り込み要求の許可 ===*/
	IEN(ICU,IRQ14) = 1;
}
```

### 割り込み関数
```c:"icu.c"
#include"iodefine.h"
#include"vect.h"
#include"icu_cmt.h"
#include"name.h"

void LED_quickly(void)
{
	LED = LED_ON;
	Delay(10);
	LED = LED_OFF;
	Delay(10);

}
```
新たにファイルを作成して，割り込みによってやりたいことを記述した関数を作成する．この関数の宣言は既存のvect.hの中でやることになる．

```c:"vect.h"
// ICU IRQ14
//#pragma interrupt (Excep_ICU_IRQ14(vect=78))
//void Excep_ICU_IRQ14(void);
#pragma interrupt (LED_quickly(vect=78))
void LED_quickly(void);
```
vect.hの// ICU IRQ14直下の2行をコメントアウトして，自作した関数名に書き換える．割り込み関数を既存の` Excep_ICU_IRQ14`にする場合は，/generate/intprg.cに用意されている関数内にプログラムを書く．

### 詳細

#### 初期化関数

##### 1. 割り込み要求の禁止
```c
IEN(ICU,IRQ14) = 0;
```
HM 1.5表1.9より，確認した端子と対応するIRQnの割り込みをマクロ関数を用いて，`=0`で禁止する．関数の引数は，割り込み要求発生元と名称である．なお，関数を使わない場合は以下の通りである．

```c
ICU.IER[0x9].BIT.IEN6 = 0;
```
HM15.2.2より，割り込み要因IQRnと IERm.IENj ビットの対応は，「HM 3.1 表15.3　割り込みのベクタテーブル」を参照する（例：PC0 > IRQ14 > IER09.IEN6）．IERは16進数表現らしく`IER[0xn]`と表現する必要がある（[参考](https://ja.na4.teamsupport.com/knowledgeBase/17794801)）．


##### 2. デジタルフィルタの無効
```c
ICU.IRQFLTE1.BIT.FLTEN14 = 0;
```
HM 15.2.9-10より，デジタルフィルタを`=0`で無効にする．IRQnに対応したビットに対して設定を行う．

##### 3. サンプリングクロックの設定
```c
ICU.IRQFLTC1.BIT.FCLKSEL14 = 0x01;
```
HM 15.2.11-12より，PCLKに対するサンプリングクロックの分周を設定する．IRQnに対応したビットに対して設定を行う．

##### 4.  I/O ポートの設定
```c
PORTC.PDR.BIT.B0 = 0;
```
HM21.3.1より，入力ポートとして設定する．

```c
/*=== ピン機能設定 プロテクト解除===*/
MPC.PWPR.BIT.B0WI = 0;
MPC.PWPR.BIT.PFSWE = 1;
/*=== ピン機能設定 ===
* PC0 > IRQn入力端子として使用する
* ================*/
MPC.PC0PFS.BIT.ISEL = 1;
/*=== ピン機能設定 プロテクト===*/
MPC.PWPR.BIT.PFSWE = 0;
MPC.PWPR.BIT.B0WI = 1;
```
HM22.2.1より，マルチファンクションのプロテクト解除をする．HM22.2.14より，端子を`=1`でIQRnとして使用する．

##### 5.  検出方法の設定
```c
ICU.IRQCR[14].BIT.IRQMD = 0x00;
```
HM 15.2.8より，外部割込みの検出方法の設定をする．`=0x00`でLOWで検出．`IRQCR[i]`のiにIRQnの番号を入れる．

##### 6.  IRn.IRフラグクリア
```c
ICU.IR[14].BIT.IR = 0;
```
HM15.2.1より，割り込み要求のフラグをクリアする．`IR[i]`のiにIRQnの番号を入れる．

##### 7.  デジタルフィルタの有効
```c
ICU.IRQFLTE1.BIT.FLTEN14 = 0;
```
HM 15.2.9-10より，デジタルフィルタを`=1`で無効にする．IRQnに対応したビットに対して設定を行う．

##### 8.  割り込み要求の許可
```c
IEN(ICU,IRQ14) = 1;
```
HM 1.5表1.9より，確認した端子と対応するIRQnの割り込みをマクロ関数を用いて，`=1`で許可する．


# 参考文献
- レジスタ表記 https://ja.na4.teamsupport.com/knowledgeBase/17794801
- FAQ  https://japan.renesasrulz.com/cafe_rene/f/forum5/3681/rx621-irq#pi4368=2
- FAQ https://japan.renesasrulz.com/cafe_rene/f/002-2095199602/4876/rx62n
- IRQ 外部割込みサンプル　：　RX63N http://pgstudynotes.blogspot.com/2017/05/irq-rx63n.html