Sdílet prostřednictvím


Použití externích přerušení v aplikacích podporujících v reálném čase

Důležité

Toto je dokumentace k Azure Sphere (starší verze). Azure Sphere (starší verze) se vyřazuje 27. září 2027 a uživatelé musí do této doby migrovat do Azure Sphere (integrované). K zobrazení dokumentace k Azure Sphere (integrované) použijte selektor verzí umístěný nad obsahem.

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 drátové nezávisle na GPIO. Aplikace RTApp může nakonfigurovat externí přerušení, aby bylo možné rozpoznat signál na externím špendlíku a reagovat na něj.

V uživatelské příručce MT3620 M4 najdete informace o jádrech v reálném čase v MT3620. Další informace o registraci základních adres, čísel přerušení a podobných podrobností požádejte o datový list MT3620 M4 z Avnet e-mailem Azure.Sphere@avnet.com.

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

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

  • V souboru app_manifest.json požádejte o přerušení.
  • 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 vypsat v poli ExternalInterrupt oddílu Schopnosti manifestu aplikace. Identifikujte přerušení řetězcem z EINT0 na EINT23. Například následující řádek určuje externí přerušení 8:

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

Externí přerušení jsou multiplexovaná s GPIO stejným způsobem jako ostatní periferní zařízení a platí stejná pravidla týkající se multiplexingu. Vaše aplikace RTApp může používat libovolný EINT, který dáváte přednost, za předpokladu, že žádná jiná aplikace (buď vysoká úroveň nebo RTApp) na zařízení používá periferní zařízení, které se mapuje na stejný blok. Informace o tom, jak jsou periferní rozhraní multiplexovaná, najdete v části V/V Periferní zařízení .

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

Obslužná rutina přerušení

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

V ukázkovém souboru VectorTable.c představuje následující položka v vektorové tabulce EINT8, která je připnutá 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");
}

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

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

Ve funkci main() vaší 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. Například následující funkce inicializuje blok, který obsahuje zadaný pin. Funkce definuje všechny externí přerušení s hodnotou registru 0x300, která umožňuje debouncování a přerušení s nízkou hodnotou aktivní.

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

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

NVIC_EnableIRQ(28, 2);

Rozhraní API pro externí 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.