1.割り込みの概要
1.1割り込み応答メカニズムと分類
CPUが通常のプログラムを処理しているとき、より高い需要レベルのタスクを処理する必要がある場合があるため、現在のタスクプロセスを中断して、割り込みサービスルーチンに入る必要があります。これらの追加タスクを処理した後、前のタスクに戻る必要があります。したがって、メインタスクが中断され、割り込みプログラムが完了した後、前のタスクに正確に戻ることができるように、割り込みプログラムに入る前にシーンを保存する必要があります。タスクノード。
割り込み要求は次のように分類できます。
- マスク可能な割り込み:優先度を判断して処理できます
- マスク不可能な割り込み:CPUプロセスを強制的に停止し、リセットやNMIなどの割り込みプログラムに入ります。
割り込みソースは、次の2つのカテゴリに分類することもできます。
- オンチップ内部割り込みソース:PWM、CAP、QEP、タイマーなど。
- チップ外部割り込みソース:外部割り込み入力ピンXINT1およびXINT2によって導入された信号
1.2割り込み構造
F28335には多くの周辺リソースがあります。これらの周辺リソースは同時にCPUに追加のタスクを解放する可能性があります。つまり、F28335の多くの割り込みソースがあります。これらの割り込みソースがCPUの応答を必要とする場合、割り込みラインを介して信号を送信する必要があります。 CPUへ。ただし、F28335の割り込みライン数には制限があります。このとき、PIEモジュールは割り込みリソースを割り当てます。
図からわかるように、
- 外部割り込みソースは、PIEモジュールを介して判断および処理されます
- 内部割り込みソースのうち、タイマー1とタイマー2はINT13とINT14で別々に処理され、その他はPIEモジュールで処理されます。
- PIEモジュールはINT〜INT12を処理します
- 合計16本の割り込みライン
2.割り込み管理モジュールPIE
PIEモジュールの機能は、割り込みラインが制限されている場合に、複数の割り込みソースのトリガーを管理することです。
2.1PIEモジュール構造
PIEの構造を上の図に示します。PIEモジュールは、複数の割り込みグループと、各割り込みグループのマルチプレクサで構成されています。INT1からINT12までは、PIEモジュールによって管理されるマスク可能な割り込みであり、これらの12の割り込みはそれぞれ、外部で設計された8つの割り込みで構成されます。たとえば、INT1.Xは途中のINT1.1〜INT1.8に対応します。周辺機器レベルの割り込みは、対応する外部割り込みソースピンです。
PIEモジュールは、これらの8つの周辺割り込みを8対1のマルチプレクサを介してグループにグループ化します。プログラムで構成するときは、この構造に基づいて構成します。
PIE応答の優先順位を補足する
- INT1> INT2> ...> INT12
- INT1.1> INT1.2> ...> INT1.8
2.2PIEモジュールの応答メカニズム
PIEモジュールには管理するペリフェラルが非常に多いため、対応する応答シーケンスとレジスタを構成する必要があります。
PIEモジュールでは、割り込みの各グループに対応する割り込みフラグ(PIEIFRx)とイネーブルビット(PIEIERx.y)があります。さらに、PIE割り込みの各グループ(INT1〜INT12)には応答フラグ(PIEACK)があります。次の図は、PIEIFRとPIEIERの設定が異なるPIEハードウェアの操作フローを示しています。
PIEコントローラーが割り込みを生成すると、対応する割り込みフラグビット(PIEIFRx.y)が設定されます。対応するPIE割り込みイネーブルビットも1に設定されている場合、PIEは対応するPIEACKxをチェックして、CPUが割り込みに応答する準備ができているかどうかを判断します。対応するPIEACKxビットがクリアされると、PIEはCPUに割り込みを適用します。PIEACKxが1に設定されている場合、PIEは、対応するPIEACKxがクリアされるまで待機してから、CPUに割り込みを適用します。PIEは、PIEACKxビットを制御して、各グループの1つの割り込みのみに応答できるように制御します。応答が行われたら、PIEACKx応答をゼロにクリアして、グループの背面からの割り込みに応答できるようにする必要があります。
たとえば、CPUがINT1.1割り込みに応答するようにしたい場合です。
ちょうど求めている
- PIEIFR1.1ロゴ位置1
- PIEIFR1.1イネーブルビット1
- PIEIFR1.1応答フラグビット1
- IFRグローバルフラグ位置1(INT1〜INT12のみ)
- IERグローバル割り込みイネーブルが1に設定されている(INT1〜INT12の場合のみ)
2.3割り込みベクトルテーブル
F28335の各割り込みソースに対応するアドレスが事前に設定されているため、変更できないため、割り込みベクタテーブルを用意する必要があります。
図からわかる
- INT1〜INT12のそれぞれは8つの外部割り込みに対応します
- 合計96のレスポンシブリソースがあり、豊富なリソースがたくさんあります
2.4割り込み設定の簡単な例
割り込みの構成は、PIEモジュールの応答メカニズムに完全に対応しています。
外部割り込みXINT1を構成します。
最初の一歩:
基本的な初期化の後、通常はInitPieVectTable()でPIEモジュールを指定し、PIEモジュールが初期化された後に指定します。
void main(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.XINT1 = &xint1_isr;
EDIS;
}
2番目のステップ:
PIEモジュールのクロックをオンにします。割り込みベクトルテーブルを照会した後、外部割り込みXINT1がINT1.4で有効になっていることがわかります。この割り込み有効をオンにします。
void main(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.XINT1 = &xint1_isr; //赋予中断地址
EDIS;
IER |= M_INT1; //全局使能INT1
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; //使能INT1.4
EINT;
ERTM;
}
その時、PIEIFRフラグはどこで1になるのだろうと思っていました。実際、割り込みに応答すると自動的に1に設定されていました。彼がスムーズに通過できるように、それを有効にする必要があるだけです。
3番目のステップ:
割り込みに関数を書き込み、割り込みの割り込み応答フラグPIEACKをクリアします。
interrupt void xint1_isr(void)
{
Xint1Count++;
GpioDataRegs.GPACLEAR.all = 0x4;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}