VTOR 在 ARM M3 中的使用
VTOR usage in ARM M3
我想知道在基于 ARM M3 的 MCU 上,使用 VTOR 寄存器重定位向量有什么好处 table?我理解的原因是:
- 向量table需要在运行时更改,默认地址(0x0为只读)
- 从 SRAM 读取(假设它被重新定位到 SRAM 区域的开头)可能比闪存区域更快?
这是否意味着如果所有的中断处理程序都在编译时定义并已知,就根本不需要使用 VTOR?
原因有很多。不过我觉得大概有3个主要原因。
您正在使用引导加载程序,它基于 0x00000000。当引导加载程序完成其工作后,它会跳转到应用程序。应用程序可能希望拥有自己的向量 table,以便引导加载程序可以在启动应用程序之前设置地址。
您需要一个基于 RAM 的矢量 table 以便您可以在运行时安装不同的处理程序。
应用程序可能会在 运行 之前从某些外部 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 有固定的矢量值地址。
我想知道在基于 ARM M3 的 MCU 上,使用 VTOR 寄存器重定位向量有什么好处 table?我理解的原因是:
- 向量table需要在运行时更改,默认地址(0x0为只读)
- 从 SRAM 读取(假设它被重新定位到 SRAM 区域的开头)可能比闪存区域更快?
这是否意味着如果所有的中断处理程序都在编译时定义并已知,就根本不需要使用 VTOR?
原因有很多。不过我觉得大概有3个主要原因。
您正在使用引导加载程序,它基于 0x00000000。当引导加载程序完成其工作后,它会跳转到应用程序。应用程序可能希望拥有自己的向量 table,以便引导加载程序可以在启动应用程序之前设置地址。
您需要一个基于 RAM 的矢量 table 以便您可以在运行时安装不同的处理程序。
应用程序可能会在 运行 之前从某些外部 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 有固定的矢量值地址。