リアルタイム対応アプリケーションで外部割り込みを使用する
重要
これは Azure Sphere (レガシ) のドキュメントです。 Azure Sphere (レガシ) は 2027 年 9 月 27 日に 再提供されておりユーザーは現時点で Azure Sphere (統合) に移行する必要があります。 TOC の上にある Version セレクターを使用して、Azure Sphere (統合) のドキュメントを表示します。
Azure Sphere では、MT3620 の RTApps での外部割り込みの使用がサポートされています。 MT3620 リアルタイム コアでは、このような割り込みは GPIO を直接使用しません。代わりに、GPIO とは独立してワイヤードされます。 RTApp は、外部ピンの信号を検出して応答できるように、外部割り込みを構成できます。
MT3620 のリアルタイム コアについては、 MT3620 M4 ユーザー マニュアル を参照してください。 レジスタのベース アドレス、割り込み番号、および同様の詳細の詳細については、電子メール Azure.Sphere@avnet.com
で Avnet から "MT3620 M4 データシート" を要求します。
外部割り込みの要件
MT3620 の RTApp で外部割り込みを使用するには:
- app_manifest.json ファイルで割り込みを要求します。
- シグナルに応答する割り込みハンドラーを記述します。
- 割り込み機能を初期化、構成、および有効にします。
アプリケーション マニフェストの設定
外部割り込みを使用するには、RTApp がアプリケーション マニフェストの Capabilities セクションの "ExternalInterrupt" フィールドにそれを一覧表示する必要があります。 EINT0 から EINT23 までの文字列によって割り込みを識別します。 たとえば、次の行は外部割り込み 8 を指定します。
"Capabilities": {
"ExternalInterrupt": [ "EINT8"]
}
外部割り込みは、他の周辺機器と同じ方法で GPIO で多重化され、多重化に関して同じ規則が適用されます。 デバイス上の他のアプリケーション (高レベルまたは RTApp) が同じブロックにマップされている周辺機器を使用していない場合、RTApp は任意の EINT を使用できます。 周辺機器インターフェイスの多重化方法については、「 I/O 周辺機器 を参照してください。
Azure Sphere アプリケーション シナリオにイーサネット シールドも含まれている場合、上位レベルのアプリで GPIO 5 (EINT5 にマップされる) を使用するため、EINT4-EINT7 は RTApp では使用できません。そのため、そのブロック内の他のすべてのピンを予約します。
割り込みハンドラー
割り込みハンドラーは、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 の main() 関数に、ベクター テーブルを初期化し、割り込みの 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");
}
最後に、アプリで割り込みを有効にする必要があります。この例では、Codethink ドライバーサンプルの NVIC_Enable
関数を使用します。
NVIC_EnableIRQ(28, 2);
外部割り込み API とサンプル コード
Codethink Labs の 一般的なコード例に加えて MediaTek からドライバー API と対応するドキュメントを見つけることができます。