VTOR 在 ARM M3 中的使用

VTOR usage in ARM M3

我想知道在基于 ARM M3 的 MCU 上,使用 VTOR 寄存器重定位向量有什么好处 table?我理解的原因是:

  1. 向量table需要在运行时更改,默认地址(0x0为只读)
  2. 从 SRAM 读取(假设它被重新定位到 SRAM 区域的开头)可能比闪存区域更快?

这是否意味着如果所有的中断处理程序都在编译时定义并已知,就根本不需要使用 VTOR?

原因有很多。不过我觉得大概有3个主要原因。

  1. 您正在使用引导加载程序,它基于 0x00000000。当引导加载程序完成其工作后,它会跳转到应用程序。应用程序可能希望拥有自己的向量 table,以便引导加载程序可以在启动应用程序之前设置地址。

  2. 您需要一个基于 RAM 的矢量 table 以便您可以在运行时安装不同的处理程序。

  3. 应用程序可能会在 运行 之前从某些外部 ROM 加载到 RAM 中。

此类功能的目的是引导加载程序。例如,当引导加载程序正在对用户定义的向量 table 所在的闪存进行编程时,MCU 将不得不同时使用位于其他地方的向量 table。

每次ARM M3复位时,默认从地址0x00000000取值存入SP寄存器,从地址0x00000004取值存入PC。这是启动代码执行的起点。 发生这种情况是因为 VTOR 寄存器默认设置为 0,向量 table 起始地址设置为 0x0000000。

Bootcode 检查是否有来自 UART 的需求以启动代码接收新固件。如果有需求,引导代码逐字节接收,并使用从 UART 端口接收到的数据对 FLASH 存储器进行编程。

完成此工作后,引导代码将 VTOR 寄存器更改为 0x08001000 并跳转到地址 0x0001000,这是新向量 table 的起始地址。这是起始用户代码

void main() 

此功能与 Cortex M 的可编程 VTOR 非常好,简化了引导代码程序和代码。通常 microprocessor/microcontroller 有固定的矢量值地址。