|
ハードウェアマニュアル(R01UH0033JJ0140)の「11.3 ベクタテーブル」の表11.4 に、IRQ14 の仕様一覧が記載されているので、メモしておきます。
ベクタ番号:78、IER:IER09.IEN6、IPR:IPR2E の値が重要になります。
ソースコード冒頭の以下の部分は、割り込みが発生したときに、
何の処理を行うかを決める宣言です。
#pragma interrupt は、決まり文句です。
その後に呼び出す関数名を指定します。呼び出す関数は、引数や戻り値が設定できません。
値は、グローバル変数等で受け渡します。
割り込みの指定は、割り込み名ではなく、先ほど調べたベクタ番号を指定します。
宣言はベクタ番号ごとに1回しかできないため、vect.h の宣言をコメントアウトします。
#pragma interrupt int_func (vect=78) // IRQ14
次にIRQ14を割り込み入力として使う場合、信号の立ち上がり、立ち下がりのどちらで割り込みを発生させるかの設定をします。ハードウェアマニュアル「11.2.8 IRQ コントロールレジスタn(IRQCRn)(n =0 〜 15)」 を使用します。
ソースコードでは以下のように記述します。 ICU.IRQCR[].BIT.IRQMD は決まり文句で、要素番号はIRQ** の数値を指定します。
ICU.IRQCR[14].BIT.IRQMD = 1; // IRQ検出設定ビット 0b01:立ち下がりエッジ
次に割り込みの優先順位を設定します。1(最低)〜15(最高)の順位を設定することができ、初期値は0(割り込み禁止)となっています。ここの設定を忘れると割り込みが発生しません。ハードウェアマニュアル「11.2.3 割り込み要因プライオリティレジスタm(IPRm)(m= 00h~8Fh)」 を使用します。
ソースコードでは以下のように記述します。ICU.IPR[].BIT.IPR は決まり文句で、要素番号は「11.3 ベクタテーブル」の表11.4 で調べたIPRの値 IPR2E の下2桁を16進数で指定します。
ICU.IPR[0x2E].BIT.IPR = 0xF; // 割り込みレベル 15(最高)
次に割り込みの状態レジスタをクリアします。この処理はしなくてもかまいません。ハードウェアマニュアル「11.2.1 割り込み要求レジスタi(IRi)( i = 割り込みベクタ番号)」 を使用します。
ソースコードでは以下のように記述します。
ICU.IR[].BIT.IR は決まり文句で、要素番号はベクタ番号を指定します。
ICU.IR[78].BIT.IR = 0; // 割り込みステータスレジスタリセット
最後に割り込み許可/禁止を設定します。機能のON/OFFを設定する項目です。ここの設定を忘れると割り込みが発生しません。ハードウェアマニュアル「11.2.2 割り込み要求許可レジスタm(IERm)(m = 02h 〜 1Fh)」 を使用します。
ソースコードでは以下のように記述します。ICU.IER[] は決まり文句で、要素番号は「11.3 ベクタテーブル」の表11.4 で調べた IERの値 IER09 の下2桁を16進数で指定します。
BIT.*** の部分は、IERの値 IER09.IEN6 の IEN6 をそのまま当てはめます。割り込み1つを使うのに、煩雑で非常に分かりにくいと思います。この使い勝手の悪さが、ルネサスマイコンが世間で使われなくなった要因の1つと言われています。
ICU.IER[0x09].BIT.IEN6 = 1; // IRQ14(vect=78) 割り込み許可
|