在支援即時的應用程式中使用外部中斷
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 和對應的檔。
- 來自 MediaTek 的外部中斷原始程式碼
- MediaTek 的外部中斷頁首檔案
- 來自 MediaTek 的 EINT API 參考手冊