Sdílet prostřednictvím


Použití externích přerušení v aplikacích podporujících real-time

Azure Sphere podporuje použití externích přerušení v RTApps pro MT3620. Na jádrech MT3620 v reálném čase taková přerušení nepoužívají GPIO přímo; místo toho jsou připojeny nezávisle na GPIO. Aplikace RTApp může nakonfigurovat externí přerušení tak, aby rozpoznala signál na externím pin kódu a reagovala na něj.

Informace o jádrech mt3620 v reálném čase najdete v uživatelské příručce MT3620 M4. Pokud potřebujete další informace o základních adresách registru, číslech přerušení a podobných podrobnostech, požádejte o datový list MT3620 M4 z Avnetu Azure.Sphere@avnet.come-mailem.

Požadavky na externí přerušení

Použití externího přerušení v aplikaci RTApp na MT3620:

  • Vyžádejte si přerušení v souboru app_manifest.json.
  • Napište obslužnou rutinu přerušení, která reaguje na signál.
  • Inicializace, konfigurace a povolení funkce přerušení

Nastavení manifestu aplikace

Pokud chcete použít externí přerušení, musí ho aplikace RTApp uvést v poli ExternalInterrupt v části Capabilities (Schopnosti ) manifestu aplikace. Identifikujte přerušení řetězcem z EINT0 do EINT23. Například následující řádek určuje externí přerušení 8:

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

Externí přerušení se s funkcí GPIO multiplexují stejným způsobem jako jiná periferní zařízení a platí stejná pravidla týkající se multiplexování. RtApp může používat libovolný EINT, kterému dáváte přednost, za předpokladu, že žádná jiná aplikace (vysoká nebo RTApp) v zařízení nepoužívá periferní zařízení, které se mapuje na stejný blok. Informace o tom, jak jsou rozhraní periferních zařízení multiplexovaná, najdete v tématu I/O Periferie .

Pokud váš scénář aplikace Azure Sphere zahrnuje také ethernetový štít, není EINT4-EINT7 pro RTApp k dispozici, protože štít používá GPIO 5 (který se mapuje na EINT5) v aplikaci vysoké úrovně, a proto si vyhrazuje všechny ostatní piny v rámci daného bloku.

Obslužná rutina přerušení

Vaše obslužná rutina přerušení musí mít stejný název jako požadované přerušení ve vektorové tabulce pro M4. Ukázkové soubory VectorTable.h a VectorTable.c najdete v ukázkách ovladačů Codethink Labs MT3620 M4 na GitHubu.

V ukázkovém souboru VectorTable.c následující položka v tabulce vektorů představuje EINT8, který je pin 0 v bloku 3:

[INT(28)] = gpio_g2_irq0,

Odpovídající obslužná rutina přerušení v ukázce je gpio_g2_irq0:

void gpio_g2_irq0(void)
{
    UART_Print(debug, "Interrupt handled.\r\n");
}

Ve vektorové tabulce pro vlastní aplikaci můžete obslužnou rutinu přerušení pojmenovat, jak chcete.

Inicializace, konfigurace a povolení přerušení

Do funkce main() aplikace RTApp zahrňte kód pro inicializaci vektorové tabulky, nakonfigurujte registr ovládacího prvku EINT pro přerušení a povolte obslužnou rutinu přerušení.

Ukázky ovladačů Codethink definují VectorTableInit() funkci. Tuto inicializační funkci můžete přizpůsobit vašim požadavkům.

Pokud chcete nakonfigurovat registr ovládacího prvku EINT, budete ho muset inicializovat podle definice v datovém listu M4. Následující funkce například inicializuje blok, který obsahuje zadaný pinobjekt . Funkce definuje všechna externí přerušení s hodnotou registru 0x300, která umožňuje debouncing a přerušení aktivní-nízká.

#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;
}

Aplikace může tuto funkci volat následujícím způsobem:

if (EINT_ConfigurePin(8) != ERROR_NONE) {
    UART_Print(debug, "ERROR: EINT initialization failed\r\n");
}

Nakonec musí aplikace povolit přerušení. Tento příklad používá NVIC_Enable funkci z ukázek ovladačů Codethink:

NVIC_EnableIRQ(28, 2);

Rozhraní API externího přerušení a ukázkový kód

Kromě obecného ukázkového kódu z Codethink Labs najdete rozhraní API ovladače a odpovídající dokumentaci z MediaTek.