Использование внешних прерываний в приложениях с поддержкой реального времени
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.
- Исходный код внешнего прерывания из MediaTek
- Файл заголовка внешнего прерывания из MediaTek
- Справочное руководство по API EINT от MediaTek