繁体   English   中英

STM32当前闪存向量地址

[英]STM32 Current Flash Vector Address

我正在使用STM32F103在双操作系统系统上工作,我有两个单独的程序,它们在不同的FLASH位置编程。 如果两个程序都相同,则知道它们正在运行的唯一方法就是通过其起始向量地址。 但是,我如何在STM32中读取当前程序的起始向量地址?

阅读注释后,听起来您拥有/想要的是一个引导程序。 如果您的目标是拥有两个不同的应用程序,一个用于执行主处理和实时处理,另一个仅用于编程新固件,那么您想在默认的引导闪存空间中创建一个引导程序。

引导加载程序从根本上做一些事情,其他所有事情都是多余的。

  1. 使用某种数据完整性检查(例如CRC)检查自身。
  2. 检查应用程序
  3. 跳转到应用程序。

引导加载程序还将在应用程序空间中对应用程序进行编程,并在跳转之前验证它们是否已正确编程。 对于在闪存空间中对十六进制文件进行编程以验证应用程序之前,Colin提出了有关将CRC附加到十六进制文件的一些好的建议。

有一些注意事项。 第一个是链接描述文件,这非常重要。 链接程序脚本将用于将输入对象映射到输出对象,然后根据该脚本确定它们进入的内存空间。 对于这两个应用程序,您都需要创建一个内存映射图,以表明您希望两个程序位于闪存空间内的方式。 从这一点出发,您可以为这两个程序制作链接程序脚本,以便可以在您认为该程序可接受的闪存空间的参数范围内生成一个十六进制文件。 您拥有的每个项目都有自己的链接描述文件。 一个例子看起来像这样:

  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)x​​x.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倍数。 但是要回答您的问题,此地址可由几件事决定。 您的内存映射,最终将有一个硬编码引用作为定义。 您可以从那里弄清楚。

希望这对您的应用程序有帮助并祝您好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM