벡터 테이블: 인터럽트 주소록
초기 스택 값과 리셋, 예외, 인터럽트 처리 함수의 주소가 차례로 놓인 표. 부트로더가 이 표를 옮기는 이유까지.
벡터 테이블은 Flash 맨 앞에 놓인 주소 배열입니다.
| 번호 | 내용 |
|---|---|
| 0 | 초기 스택 포인터 값 |
| 1 | Reset_Handler |
| 2 | NMI_Handler |
| 3 | HardFault_Handler |
| … | MemManage, BusFault, UsageFault, SVC, PendSV, SysTick |
| 16~ | 주변장치 인터럽트 (USART1_IRQHandler, TIM1_UP_IRQHandler …) |
연결 방식
스타트업 파일에 모든 처리 함수 이름이 weak 심볼로 정의되어 있고, 기본은 무한 루프(Default_Handler)입니다. 내 코드에서 같은 이름의 함수를 만들면 그 함수로 대체됩니다.
void TIM2_IRQHandler(void) { ... } // 이름이 정확해야 함
이름 오타가 나면 컴파일 오류 없이 Default_Handler에 빠져 멈춥니다. "인터럽트가 걸리면 멈춘다"는 증상의 흔한 원인입니다.
벡터 테이블 옮기기 (VTOR)
부트로더가 0x0800_0000에 있고 앱이 0x0800_8000에 있다면, 앱으로 점프하기 전에 SCB->VTOR = 0x08008000;으로 CPU가 앱의 벡터 테이블을 보게 합니다. RAM에 벡터 테이블을 복사해 두고 실행 중 처리 함수를 바꾸는 기법도 있습니다.