リアルタイム対応アプリケーションで外部割り込みを使用する
Azure Sphere では、MT3620 の RTApps での外部割り込みの使用がサポートされています。 MT3620 リアルタイム コアでは、このような割り込みは GPIO を直接使用しません。代わりに、GPIO とは独立してワイヤードされます。 RTApp は外部割り込みを構成して、外部ピンの信号を検出して応答できます。
MT3620 のリアルタイム コアについては、MT3620 M4 ユーザー マニュアルを参照してください。 登録ベース アドレス、割り込み番号などの詳細については、Avnet から電子メール Azure.Sphere@avnet.com
で "MT3620 M4 データシート" を要求します。
外部割り込みの要件
MT3620 の RTApp で外部割り込みを使用するには:
- app_manifest.json ファイルで割り込みを要求します。
- シグナルに応答する割り込みハンドラーを記述します。
- 割り込み機能を初期化、構成、および有効にします。
アプリケーション マニフェストの設定
外部割り込みを使用するには、RTApp がそれをアプリケーション マニフェストの [ 機能 ] セクションの [ExternalInterrupt] フィールドに一覧表示する必要があります。 EINT0 から EINT23 への文字列によって割り込みを識別します。 たとえば、次の行は外部割り込み 8 を指定します。
"Capabilities": {
"ExternalInterrupt": [ "EINT8"]
}
外部割り込みは他の周辺機器と同じ方法で GPIO で多重化され、多重化に関しても同じ規則が適用されます。 RTApp では、デバイス上の他のアプリケーション (高レベルまたは RTApp) が同じブロックにマップされる周辺機器を使用していない場合は、任意の EINT を使用できます。 周辺機器インターフェイスの多重化方法については、「 I/O 周辺機器」を参照してください。
Azure Sphere アプリケーション シナリオにイーサネット シールドも含まれている場合、EINT4-EINT7 は RTApp では使用できません。これは、シールドがハイレベル アプリで GPIO 5 (EINT5 にマップ) を使用するため、そのブロック内の他のすべてのピンを予約するためです。
割り込みハンドラー
割り込みハンドラーの名前は、M4 のベクター テーブル内の要求された割り込みと同じである必要があります。 サンプル VectorTable.h ファイルと VectorTable.c ファイルについては、GitHub の Codethink Labs MT3620 M4 ドライバー サンプル を参照してください。
VectorTable.c ファイルのサンプルでは、ベクター テーブルの次のエントリは EINT8 を表します。これはブロック 3 のピン 0 です。
[INT(28)] = gpio_g2_irq0,
サンプル内の対応する割り込みハンドラーは です gpio_g2_irq0
。
void gpio_g2_irq0(void)
{
UART_Print(debug, "Interrupt handled.\r\n");
}
独自のアプリケーションのベクター テーブルでは、割り込みハンドラーに任意の名前を付けることができます。
割り込みを初期化、構成、および有効にする
RTApp の メイン() 関数に、ベクター テーブルを初期化するコードを含め、割り込みの EINT コントロール レジスタを構成し、割り込みハンドラーを有効にします。
Codethink ドライバーのサンプルでは、関数を定義します VectorTableInit()
。 この初期化関数を要件に合わせて調整できます。
EINT コントロール レジスタを構成するには、M4 データシートで定義されているように初期化する必要があります。 たとえば、次の関数は、指定した を含むブロックを初期化します pin
。 この関数は、レジスタ値0x300を使用して、すべての外部割り込みを定義します。これにより、デバウンスとアクティブロー割り込みが可能になります。
#define MT3620_CM4_IRQ_DBNC_CNTRL_DEF 0x300
int32_t EINT_ConfigurePin(uint32_t pin)
{
mt3620_gpio_block_e block = pinToBlock(pin);
if ((block < MT3620_GPIO_BLOCK_0) || (block > MT3620_GPIO_BLOCK_5)) {
return ERROR_EINT_NOT_A_PIN;
}
uint32_t pinMask = getPinMask(pin, block);
uint32_t eintBlock = block - MT3620_GPIO_BLOCK_0;
switch(pinMask) {
case 1:
mt3620_cm4_irq[eintBlock]->cm4_dbnc_con0 = MT3620_CM4_IRQ_DBNC_CNTRL_DEF;
break;
case 2:
mt3620_cm4_irq[eintBlock]->cm4_dbnc_con1 = MT3620_CM4_IRQ_DBNC_CNTRL_DEF;
break;
case 4:
mt3620_cm4_irq[eintBlock]->cm4_dbnc_con2 = MT3620_CM4_IRQ_DBNC_CNTRL_DEF;
break;
case 8:
mt3620_cm4_irq[eintBlock]->cm4_dbnc_con3 = MT3620_CM4_IRQ_DBNC_CNTRL_DEF;
break;
default:
break;
}
return ERROR_NONE;
}
アプリは、次のようにこの関数を呼び出すことができます。
if (EINT_ConfigurePin(8) != ERROR_NONE) {
UART_Print(debug, "ERROR: EINT initialization failed\r\n");
}
最後に、アプリで割り込みを有効にする必要があります。この例では、 NVIC_Enable
Codethink ドライバー サンプルの 関数を使用します。
NVIC_EnableIRQ(28, 2);
外部割り込み API とサンプル コード
Codethink Labs の一般的なコード例に加えて、MediaTek からドライバー API と対応するドキュメントを見つけることができます。
- MediaTek からの外部割り込みソース コード
- MediaTek からの外部割り込みヘッダー ファイル
- MediaTek からの EINT API リファレンス マニュアル