반응형
🛡️ STM32에서의 인터럽트(Interrupt) 시스템
📚 기본 개념
- 인터럽트(Interrupt)란?
- CPU가 다른 작업을 수행 중이라고 가정
- 외부 신호나 하드웨어 이벤트가 발생
- 현재 작업을 일시 중단하고 긴급 처리를 수행하는 시스템
- STM32는 Cortex-M 기반이라
- Nested Vectored Interrupt Controller (NVIC) 가 인터럽트를 관리함
⚙️ 인터럽트 처리 흐름
- 인터럽트 발생 (ex: 버튼 눌림, UART 데이터 수신 완료)
- NVIC가 감지하여 현재 실행 중인 코드 중단
- 인터럽트 서비스 루틴(ISR) 으로 이동
- ISR 코드 실행
return from interrupt
명령으로 이전 코드 복귀
🔧 STM32 인터럽트 주요 구성 요소
구성요소 | 설명 |
EXTI | External Interrupts (GPIO 핀 변화를 인터럽트로 사용) |
NVIC | Nested Vectored Interrupt Controller, 인터럽트 우선순위 및 활성화 담당 |
ISR (Interrupt Service Routine) | 실제 인터럽트 발생 시 처리할 사용자 함수 |
🛠️ 인터럽트 활성화 기본 절차
- IRQ 핸들러 함수 작성
- ex)
void EXTI0_IRQHandler(void)
- ex)
- 인터럽트 소스 설정
- EXTI, UART, TIM 등 이벤트를 인터럽트로 설정
- NVIC에 인터럽트 등록 및 활성화
HAL_NVIC_SetPriority()
HAL_NVIC_EnableIRQ()
- 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가 관리하며, 빠르게 이벤트를 감지하고 처리하는 실시간 시스템 핵심 기능"
반응형
'임베디드 관련 > STM32' 카테고리의 다른 글
[STM32] DMA vs 인터럽트 (0) | 2025.04.30 |
---|---|
[STM32] DMA(Direct Memory Access) (0) | 2025.04.29 |
[STM32] CHxN 채널을 사용해서 PWM 출력? (0) | 2025.04.27 |
[STM32] VSCode에서 오류 모음 (0) | 2025.04.26 |
[STM32] Please login to download a software package 오류 (0) | 2025.04.25 |
댓글