向量表偏移寄存器(Vector Table Offset Register,VTOR)

一、先明确:什么是 "中断向量表"?

中断向量表是 MCU 中一段存储 "中断服务程序(ISR)入口地址" 的专用内存区域:当 MCU 触发中断(如定时器溢出、串口接收数据、外部引脚电平变化等)时,硬件会自动根据 "中断类型" 查找向量表,找到对应的 ISR 入口地址,再跳转到该地址执行中断处理代码。

例如:STM32 芯片复位后,默认向量表存放在0x08000000 地址(Flash 起始地址),其中 "复位中断" 的向量地址固定在 0x08000004,硬件复位时会自动从该地址取指令执行。

二、向量表偏移寄存器(VTOR)的核心作用

VTOR 的核心功能是修改 "中断向量表的基地址" ------ 让 MCU 不再固定从 "默认地址" 查找向量表,而是从 VTOR 指定的地址查找,解决了 3 个关键场景需求

1. 支持 "Bootloader + App" 双程序架构(最常用场景)

很多 MCU 项目会设计 "Bootloader(引导程序)" 和 "App(应用程序)" 两个独立程序,分别存放在 Flash 的不同区域:

Bootloader:存于 Flash 起始地址(如 0x08000000),负责 "程序升级""硬件初始化" 等基础功能;

App:存于 Flash 后续地址(如 0x08008000),负责实际业务逻辑(如传感器采集、通信控制)。

此时若没有 VTOR:App 运行时触发中断,硬件仍会去0x08000000(Bootloader 的向量表) 查找 ISR 地址,但 Bootloader 的向量表中没有 App 的 ISR 入口,会导致程序崩溃。

通过 VTOR 解决:App 启动后,先将 VTOR 的值设置为App 的向量表基地址(如 0x08008000),此时硬件再触发中断,会自动从 0x08008000 开始查找 App 的 ISR 地址,确保中断正常响应。

2. 支持 "向量表搬移到 RAM"(提升中断响应速度)

默认情况下,向量表存放在 Flash 中,但 Flash 的读取速度远低于 RAM。对于 "中断触发频率极高" 的场景(如高频定时器中断、高速串口中断),可通过 VTOR 将向量表搬移到 RAM:

步骤 1:在 RAM 中复制一份向量表(内容与 Flash 中的一致);

步骤 2:将 VTOR 的值设置为 "RAM 中向量表的基地址";

效果:硬件查找 ISR 地址时从 RAM 读取,减少地址查找延迟,提升中断响应速度。

3. 支持 "多 App 切换"(复杂项目场景)

部分复杂项目会在 Flash 中存储多个独立 App(如 "功能 AApp""功能 BApp"),每个 App 都有自己的向量表。通过修改 VTOR 的值,可在不同 App 运行时 "动态切换向量表基地址":

切换到 App1 时,VTOR 设为 App1 的向量表地址;

切换到 App2 时,VTOR 设为 App2 的向量表地址;

无需重新烧录程序,即可实现多个 App 的灵活切换,且每个 App 的中断都能正常响应

Bootloader 的向量表中没有 App 的 ISR 入口,为什么会导致程序崩溃

一、中断向量表的 "匹配逻辑"

中断向量表本质是一张 "中断类型→ISR 入口地址" 的映射表 。例如:

假设 "串口 1 接收中断" 对应的向量表索引是0x2C,那么向量表中0x2C位置存储的是 "串口 1 接收中断服务程序(ISR)的入口地址"。

当串口 1 触发接收中断时,硬件会自动到向量表的0x2C位置取地址,然后跳转到该地址执行代码。

二、Bootloader 与 App 的 "程序隔离性"

Bootloader 和 App 是两个完全独立的程序,分别存放在 Flash 的不同区域:

Bootloader 的代码、数据、中断服务程序(ISR)都在它自己的存储区域(比如0x08000000~0x08007FFF);

App 的代码、数据、ISR 都在它的存储区域(比如0x08008000~0x080FFFFF)。

三、"崩溃" 的核心原因:地址不匹配

当 App 运行时,如果 VTOR 没有被修改(仍指向 Bootloader 的向量表),会发生以下冲突:

假设 App 的 "串口 1 接收 ISR" 入口地址是0x08008100(在 App 的存储区域);

