Utilizar interrupções externas em aplicações com capacidade em tempo real
O Azure Sphere suporta a utilização de interrupções externas no RTApps para MT3620. Nos núcleos de MT3620 em tempo real, essas interrupções não utilizam gpIO diretamente; em vez disso, são ligados independentemente do GPIO. Uma RTApp pode configurar uma interrupção externa para que possa detetar e responder a um sinal num pin externo.
Consulte o Manual de Utilizador mt3620 M4 para obter informações sobre os núcleos em tempo real no MT3620. Para obter informações adicionais sobre o registo de endereços base, números de interrupção e detalhes semelhantes, peça a "Folha de Dados MT3620 M4" à Avnet por e-mail Azure.Sphere@avnet.com
.
Requisitos de interrupção externa
Para utilizar uma interrupção externa numa RTApp no MT3620:
- Peça a interrupção no ficheiro app_manifest.json.
- Escreva um processador de interrupção que responda ao sinal.
- Inicialize, configure e ative a funcionalidade de interrupção.
Definições do manifesto da aplicação
Para utilizar uma interrupção externa, uma RTApp tem de listá-la no campo "ExternalInterrupt" da secção Capacidades do manifesto da aplicação. Identifique a interrupção por uma cadeia de carateres de EINT0 para EINT23. Por exemplo, a linha seguinte especifica a interrupção externa 8:
"Capabilities": {
"ExternalInterrupt": [ "EINT8"]
}
As interrupções externas são multiplexadas com GPIO da mesma forma que outros periféricos e aplicam-se as mesmas regras relativas ao multiplexing. O SEU RTApp pode utilizar qualquer EINT que preferir, desde que nenhuma outra aplicação (de alto nível ou RTApp) no dispositivo utilize um periférico que mapeie para o mesmo bloco. Consulte Periféricos de E/ S para obter informações sobre como as interfaces periféricas são multiplexadas.
Se o seu cenário de aplicação do Azure Sphere também incluir um escudo Ethernet, o EINT4-EINT7 não está disponível para o RTApp, porque o escudo utiliza GPIO 5 (que mapeia para EINT5) numa aplicação de alto nível, reservando assim todos os outros pinos nesse bloco.
Processador de interrupção
O processador de interrupções tem de ter o mesmo nome que a interrupção pedida na tabela de vetores do M4. Veja Codethink Labs MT3620 M4 driver samples on GitHub (Exemplos de controladores MT3620 M4 do Codethink Labs no GitHub) para obter os ficheiros vectorTable.h e VectorTable.c de exemplo.
No ficheiro VectorTable.c de exemplo, a seguinte entrada na tabela de vetores representa EINT8, que é pin 0 no bloco 3:
[INT(28)] = gpio_g2_irq0,
O processador de interrupções correspondente no exemplo é gpio_g2_irq0
:
void gpio_g2_irq0(void)
{
UART_Print(debug, "Interrupt handled.\r\n");
}
Na tabela de vetores da sua própria aplicação, pode atribuir o nome que quiser ao processador de interrupções.
Inicializar, configurar e ativar a interrupção
Na função main() do seu RTApp, inclua código para inicializar a tabela de vetores, configurar o registo de controlo EINT para a interrupção e ativar o processador de interrupção.
Os exemplos de controlador Codethink definem uma VectorTableInit()
função. Pode adaptar esta função de inicialização aos seus requisitos.
Para configurar o registo de controlo EINT, terá de o inicializar conforme definido na Folha de Dados M4. Por exemplo, a seguinte função inicializa o bloco que contém um especificado pin
. A função define todas as interrupções externas com o valor de registo 0x300, o que permite interrupções de debouncing e ativa-baixa.
#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;
}
Uma aplicação pode chamar esta função da seguinte forma:
if (EINT_ConfigurePin(8) != ERROR_NONE) {
UART_Print(debug, "ERROR: EINT initialization failed\r\n");
}
Por fim, a aplicação tem de ativar a interrupção; este exemplo utiliza a NVIC_Enable
função dos exemplos do controlador Codethink:
NVIC_EnableIRQ(28, 2);
API de interrupção externa e código de exemplo
Além do código de exemplo geral da Codethink Labs, pode encontrar uma API de controlador e a documentação correspondente da MediaTek.
- Código fonte de interrupção externa da MediaTek
- Ficheiro de cabeçalho de interrupção externa da MediaTek
- Manual de Referência da API EINT da MediaTek