실시간 지원 애플리케이션에서 외부 인터럽트 사용
Azure Sphere는 MT3620용 RTApps에서 외부 인터럽트 사용을 지원합니다. MT3620 실시간 코어에서 이러한 인터럽트는 GPIO를 직접 사용하지 않습니다. 대신 GPIO와 독립적으로 연결됩니다. RTApp은 외부 핀의 신호를 감지하고 응답할 수 있도록 외부 인터럽트를 구성할 수 있습니다.
MT3620의 실시간 코어에 대한 자세한 내용은 MT3620 M4 사용자 설명서를 참조하세요. 기본 주소 등록, 인터럽트 번호 및 유사한 세부 정보에 대한 자세한 내용은 이메일을 보내 Avnet에서 "MT3620 M4 Datasheet"를 요청하세요 Azure.Sphere@avnet.com
.
외부 인터럽트 요구 사항
MT3620의 RTApp에서 외부 인터럽트를 사용하려면 다음을 수행합니다.
- app_manifest.json 파일에서 인터럽트 요청
- 신호에 응답하는 인터럽트 처리기를 작성합니다.
- 인터럽트 기능을 초기화, 구성 및 사용하도록 설정합니다.
애플리케이션 매니페스트 설정
외부 인터럽트를 사용하려면 RTApp이 애플리케이션 매니페스트의 기능 섹션에 있는 "ExternalInterrupt" 필드에 나열해야 합니다. EINT0에서 EINT23까지 문자열로 인터럽트 식별 예를 들어 다음 줄은 외부 인터럽트 8을 지정합니다.
"Capabilities": {
"ExternalInterrupt": [ "EINT8"]
}
외부 인터럽트는 다른 주변 장치와 동일한 방식으로 GPIO와 멀티플렉싱되며 멀티플렉싱과 관련하여 동일한 규칙이 적용됩니다. 디바이스의 다른 애플리케이션(상위 수준 또는 RTApp)이 동일한 블록에 매핑되는 주변 장치를 사용하지 않는 경우 RTApp에서 원하는 EINT를 사용할 수 있습니다. 주변 인터페이스가 멀티플렉싱되는 방법에 대한 자세한 내용은 I/O 주변 장치를 참조하세요.
Azure Sphere 애플리케이션 시나리오에도 이더넷 쉴드가 포함된 경우, 방패는 상위 수준 앱에서 GPIO 5(EINT5에 매핑됨)를 사용하므로 해당 블록 내의 다른 모든 핀을 예약하므로 EINT4-EINT7을 RTApp에 사용할 수 없습니다.
인터럽트 처리기
인터럽트 처리기는 M4의 벡터 테이블에서 요청된 인터럽트 이름과 동일해야 합니다. 샘플 VectorTable.h 및 VectorTable.c 파일은 GitHub의 Codethink Labs MT3620 M4 드라이버 샘플을 참조하세요.
샘플 VectorTable.c 파일에서 벡터 테이블의 다음 항목은 블록 3의 핀 0인 EINT8을 나타냅니다.
[INT(28)] = gpio_g2_irq0,
샘플의 해당 인터럽트 처리기는 입니다 gpio_g2_irq0
.
void gpio_g2_irq0(void)
{
UART_Print(debug, "Interrupt handled.\r\n");
}
사용자 고유의 애플리케이션에 대한 벡터 테이블에서 원하는 대로 인터럽트 처리기의 이름을 지정할 수 있습니다.
인터럽트 초기화, 구성 및 사용
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");
}
마지막으로 앱은 인터럽트( 인터럽트)를 사용하도록 설정해야 합니다. 이 예제에서는 Codethink 드라이버 샘플의 함수를 사용합니다 NVIC_Enable
.
NVIC_EnableIRQ(28, 2);
외부 인터럽트 API 및 샘플 코드
Codethink Labs의 일반적인 예제 코드 외에도 MediaTek에서 드라이버 API 및 해당 설명서를 찾을 수 있습니다.
- MediaTek의 외부 인터럽트 소스 코드
- MediaTek의 외부 인터럽트 헤더 파일
- MediaTek의 EINT API 참조 설명서