但 Bootloader 的向量表中,"串口 1 接收中断" 的索引0x2C位置存储的是Bootloader 自己的 ISR 地址(比如0x08001200),根本没有 App 的0x08008100。

此时,当串口 1 触发接收中断,硬件会到 Bootloader 向量表的0x2C位置取地址(0x08001200),但这个地址属于 Bootloader 的代码区,App 运行时这片区域可能已经被覆盖或无关,最终会因为 "跳转到非法地址" 导致程序崩溃(比如进入 HardFault 异常)。

举个生活化的例子

把中断向量表想象成 "公司部门通讯录":

Bootloader 的通讯录里,"市场部" 的联系人是 "张三(Bootloader 的市场部处理逻辑)";

App 的通讯录里,"市场部" 的联系人是 "李四(App 的市场部处理逻辑)"。

如果 App 运行时,还在用 Bootloader 的通讯录(VTOR 没改),当 "市场部需求" 来了(触发中断),就会错误地联系 "张三",但张三根本不在 App 的团队里,自然处理不了,最终导致 "业务崩溃"。

解决方法:修改 VTOR 指向 App 的向量表

App 启动后,必须通过代码修改 VTOR 寄存器,让它指向App 自己的向量表基地址(比如0x08008000)。这样,当中断触发时,硬件就会到 App 的向量表中查找正确的 ISR 入口地址,程序就能正常响应中断了。

