我有以下几行代码

#define SCB_VTOR            SCB_VTOR_REG(SystemControl_BASE_PTR)
#define SCB_VTOR_REG(base)                       ((base)->VTOR)
/* VTOR Bit Fields */
#define SCB_VTOR_TBLOFF_MASK                     0xFFFFFF80u
#define SCB_VTOR_TBLOFF_SHIFT                    7
#define SCB_VTOR_TBLOFF(x)                       (((uint32_t)(((uint32_t)(x))<<SCB_VTOR_TBLOFF_SHIFT))&SCB_VTOR_TBLOFF_MASK)



extern uint32_t __vector_table[];
SCB_VTOR = (uint32_t)__vector_table;


在我的main.c文件中。

并且在链接器描述文件的中断部分中有我的__vector_table,如下所示:

MEMORY
{
  m_interrupts  (rx) : ORIGIN = 0x00002000, LENGTH = 0xC0   /*192 Bytes*/
  ....
  ....
  ....
  ....

 .interrupts :
  {
    __vector_table = .;
    . = ALIGN(4);
    KEEP(*(.vectortable)) /* Startup code */
    . = ALIGN(4);
  } > m_interrupts


当发生中断时,由于我将寄存器SCB_VTOR加载到__vector_table的地址,它将指向向量表的当前位置,对吗? SCB_VTOR = (uint32_t)__vector_table;是什么意思?我的SCB_VTOR指向代码的地址0x00002000行吗?提前致谢

最佳答案

__vector_table包含链接程序脚本中包含的地址(__vector_table = .;表示获取当前地址的值,即,如果前面的部分占用8kB,__vector_table将包含下一个地址)。

是的,考虑到SCB_VTOR0x00002000中加星号,interrupts包含地址0x00002000,根据链接描述文件,要做的第一件事就是获取地址。

请记住,某些CPU / MCU具有固定的向量表,并且该表始于特定的寄存器。

09-20 10:31