Udostępnij za pośrednictwem


Używanie przerwań zewnętrznych w aplikacjach z obsługą czasu rzeczywistego

Usługa Azure Sphere obsługuje korzystanie z przerwań zewnętrznych w aplikacji RTApps dla mt3620. W rdzeniach mt3620 w czasie rzeczywistym takie przerwania nie używają gpio bezpośrednio; Zamiast tego są one przewodowe niezależnie od obiektu GPIO. Aplikacja RTApp może skonfigurować przerwania zewnętrzne, aby wykrywała i reagowała na sygnał na zewnętrznym pinezce.

Zobacz Podręcznik użytkownika MT3620 M4 , aby uzyskać informacje o rdzeniach w czasie rzeczywistym na MT3620. Aby uzyskać dodatkowe informacje na temat rejestrowania adresów podstawowych, numerów przerwań i podobnych szczegółów, poproś o "arkusz danych MT3620 M4" od firmy Avnet, wysyłając Azure.Sphere@avnet.comwiadomość e-mail.

Wymagania dotyczące przerwania zewnętrznego

Aby użyć przerwania zewnętrznego w aplikacji RTApp na MT3620:

  • Zażądaj przerwania w pliku app_manifest.json.
  • Napisz program obsługi przerwań, który odpowiada na sygnał.
  • Inicjowanie, konfigurowanie i włączanie funkcji przerwania.

Ustawienia manifestu aplikacji

Aby użyć przerwania zewnętrznego, aplikacja RTApp musi wyświetlić ją na liście w polu "ExternalInterrupt" sekcji Capabilities w manifeście aplikacji. Zidentyfikuj przerwania przez ciąg od EINT0 do EINT23. Na przykład w poniższym wierszu określono przerwania zewnętrznego 8:

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

Przerwania zewnętrzne są multipleksowane za pomocą obiektu GPIO w taki sam sposób jak w przypadku innych urządzeń peryferyjnych i mają zastosowanie te same reguły dotyczące multipleksowania. Aplikacja RTApp może używać dowolnego preferowanego interfejsu EINT, pod warunkiem że żadna inna aplikacja (wysoka lub RTApp) na urządzeniu nie korzysta z urządzenia peryferyjnego mapowego na ten sam blok. Zobacz Urządzenia peryferyjne we/wy , aby uzyskać informacje na temat multipleksowania interfejsów peryferyjnych.

Jeśli scenariusz aplikacji Azure Sphere obejmuje również tarczę Ethernet, EINT4-EINT7 są niedostępne dla RTApp, ponieważ tarcza używa GPIO 5 (która mapuje na EINT5) w aplikacji wysokiego poziomu, rezerwując wszystkie inne pinezki w tym bloku.

Obsługa przerwań

Program obsługi przerwań musi mieć taką samą nazwę jak żądana przerwa w tabeli wektorowej dla rekordu M4. Zobacz próbki sterowników codethink Labs MT3620 M4 w witrynie GitHub, aby uzyskać przykładowe pliki VectorTable.h i VectorTable.c.

W przykładowym pliku VectorTable.c następujący wpis w tabeli wektorowej reprezentuje wartość EINT8, która jest pinezką 0 w bloku 3:

[INT(28)] = gpio_g2_irq0,

Odpowiedni program obsługi przerwań w przykładzie to gpio_g2_irq0:

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

W tabeli wektorowej dla własnej aplikacji możesz nadać programowi obsługi przerwań dowolną nazwę.

Inicjowanie, konfigurowanie i włączanie przerwania

W funkcji main() aplikacji RTApp podaj kod inicjowania tabeli wektorowej, skonfiguruj rejestr kontrolek EINT dla przerwania i włącz program obsługi przerwań.

Próbki sterownika kodera-dekodera definiują funkcję VectorTableInit() . Funkcję inicjowania można dostosować do wymagań.

Aby skonfigurować rejestr kontrolek EINT, musisz zainicjować go zgodnie z definicją w arkuszu danych M4. Na przykład poniższa funkcja inicjuje blok zawierający określony pin. Funkcja definiuje wszystkie przerwania zewnętrzne z 0x300 wartości rejestru, co umożliwia debouncing i aktywnego-niskie przerwania.

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

Aplikacja może wywołać tę funkcję w następujący sposób:

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

Na koniec aplikacja musi włączyć przerwania; w tym przykładzie użyto NVIC_Enable funkcji z przykładowych sterowników kodera-dekodera:

NVIC_EnableIRQ(28, 2);

Zewnętrzny interfejs API przerwań i przykładowy kod

Oprócz ogólnego kodu przykładowego z Codethink Labs, można znaleźć interfejs API sterownika i odpowiednią dokumentację z MediaTek.