在即時可用的應用程式中使用外部中斷
重要
這是 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 和對應的檔。