STM32F4启动概念和向量表重定位


8

在STM32F4微控制器的启动过程中,有些事情我不了解。

我的理解如下:

  1. ARM Cortex-M4引导程序期望堆栈指针初始化值和上的中断向量0x00000000 + SCB->VTOR,而SCB->VTOR在复位时被清除。
  2. 该位置没有内存。闪存从处开始0x08000000,SRAM 从处开始0x20000000
  3. 为了使启动成为可能,µC可以将闪存或SRAM存储器范围映射到0x00000000。要映射的存储器范围由启动引脚的状态定义。

我的问题:

  1. 为什么STM32F4参考手册在第69页上

    当器件从SRAM启动时,在应用程序初始化代码中,您必须使用NVIC异常表和偏移寄存器在SRAM中重新定位向量表。

    ?在我看来,这是没有必要的,因为整个内存区域还是会被别名的。有趣的是,当将闪存区域重新映射到0x0空间时,似乎并不需要这样做。

  2. 我可以认为,从SRAM引导的唯一用途是减少开发过程中闪存的写周期。从复位释放µC之前,您需要使用调试器将程序写入SRAM,然后从那里启动。但是,由于您具有调试器访问权限,因此无论如何从哪里引导都没有任何限制。那么为什么要具有此功能?

    引导位置是从引脚导出的(至少在我看来)表明此功能不是在开发期间使用,而是在最终操作中使用。并且在最终操作中,SRAM在启动时是清除的。因此,从SRAM引导是没有意义的。


您可能需要从RAM引导,以执行固件更新。RAM代码执行,然后重新刷新闪存的内容。更新完成后,您将从Flash重新重置执行。
Fotis Panagiotopoulos

Answers:


5

问题1:

我绝对不能回答你的第一个问题。但是在描述VTOR寄存器的编程手册中(第212页),它指出位29用于确定向量表的位置,无论是在代码区域(0)还是在SRAM区域(1)。

现在,我不明白为什么出于与您陈述的相同原因必须执行此操作,SRAM被别名为0x0,那么为什么需要设置此偏移量呢?

我唯一的猜测是在您引用的第69页上说的。他们说:

代码区从地址0x0000 0000开始(通过ICode / DCode总线访问)

数据区域(SRAM)从地址0x2000 0000开始(通过系统总线访问)

带有FPU CPU的Cortex®-M4始终在ICode总线上获取复位向量

也许在中断时使用了ICode总线,即使重新映射它也无法访问SRAM(我不知道这是不是真的)。这将解释为什么必须相应地设置该位,从而告诉内核使用系统总线并访问SRAM。

问题2:

虽然可能确实如此,但在设备第一次启动时SRAM是空的,但不一定要在以后的启动中使用。因此,您可以创建类似电池供电的设备的设备,该设备在生产期间对其SRAM进行编程,然后运行直到电池耗尽,这将清除其SRAM。我想这会使对设备进行反向工程更加困难。

在电池供电的设备中,您可能会使用待机模式以节省电量,如果退出该模式,则会再次对引导引脚进行采样,因此它们必须具有正确的设置才能再次进入SRAM。

您也可以安全地重新启动设备,因为如果没有功耗,SRAM的内容不会被破坏。

解决所有重新映射SRAM的麻烦的应用程序不是一个非常令人信服的应用程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.