Использование внешних прерываний в приложениях с поддержкой реального времени

Azure Sphere поддерживает использование внешних прерываний в RTApps для MT3620. В ядрах реального времени MT3620 такие прерывания не используют GPIO напрямую; вместо этого они подключены независимо от GPIO. ПРИЛОЖЕНИЕ RTApp может настроить внешнее прерывание таким образом, чтобы обнаруживать сигнал на внешнем контакте и реагировать на него.

Сведения о ядрах в реальном времени на MT3620 см. в руководстве пользователя MT3620 M4 . Чтобы получить дополнительные сведения о базовых адресах регистрации, номерах прерываний и аналогичных сведениях, запросите "MT3620 M4 Datasheet" в Avnet по электронной почте Azure.Sphere@avnet.com.

Требования к внешним прерываниям

Чтобы использовать внешнее прерывание в RTApp в MT3620, выполните следующие действия:

  • Запросите прерывание в файле app_manifest.json.
  • Напишите обработчик прерываний, который реагирует на сигнал.
  • Инициализация, настройка и включение функциональных возможностей прерываний.

Параметры манифеста приложения

Чтобы использовать внешнее прерывание, приложение RTApp должно отобразить его в поле ExternalInterrupt раздела Возможности манифеста приложения. Определите прерывание строкой от EINT0 до EINT23. Например, в следующей строке указано внешнее прерывание 8:

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

Внешние прерывания мультиплексируются с GPIO так же, как и другие периферийные устройства, и в отношении мультиплексирования применяются те же правила. Приложение RTApp может использовать любой EINT, при условии, что ни одно другое приложение (высокоуровневое или RTApp) на устройстве не использует периферийное устройство, которое сопоставляется с тем же блоком. Сведения о том, как мультиплексируются периферийные интерфейсы, см. в разделе Периферийные устройства ввода-вывода .

Если в сценарии приложения Azure Sphere также есть экран Ethernet, EINT4-EINT7 недоступен для RTApp, так как щит использует GPIO 5 (который сопоставляется с EINT5) в приложении высокого уровня, резервируя все остальные контакты в этом блоке.

Обработчик прерываний

Имя обработчика прерываний должно совпадать с именем запрошенного прерывания в таблице векторов для M4. Примеры файлов VectorTable.h и VectorTable.c см. в примерах драйверов MT3620 M4 Codethink Labs на сайте GitHub.

В примере файла VectorTable.c следующая запись в векторной таблице представляет EINT8, который является закреплением 0 в блоке 3:

[INT(28)] = gpio_g2_irq0,

Соответствующий обработчик прерываний в примере :gpio_g2_irq0

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

В таблице векторов для собственного приложения можно присвоить обработчику прерываний любое имя.

Инициализация, настройка и включение прерывания

В функцию main() приложения RTApp добавьте код для инициализации таблицы векторов, настройте регистр элементов управления EINT для прерывания и включите обработчик прерывания.

Примеры драйвера Codethink определяют функцию VectorTableInit() . Эту функцию инициализации можно адаптировать к требованиям.

Чтобы настроить регистр элементов управления EINT, необходимо инициализировать его, как определено в таблице M4. Например, следующая функция инициализирует блок, содержащий указанный pinобъект . Функция определяет все внешние прерывания с помощью регистрового значения 0x300, что позволяет выполнять разбиение и прерывания с низким уровнем активности.

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

Приложение может вызвать эту функцию следующим образом:

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

Наконец, приложение должно включить прерывание; В этом примере используется NVIC_Enable функция из примеров драйвера Codethink:

NVIC_EnableIRQ(28, 2);

API внешних прерываний и пример кода

Помимо общего примера кода из Codethink Labs, вы можете найти API драйвера и соответствующую документацию в MediaTek.