![](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNjU1Nzc5ODc4NDY4IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE0MTciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj5AZm9udC1mYWNlIHsgZm9udC1mYW1pbHk6IGZlZWRiYWNrLWljb25mb250OyBzcmM6IHVybCgiLy9hdC5hbGljZG4uY29tL3QvZm9udF8xMDMxMTU4X3U2OXc4eWh4ZHUud29mZjI/dD0xNjMwMDMzNzU5OTQ0IikgZm9ybWF0KCJ3b2ZmMiIpLCB1cmwoIi8vYXQuYWxpY2RuLmNvbS90L2ZvbnRfMTAzMTE1OF91Njl3OHloeGR1LndvZmY/dD0xNjMwMDMzNzU5OTQ0IikgZm9ybWF0KCJ3b2ZmIiksIHVybCgiLy9hdC5hbGljZG4uY29tL3QvZm9udF8xMDMxMTU4X3U2OXc4eWh4ZHUudHRmP3Q9MTYzMDAzMzc1OTk0NCIpIGZvcm1hdCgidHJ1ZXR5cGUiKTsgfQ0KPC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTM3NyA0MzJoMzQ5YTggOCAwIDAgMSA4IDh2NDhhOCA4IDAgMCAxLTggOEgzNzdhOCA4IDAgMCAxLTgtOHYtNDhhOCA4IDAgMCAxIDgtOHogbTAgMTYwaDI1OGE4IDggMCAwIDEgOCA4djQ4YTggOCAwIDAgMS04IDhIMzc3YTggOCAwIDAgMS04LTh2LTQ4YTggOCAwIDAgMSA4LTh6IG0tNjUtMjgwdjU3Nmg0ODBWMzEySDMxMnogbS00MC03Mmg1NjBjMTcuNjczIDAgMzIgMTQuMzI3IDMyIDMydjY1NmMwIDE3LjY3My0xNC4zMjcgMzItMzIgMzJIMjcyYy0xNy42NzMgMC0zMi0xNC4zMjctMzItMzJWMjcyYzAtMTcuNjczIDE0LjMyNy0zMiAzMi0zMnogbS04OC01NnY2NjRhOCA4IDAgMCAxLTggOGgtNTZhOCA4IDAgMCAxLTgtOFYxNDRjMC0xNy42NzMgMTQuMzI3LTMyIDMyLTMyaDYzMmE4IDggMCAwIDEgOCA4djU2YTggOCAwIDAgMS04IDhIMTg0eiIgZmlsbD0iIzMzMzMzMyIgcC1pZD0iMTQxOCI+PC9wYXRoPjwvc3ZnPg==)
复制
![](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNzExOTY0NDE0MzQ4IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjEyODkiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjU2IiBoZWlnaHQ9IjI1NiI+PHBhdGggZD0iTTc5Ny4wNTYgNjA1LjIyNjY2N2E0LjI2NjY2NyA0LjI2NjY2NyAwIDAgMSAyLjU2IDIuNTE3MzMzbDUxLjk2OCAxMzkuNzMzMzMzIDE0NC4xNzA2NjcgNTYuMzYyNjY3YTQuMjY2NjY3IDQuMjY2NjY3IDAgMCAxLTAuMjEzMzM0IDguMDY0bC0xNDMuOTU3MzMzIDQ3LjU3MzMzMy01MS45NjggMTQ4LjM5NDY2N2E0LjI2NjY2NyA0LjI2NjY2NyAwIDAgMS04LjA2NCAwbC01MS45NjgtMTQ4LjM5NDY2Ny0xNDMuOTU3MzMzLTQ3LjU3MzMzM2E0LjI2NjY2NyA0LjI2NjY2NyAwIDAgMS0wLjIxMzMzNC04LjA2NGwxNDQuMTcwNjY3LTU2LjMyIDUyLjAxMDY2Ny0xMzkuNzc2YTQuMjY2NjY3IDQuMjY2NjY3IDAgMCAxIDUuNDYxMzMzLTIuNTZ6TTQyNi40MTA2NjcgMTE4LjA1ODY2N2MzLjg0IDEuMjggNi44MjY2NjcgNC4yNjY2NjcgOC4xMDY2NjYgOC4xMDY2NjZsODYuNjk4NjY3IDI2MC4wOTZhNDIuNjY2NjY3IDQyLjY2NjY2NyAwIDAgMCAyNy4wMDggMjcuMDA4bDI2MC4wOTYgODYuNjk4NjY3YTEyLjggMTIuOCAwIDAgMSAwIDI0LjI3NzMzM2wtMjYwLjA5NiA4Ni42OTg2NjdhNDIuNjY2NjY3IDQyLjY2NjY2NyAwIDAgMC0yNy4wMDggMjcuMDA4bC04Ni42OTg2NjcgMjYwLjA5NmExMi44IDEyLjggMCAwIDEtMjQuMzIgMGwtODYuNjU2LTI2MC4wOTZhNDIuNjY2NjY3IDQyLjY2NjY2NyAwIDAgMC0yNy4wMDgtMjcuMDA4TDM2LjQzNzMzMyA1MjQuMjQ1MzMzYTEyLjggMTIuOCAwIDAgMSAwLTI0LjMyTDI5Ni41MzMzMzMgNDEzLjMxMmE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwIDI3LjAwOC0yNy4wMDhsODYuNjk4NjY3LTI2MC4wOTZhMTIuOCAxMi44IDAgMCAxIDE2LjIxMzMzMy04LjEwNjY2N3ogbTM4NS43MDY2NjYtNTkuNzMzMzM0YTQuMjY2NjY3IDQuMjY2NjY3IDAgMCAxIDIuNTYgMi41MTczMzRsMjcuOTg5MzM0IDc1LjIyMTMzMyA3Ny42NTMzMzMgMzAuMzc4NjY3YTQuMjY2NjY3IDQuMjY2NjY3IDAgMCAxLTAuMjEzMzMzIDguMDIxMzMzbC03Ny40NCAyNS42LTI3Ljk4OTMzNCA3OS44NzJhNC4yNjY2NjcgNC4yNjY2NjcgMCAwIDEtOC4wMjEzMzMgMEw3NzguNjY2NjY3IDIwMC4xMDY2NjdsLTc3LjQ0LTI1LjZhNC4yNjY2NjcgNC4yNjY2NjcgMCAwIDEtMC4yMTMzMzQtOC4wMjEzMzRsNzcuNjUzMzM0LTMwLjM3ODY2NiAyNy45ODkzMzMtNzUuMjIxMzM0YTQuMjY2NjY3IDQuMjY2NjY3IDAgMCAxIDUuNTA0LTIuNTZ6IiBwLWlkPSIxMjkwIiBmaWxsPSIjMzMzMzMzIj48L3BhdGg+PC9zdmc+)
AI助力团
![](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNjUxNTY3NDk1OTczIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjIwNzciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj48L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNDQ2LjExMjMyMyAxNzcuNTQ1MDUxYzEzNy41Njc2NzcgMC4yMTk3OTggMjUyLjYxMjUyNSAxMDQuNTk3OTggMjY2LjE2MjQyNCAyNDEuNDkzMzMzIDEzLjU2MjgyOCAxMzYuODk1MzU0LTc4Ljc3ODE4MiAyNjEuODE4MTgyLTIxMy42MTc3NzcgMjg5LjAwODQ4NS0xMzQuODUyNTI1IDI3LjIwMzIzMi0yNjguMzg2MjYzLTUyLjE1Njc2OC0zMDguOTQ1NDU1LTE4My42MDg4ODlzMjUuMDE4MTgyLTI3Mi4yNTIxMjEgMTUxLjczODE4Mi0zMjUuNzc5Mzk0QTI2Ny4yMzU1NTYgMjY3LjIzNTU1NiAwIDAgMSA0NDYuMTEyMzIzIDE3Ny41NDUwNTFtMC02Mi4wNjA2MDdjLTE4Mi43OTQzNDMgMC0zMzAuOTg5ODk5IDE0OC4xOTU1NTYtMzMwLjk4OTg5OSAzMzAuOTg5ODk5czE0OC4xOTU1NTYgMzMwLjk4OTg5OSAzMzAuOTg5ODk5IDMzMC45ODk4OTkgMzMwLjk4OTg5OS0xNDguMTk1NTU2IDMzMC45ODk4OTktMzMwLjk4OTg5OS0xNDguMTk1NTU2LTMzMC45ODk4OTktMzMwLjk4OTg5OS0zMzAuOTg5ODk5eiBtNDMxLjMyMTIxMiA3OTMuMzQxNDE1YTMwLjg0OTI5MyAzMC44NDkyOTMgMCAwIDEtMjEuOTQxMDEtOS4xMDIyMjNsLTE1Ny4yMjAyMDItMTU3LjIyMDIwMmMtMTEuNzUyNzI3LTEyLjE3OTM5NC0xMS41ODQ2NDYtMzEuNTM0NTQ1IDAuMzc0OTUtNDMuNTA3MDcgMTEuOTcyNTI1LTExLjk3MjUyNSAzMS4zMjc2NzctMTIuMTQwNjA2IDQzLjQ5NDE0MS0wLjM3NDk1bDE1Ny4yMjAyMDIgMTU3LjIyMDIwMmEzMS4wMzY3NjggMzEuMDM2NzY4IDAgMCAxIDYuNzIzMjMyIDMzLjgxMDEwMSAzMS4wMDQ0NDQgMzEuMDA0NDQ0IDAgMCAxLTI4LjY1MTMxMyAxOS4xNzQxNDJ6IG0wIDAiIHAtaWQ9IjIwNzgiIGZpbGw9IiMzMzMzMzMiPjwvcGF0aD48L3N2Zz4=)
百度
「我的搜索组」

