STM32当前闪存矢量地址

问题描述 投票:0回答:1

我正在使用STM32F103的双OS系统,我有两个独立的程序,可以在不同的FLASH位置编程。如果两个程序都是相同的,那么知道它们中的哪一个运行的唯一方法就是它的起始向量地址。但是如何在STM32中读取当前程序启动向量地址???

memory stm32 ram bootloader flash-memory
1个回答
0
投票

阅读完评论后,听起来就像你拥有/想要的是一个引导加载程序。如果您的目标是拥有两个不同的应用程序,一个用于执行主处理和实时处理,另一个用于编写新固件,那么您需要在默认启动闪存空间中创建一个启动加载程序。

Bootloaders从根本上做了一些事情,其他一切都是额外的。

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

Bootloader还将在应用程序空间中编写应用程序,并在跳转之前验证它们是否已正确编程。 Colin给出了一些很好的建议,即在将其编程到闪存空间中以验证应用程序之前,将CRC附加到hex文件。

有几点需要注意。第一个是链接器脚本,这非常重要。链接描述文件将用于将输入对象映射到输出对象,然后根据该脚本确定它们进入的内存空间。对于这两个应用程序,您需要创建一个内存映射,显示两个程序如何位于闪存空间内。从这一点开始,您可以为这两个程序创建链接描述文件,以便可以在您认为可接受的程序闪存空间的参数范围内生成hex文件。您拥有的每个项目都有自己的链接描述文件。一个例子看起来像这样:

  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附加到hex文件并将其编程到flash空间,请记住注意位置并让链接器脚本知道它,以便您可以引用这些地址以便稍后检查完整性。

检查完所有内容并确定可以转到应用程序后,可以使用某些ARM程序集跳转到起始应用程序地址。在跳转之前,请确保禁用引导加载程序中启用的所有外围设备和中断。正如Colin所说,这些将共享RAM,因此重新初始化所有使用的内容非常重要,否则,您将最终遇到硬故障。

此时,程序使用了链接器脚本布局的另一个十六进制文件,因此它应该按计划开始执行,只要您具有正确的向量表偏移量,它就会完全进入您的问题。

至于你对“Flash向量地址”的问题,我认为你的中断向量表地址真正意味着什么。中断向量表是存储器中的数据结构,它将中断请求映射到中断处理程序的地址。例如,这是PC寄存器在硬件中断触发时抓取下一个可用指令地址的地方。您可以通过几行汇编代码跟踪ARM管道来看到这一点。该表的每个条目都是处理程序的地址。此偏移量必须与您的应用程序对齐,否则您将永远不会进入主函数,程序将位于应用程序空间中,但由于所有处理程序地址都未知,因此无需执行任何操作。这就是SCB->VTOR的用途。它是向量中断表偏移地址寄存器。在这种情况下,您可以做一些事情。幸运的是,这些是在文件“system_stm32(xx)x​​x.c”中的STM生成文件内部进行硬编码(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的倍数。但要回答你的问题,这个地址可以通过一些事情来确定。你的内存映射,最终,你将有一个硬编码的引用作为一个定义。你可以从那里弄明白。

希望这对您的申请有帮助,祝您好运。

© www.soinside.com 2019 - 2024. All rights reserved.