Vector Table Offset Register. 인터럽트가 어디를 보고 점프할지를 정한다.
왜 옮기나
0x0800_0000 부트로더 (벡터 테이블 ①)
0x0800_8000 애플리케이션 (벡터 테이블 ②)
부트로더가 애플리케이션으로 점프한 뒤에도 VTOR 이 ①을 가리키면, 인터럽트가 부트로더의 핸들러로 간다. 증상은 "점프 직후 이상하게 죽는다" 이고 원인 찾기가 어렵다.
SCB->VTOR = APP_BASE; // 애플리케이션 벡터 테이블로 전환
__set_MSP(*(uint32_t *)APP_BASE); // 스택 포인터도 새로 잡는다
((void (*)(void))(*(uint32_t *)(APP_BASE + 4)))(); // 리셋 벡터로 점프
함께 챙길 것
- 점프 전에 켜 둔 인터럽트를 모두 끈다 — 옛 핸들러가 불릴 수 있다
- 주변장치를 리셋 상태로 되돌린다
- VTOR 은 정렬 제약이 있다(테이블 크기에 따라 128바이트 이상 경계)