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.com
e-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ý pin
objekt . 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.
- Zdrojový kód externího přerušení z MediaTek
- Soubor hlavičky externího přerušení z MediaTek
- Referenční příručka k rozhraní API pro EINT z MediaTek