在支持实时的应用程序中使用外部中断

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 和相应的文档。