Gerçek zamanlı özellikli uygulamalarda dış kesmeleri kullanma

Azure Sphere, MT3620 için RTApps'te dış kesme kullanımını destekler. MT3620 gerçek zamanlı çekirdeklerde, bu tür kesmeler doğrudan GPIO kullanmaz; bunun yerine gpio bağımsız olarak kablolu. RTApp, dış pin üzerindeki sinyali algılayıp yanıt verecek şekilde bir dış kesme yapılandırabilir.

MT3620'nin gerçek zamanlı çekirdekleri hakkında bilgi için bkz. MT3620 M4 Kullanım Kılavuzu. Temel adresleri kaydetme, kesme numaraları ve benzer ayrıntılar hakkında ek bilgi için, e-posta Azure.Sphere@avnet.comile Avnet'ten "MT3620 M4 Veri Sayfası" isteyin.

Dış kesme gereksinimleri

MT3620 üzerindeki bir RTApp'te dış kesme kullanmak için:

  • app_manifest.json dosyasında kesme isteğinde bulun.
  • Sinyale yanıt veren bir kesme işleyicisi yazın.
  • Kesme işlevini başlatın, yapılandırın ve etkinleştirin.

Uygulama bildirimi ayarları

Dış kesme kullanmak için RTApp'in bunu uygulama bildiriminin Özellikler bölümünün "ExternalInterrupt" alanında listelemesi gerekir. EINT0'den EINT23'e kadar olan bir dize tarafından kesmeyi tanımlayın. Örneğin, aşağıdaki satır dış kesme 8'i belirtir:

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

Dış kesmeler, GPIO ile diğer çevre birimleriyle aynı şekilde katlanır ve çoğullamayla ilgili olarak aynı kurallar geçerlidir. RTApp'iniz, cihazdaki başka hiçbir uygulamanın (üst düzey veya RTApp) aynı blokla eşleyen bir çevre birimi kullanmamış olması koşuluyla tercih ettiğiniz herhangi bir EINT'i kullanabilir. Çevre birimi arabirimlerinin nasıl çoğullandığı hakkında bilgi için bkz. G/Ç Çevre Birimleri .

Azure Sphere uygulama senaryonuz bir Ethernet kalkanı da içeriyorsa, kalkan üst düzey bir uygulamada GPIO 5 (EINT5'e eşlenir) kullandığından EINT4-EINT7 RTApp'te kullanılamaz ve bu nedenle bu bloktaki diğer tüm pinleri rezerve eder.

Kesme işleyicisi

Kesme işleyiciniz, M4 için vektör tablosunda istenen kesmeyle aynı ada sahip olmalıdır. Örnek VectorTable.h ve VectorTable.c dosyaları için GitHub'daki Codethink Labs MT3620 M4 sürücü örneklerine bakın.

Örnek VectorTable.c dosyasında, vektör tablosundaki aşağıdaki girdi, blok 3'te 0'ı sabitleyen EINT8'i temsil eder:

[INT(28)] = gpio_g2_irq0,

Örnekte karşılık gelen kesme işleyicisi:gpio_g2_irq0

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

Kendi uygulamanızın vektör tablosunda kesme işleyicisini istediğiniz şekilde adlandırabilirsiniz.

Kesmeyi başlatma, yapılandırma ve etkinleştirme

RTApp'inizin main() işlevine vektör tablosunu başlatmak için kod ekleyin, kesme için EINT denetim kaydını yapılandırın ve kesme işleyicisini etkinleştirin.

Codethink sürücü örnekleri bir VectorTableInit() işlev tanımlar. Bu başlatma işlevini gereksinimlerinize uyarlayabilirsiniz.

EINT denetim kaydını yapılandırmak için M4 Veri Sayfası'nda tanımlandığı şekilde başlatmanız gerekir. Örneğin, aşağıdaki işlev belirtilen pinöğesini içeren bloğu başlatır. işlevi, kayıt değeri 0x300 olan tüm dış kesmeleri tanımlar ve bu da yinelenenleri kaldırmayı ve etkin-düşük kesmeleri etkinleştirir.

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

Bir uygulama bu işlevi şu şekilde çağırabilir:

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

Son olarak uygulamanın kesmeyi etkinleştirmesi gerekir; Bu örnekte Codethink sürücü örneklerinden işlevi kullanılmaktadır NVIC_Enable :

NVIC_EnableIRQ(28, 2);

Dış kesme API'si ve örnek kod

Codethink Labs'teki genel örnek koda ek olarak, MediaTek'ten bir sürücü API'sini ve ilgili belgeleri bulabilirsiniz.