相关推荐
蓑衣客VS索尼克2 小时前
STM32G4针对串口通信异常的操作
stm32·单片机·嵌入式硬件
小康小小涵3 小时前
STM32F103RCT6编写iNav1.7.3飞控固件底层开发
stm32·单片机·嵌入式硬件
小郭团队6 小时前
1_6_五段式SVPWM (传统算法反正切+DPWM2)算法理论与 MATLAB 实现详解
嵌入式硬件·算法·matlab·dsp开发
小郭团队6 小时前
1_7_五段式SVPWM (传统算法反正切+DPWM3)算法理论与 MATLAB 实现详解
开发语言·嵌入式硬件·算法·matlab·dsp开发
爱潜水的小L6 小时前
自学嵌入式day49,arm led、蜂鸣器和bsp
arm开发·单片机·嵌入式硬件
物联网牛七七8 小时前
stm32内核寄存器和外设寄存器
stm32·单片机·嵌入式硬件
嗯嗯=8 小时前
STM32单片机学习篇3
stm32·单片机·学习
梁洪飞8 小时前
通过链接文件和Start.S学习armv7
linux·arm开发·嵌入式硬件·学习·arm
m0_5557629010 小时前
STM32H7 + VS Code + OpenOCD + STLink 完整配置教程
stm32·单片机·嵌入式硬件
飞来客isdn10 小时前
关于单片机与上位机串口通信的问题
单片机·嵌入式硬件·mcu