我正在使用STM32F103在双操作系统系统上工作,我有两个分别在不同的FLASH位置编程的程序。如果两个程序都相同,则知道它们正在运行的唯一方法就是通过其起始向量地址。 但是我如何在STM32中读取当前程序的起始向量地址?
答案 0 :(得分:0)
在阅读注释之后,听起来您拥有/想要的是一个引导程序。如果您的目标是拥有两个不同的应用程序,一个用于执行主处理和实时处理,另一个仅对新固件进行编程,那么您想在默认的引导闪存空间中创建一个引导程序。
Bootloader从根本上做一些事情,其他所有事情都是多余的。
引导加载程序还将在应用程序空间中对应用程序进行编程,并在跳转之前验证它们是否已正确编程。对于在闪存空间中对十六进制文件进行编程以验证应用程序之前,Colin提出了一些很好的建议。
有一些需要注意的地方。第一个是链接描述文件,这非常重要。链接程序脚本将用于将输入对象映射到输出对象,然后根据该脚本确定它们进入的内存空间。对于这两个应用程序,您都需要创建一个内存映射图,以表明您希望两个程序位于闪存空间内的方式。从这一点出发,您可以为这两个程序制作链接程序脚本,以便可以在您认为该程序可接受的闪存空间的参数范围内生成一个十六进制文件。您拥有的每个项目都有自己的链接描述文件。一个例子看起来像这样:
LR_IROM1 0x08000000 0x00010000 { ; load region size_region
ER_IROM1 0x08000000 0x00010000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00018000 { ; RW data
.ANY (+RW +ZI)
}
}
这将为应用程序提供RAM以及应用程序的起点。
此后,您可以启动引导加载程序,并向其提供有关应用程序空间用于跳转和编程的位置的信息。再次由您从内存映射和这两个应用程序的链接器脚本确定。您将需要在链接器内为CRC和长度添加一个单独的条目,以比较计算所得的值和存储的值。无论使用哪种工具将CRC附加到十六进制文件并将其编程为刷新空间,请记住要记下该位置并将其告知链接描述文件,以便以后可以引用这些地址以检查完整性。
检查所有内容并确定可以进入该应用程序后,可以使用一些ARM程序集跳转到起始应用程序地址。跳转之前,请确保禁用引导加载程序中启用的所有外围设备和中断。正如Colin所提到的,这些将共享RAM,因此对所有使用过的设备进行初始化非常重要,否则,将导致硬故障。
这时,程序使用了链接器脚本布置的另一个十六进制文件,因此只要您具有正确的向量表偏移量,它就应该按计划开始执行。
关于您对“ Flash向量地址”的疑问,我认为您的真正意思是中断向量表地址。中断向量表是内存中的数据结构,可将中断请求映射到中断处理程序的地址。例如,这是PC寄存器在硬件中断触发时获取下一个可用指令地址的地方。通过在几行汇编代码中跟踪ARM管道,可以看到这一点。该表的每个条目都是处理程序的地址。该偏移量必须与您的应用程序对齐,否则您将永远不会进入主函数,并且程序将位于应用程序空间中,但由于所有处理程序地址都是未知的,因此无需执行任何操作。这就是SCB->VTOR
的目的。它是向量中断表偏移地址寄存器。在这种情况下,您可以做一些事情。幸运的是,这些是在STM生成的文件“ system_stm32(xx)xx.c”(xx是您的微控制器变体)内部的硬编码。有一个名为VECT_TAB_OFFSET
的定义,它是向量表的内存映射中的偏移量,并使用选定的值分配给SCB->VTOR
寄存器。您的中断向量表将始终位于主应用程序的起始地址,因此对于引导加载程序,它可以为0x00
,但对于应用程序,它将是应用程序空间的起始地址的减法,并且微控制器的第一个可寻址闪存地址。
/************************* Miscellaneous Configuration ************************/
/*!< Uncomment the following line if you need to relocate your vector Table in
Internal SRAM. */
/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field.
This value must be a multiple of 0x200. */
/******************************************************************************/
在进行编程之前,请确保使用STM文档了解微观方面的期望。该芯片中的向量表只能是0x200
的倍数。但是要回答您的问题,此地址可由几件事决定。您的内存映射,最终将有一个硬编码引用作为定义。您可以从那里弄清楚。
希望这对您的应用程序有帮助并祝您好运。