在支持实时的应用程序中使用外部中断
Azure Sphere 支持在 MT3620 的 RTApps 中使用外部中断。 在 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 应用程序方案还包括以太网防护板,则 EINT4-EINT7 对 RTApp 不可用,因为该防护板使用 GPIO 5 (映射到高级应用中的 EINT5) ,从而在该块中保留所有其他引脚。
中断处理程序
中断处理程序必须与 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");
}
最后,应用必须启用中断;此示例使用 NVIC_Enable
Codethink 驱动程序示例中的 函数:
NVIC_EnableIRQ(28, 2);
外部中断 API 和示例代码
除了 Codethink Labs 提供的常规示例代码外,还可以从 MediaTek 找到驱动程序 API 和相应的文档。
- 来自 MediaTek 的外部中断源代码
- 来自 MediaTek 的外部中断头文件
- 来自 MediaTek 的 EINT API 参考手册