그라운드 임베디드 유튜브 구독

노트 / MCU 펌웨어

인터럽트와 NVIC: 우선순위와 짧은 처리

우선순위 그룹, 선점과 서브 우선순위, 처리 함수를 짧게 유지하는 이유, 공유 변수를 안전하게 다루는 법.

GROUND EMBEDDED · 정리 노트펌웨어 07인터럽트와 NVIC 1volatile uint32_t ticks; 2uint32_t get_ticks(void) { 3 __disable_irq(); uint32_t t = ticks…// 32… 4 return t;

NVIC 설정 세 가지

  1. 주변장치에서 인터럽트 허용 (예: USART1->CR1 |= RXNEIE)
  2. NVIC에서 그 인터럽트 번호 허용 (NVIC_EnableIRQ(USART1_IRQn))
  3. 우선순위 설정 (NVIC_SetPriority)

하나라도 빠지면 인터럽트가 들어오지 않습니다.

우선순위

STM32는 숫자가 작을수록 높은 우선순위입니다. 높은 인터럽트는 낮은 인터럽트 처리 중에도 끼어듭니다(선점).

인터럽트 우선순위 예
과전류 보호 0 (가장 높음)
전류 제어 ADC 완료 1
통신 수신 5
버튼 10

RTOS를 쓰면 RTOS API를 부르는 인터럽트는 configMAX_SYSCALL_INTERRUPT_PRIORITY보다 낮은 우선순위여야 합니다.

처리 함수 원칙

  • 플래그 세우기, 버퍼에 넣기, 레지스터 값 저장만 하고 나옵니다.
  • printf, HAL_Delay, 긴 계산 금지
  • 인터럽트 원인 플래그를 지웁니다

공유 변수

volatile uint32_t ticks;
uint32_t get_ticks(void) {
    __disable_irq(); uint32_t t = ticks; __enable_irq();   // 32비트는 원자적이지만 구조체라면 필수
    return t;
}

여러 바이트로 된 값이나 여러 변수를 한꺼번에 읽을 때는 잠깐 인터럽트를 끄거나 복사본을 씁니다.