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

노트 / 기계어와 어셈블리

벡터 테이블: 인터럽트 주소록

초기 스택 값과 리셋, 예외, 인터럽트 처리 함수의 주소가 차례로 놓인 표. 부트로더가 이 표를 옮기는 이유까지.

GROUND EMBEDDED · 정리 노트기계어 07벡터 테이블 1void TIM2_IRQHandler(void) { ... }// 이름이…

벡터 테이블은 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에 벡터 테이블을 복사해 두고 실행 중 처리 함수를 바꾸는 기법도 있습니다.