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.com
wiadomość 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.
- Zewnętrzny kod źródłowy przerwań z mediatek
- Plik nagłówka przerwania zewnętrznego z programu MediaTek
- Instrukcja obsługi interfejsu API EINT firmy MediaTek