Använda externa avbrott i program som kan användas i realtid
Azure Sphere stöder användning av externa avbrott i RTApps för MT3620. På MT3620 realtid kärnor, sådana avbrott inte använda GPIO direkt; i stället är de kabelanslutna oberoende av GPIO. En RTApp kan konfigurera ett externt avbrott så att det kan identifiera och svara på en signal på en extern pin-kod.
I användarhandboken för MT3620 M4 finns information om kärnorna i realtid på MT3620. Om du vill ha mer information om registerbasadresser, avbrottsnummer och liknande information kan du begära databladet "MT3620 M4" från Avnet via e-post Azure.Sphere@avnet.com
.
Krav på externa avbrott
Så här använder du ett externt avbrott i en RTApp på MT3620:
- Begär avbrott i filen app_manifest.json.
- Skriv en avbrottshanterare som svarar på signalen.
- Initiera, konfigurera och aktivera avbrottsfunktionen.
Inställningar för programmanifest
Om du vill använda ett externt avbrott måste en RTApp visa den i fältet "ExternalInterrupt" i avsnittet Funktioner i programmanifestet. Identifiera avbrottet med en sträng från EINT0 till EINT23. Följande rad anger till exempel externt avbrott 8:
"Capabilities": {
"ExternalInterrupt": [ "EINT8"]
}
Externa avbrott multiplexeras med GPIO på samma sätt som annan kringutrustning, och samma regler gäller för multiplexering. Din RTApp kan använda valfri EINT-enhet, förutsatt att inget annat program (hög nivå eller RTApp) på enheten använder en kringutrustning som mappas till samma block. Mer information om hur kringutrustningsgränssnitt är multiplexerade finns i I/O Peripherals .
Om ditt Azure Sphere-programscenario även innehåller en Ethernet-sköld är EINT4-EINT7 inte tillgängliga för RTApp eftersom skölden använder GPIO 5 (som mappas till EINT5) i en app på hög nivå och därmed reserverar alla andra stift i blocket.
Avbrottshanterare
Din avbrottshanterare måste ha samma namn som det begärda avbrottet i vektortabellen för M4. Se codethink Labs MT3620 M4-drivrutinsexempel på GitHub för exempelfilerna VectorTable.h och VectorTable.c.
I exempelfilen VectorTable.c representerar följande post i vektortabellen EINT8, som är stift 0 i block 3:
[INT(28)] = gpio_g2_irq0,
Motsvarande avbrottshanterare i provet är gpio_g2_irq0
:
void gpio_g2_irq0(void)
{
UART_Print(debug, "Interrupt handled.\r\n");
}
I vektortabellen för ditt eget program kan du namnge avbrottshanteraren vad du vill.
Initiera, konfigurera och aktivera avbrott
I funktionen main() för din RTApp anger du kod för att initiera vektortabellen, konfigurera EINT-kontrollregistret för avbrott och aktivera avbrottshanteraren.
Exempel på codethink-drivrutiner definierar en VectorTableInit()
funktion. Du kan anpassa initieringsfunktionen efter dina behov.
Om du vill konfigurera EINT-kontrollregistret måste du initiera det enligt definitionen i M4-databladet. Följande funktion initierar till exempel blocket som innehåller en angiven pin
. Funktionen definierar alla externa avbrott med registervärdet 0x300, vilket möjliggör debouncing och active-low interrupts.
#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;
}
En app kan anropa den här funktionen på följande sätt:
if (EINT_ConfigurePin(8) != ERROR_NONE) {
UART_Print(debug, "ERROR: EINT initialization failed\r\n");
}
Slutligen måste appen aktivera avbrottet. I det NVIC_Enable
här exemplet används funktionen från exempel på codethink-drivrutinen:
NVIC_EnableIRQ(28, 2);
Externt avbrotts-API och exempelkod
Förutom den allmänna exempelkoden från Codethink Labs kan du hitta ett drivrutins-API och motsvarande dokumentation från MediaTek.
- Extern avbrottskod från MediaTek
- Extern avbrottshuvudfil från MediaTek
- Referenshandbok för EINT API från MediaTek