共用方式為


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

重要

這是 Azure Sphere (舊版) 檔。 Azure Sphere(舊版)將於 2027 年 9 月 27 日淘汰,且使用者此時必須移轉至 Azure Sphere(整合式)。 使用位於 TOC 上方的版本選取器來檢視 Azure Sphere (整合式) 檔。

Azure Sphere 支援在 RTApps 中使用 MT3620 的外部中斷。 在 MT3620 實時核心上,這類中斷不會直接使用 GPIO;相反地,它們與 GPIO 無關。 RTApp 可以設定外部中斷,以便偵測並回應外部針腳上的訊號。

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

外部中斷需求

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

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

應用程式指令清單設定

若要使用外部中斷,RTApp 必須在應用程式指令清單的 [功能 ] 區段的 [ExternalInterrupt] 字段中列出它。 從EINT0到 EINT23 的字串識別中斷。 例如,下列這一行會指定外部中斷 8:

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

外部中斷會以與其他周邊相同的方式搭配 GPIO 進行多任務處理,而且套用與多任務處理相同的規則。 您的 RTApp 可以使用您偏好的任何 EINT,前提是裝置上沒有任何其他應用程式 (高階或 RTApp) 會使用對應至相同區塊的周邊。 如需周邊介面多任務處理方式的相關信息,請參閱 I/O 周邊

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

插斷處理程式

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

在範例 VectorTable.c 檔案中,向量數據表中的下列專案代表 EINT8,這是區塊 3 中的 pin 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");
}

最後,應用程式必須啟用中斷;此範例使用 NVIC_Enable Codethink 驅動程式範例中的 函式:

NVIC_EnableIRQ(28, 2);

外部中斷 API 和範例程式代碼

除了 Codethink Labs一般範例程式代碼之外,您還可以從 MediaTek 找到驅動程式 API 和對應的檔。