在支援即時的應用程式中使用外部中斷

Azure 球體支援在 MT3620 的 RTApps 中使用外部中斷。 在 MT3620 即時核心上,這類中斷不會直接使用 GPIO;相反地,它們是與 GPIO 無關的有線。 RTApp 可以設定外部中斷,以便偵測和回應外接圖釘上的訊號。

如需 MT3620 即時核心的相關資訊,請參閱 MT3620 M4 使用者手冊。 如需註冊基本位址、中斷號碼及類似詳細資料的其他資訊,請透過電子郵件向 Avnet 要求「MT3620 M4 資料工作表」 Azure.Sphere@avnet.com

外部中斷需求

若要在 MT3620 上的 RTApp 中使用外部中斷:

  • 要求中斷app_manifest.json 檔案。
  • 撰寫回應訊號的中斷處理常式。
  • 初始化、設定及啟用中斷功能。

應用程式資訊清單設定

若要使用外部中斷,RTApp 必須將其列在應用程式資訊清單 [ 功能 ] 區段的 [ExternalInterrupt] 欄位中。 識別字串從 EINT0 到 EINT23 的中斷。 例如,下列行指定外部中斷 8:

   "Capabilities": {
    "ExternalInterrupt": [ "EINT8"]
  }

外部中斷與 GPIO 的多工作方式與其他周邊設備相同,而且在多重執行時也適用相同的規則。 只要裝置上沒有其他應用程式 (高階或 RTApp) ,您的 RTApp 可以使用任何您偏好的 EINT。 如需周邊介面多工介面的詳細資訊,請參閱 I/O 介面

如果您的 Azure 球體應用程式案例也包含乙太網路保護盾,RTApp 就無法使用 EINT4-EINT7,因為盾牌使用 GPIO 5 (在高階應用程式中對應到 EINT5) ,因此會保留該區塊內的所有其他圖釘。

中斷處理常式

中斷處理常式的名稱必須與 M4 向量資料表中要求中斷的名稱相同。 請參閱 GitHub 上的 Codethink Labs MT3620 M4 驅動程式範例 ,以取得範例 VectorTable.h 和 VectorTable.c 檔案。

在範例 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 和對應的檔。