본문 바로가기
임베디드 관련/STM32

[STM32] 인터럽트(Interrupt) 시스템

by minhyeok.lee 2025. 4. 28.
반응형

🛡️ STM32에서의 인터럽트(Interrupt) 시스템


📚 기본 개념

  • 인터럽트(Interrupt)란?
    • CPU가 다른 작업을 수행 중이라고 가정
    • 외부 신호나 하드웨어 이벤트가 발생
    • 현재 작업을 일시 중단하고 긴급 처리를 수행하는 시스템
  • STM32는 Cortex-M 기반이라
    • Nested Vectored Interrupt Controller (NVIC) 가 인터럽트를 관리함

⚙️ 인터럽트 처리 흐름

  1. 인터럽트 발생 (ex: 버튼 눌림, UART 데이터 수신 완료)
  2. NVIC가 감지하여 현재 실행 중인 코드 중단
  3. 인터럽트 서비스 루틴(ISR) 으로 이동
  4. ISR 코드 실행
  5. return from interrupt 명령으로 이전 코드 복귀

🔧 STM32 인터럽트 주요 구성 요소

구성요소 설명
EXTI External Interrupts (GPIO 핀 변화를 인터럽트로 사용)
NVIC Nested Vectored Interrupt Controller, 인터럽트 우선순위 및 활성화 담당
ISR (Interrupt Service Routine) 실제 인터럽트 발생 시 처리할 사용자 함수

🛠️ 인터럽트 활성화 기본 절차

  1. IRQ 핸들러 함수 작성
    • ex) void EXTI0_IRQHandler(void)
  2. 인터럽트 소스 설정
    • EXTI, UART, TIM 등 이벤트를 인터럽트로 설정
  3. NVIC에 인터럽트 등록 및 활성화
    • HAL_NVIC_SetPriority()
    • HAL_NVIC_EnableIRQ()
  4. ISR 안에서 처리 후 인터럽트 플래그 클리어
    • 플래그를 클리어하지 않으면 인터럽트 계속 발생

🖥️ 코드 예제: EXTI 버튼 인터럽트 설정

// 1. GPIO를 인터럽트 모드로 초기화
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// 2. NVIC 설정
HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);

// 3. 인터럽트 핸들러 작성
void EXTI0_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);  // HAL 라이브러리 사용시
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == GPIO_PIN_0)
    {
        // 버튼 눌렀을 때 처리할 내용
    }
}

🧩 인터럽트 우선순위 (Priority)

  • Preemption Priority: 다른 인터럽트를 중단하고 먼저 실행할 수 있는 레벨
  • Sub Priority: 같은 Preemption Priority 안에서 실행 순서를 정하는 레벨

STM32에서는 HAL_NVIC_SetPriority(IRQn, preemptPriority, subPriority);로 설정


🏎️ 인터럽트의 장점

  • 실시간 반응 가능
  • CPU 자원을 효율적으로 사용
  • 저전력 시스템에서 특히 유리

⚡ 주의사항

  • ISR 안에서는 짧고 빠르게 처리할 것
    • (느린 작업은 플래그만 세우고 메인루프에서 처리)
  • ISR 내부에서는 블로킹 함수 사용 금지
    • (예: HAL_Delay() 같은 거 사용하면 시스템 멈춤)
  • 인터럽트 플래그 클리어 필수
    • 클리어 안 하면 인터럽트가 계속 발생함

🧠 한 문장 요약

"STM32 인터럽트는 NVIC가 관리하며, 빠르게 이벤트를 감지하고 처리하는 실시간 시스템 핵심 기능"

반응형

댓글