从RAM初始状态启动ARM Cortex-M3

时间:2018-06-21 21:14:28

标签: arm embedded stm32 cpu-registers cortex-m3

我有两块ARM Cortex-M3芯片: STMF103C8T6 STM32F103VET6

设置为从RAM引导时, STMF103C8T6 的初始状态为PC0x20000108用于 STM32F103VET6

我无法在数据表中找到有关这些地址的信息。他们为什么以这种方式启动,在哪里可以找到有关它的信息?

编辑:

要澄清。当芯片组从闪存启动时,0x200001e0寄存器指向复位处理程序的位置。该地址在复位向量表中的地址0x0处提供。但是,当芯片组从RAM引导时,PC指向上面提到的常量地址。

编辑2:

STMF103C8T6 拆卸:

PC

STM32F103VET6 拆卸:

20000000 <Vectors>:
20000000:       20005000        andcs   r5, r0, r0
20000004:       2000010f        andcs   r0, r0, pc, lsl #2
20000008:       2000010d        andcs   r0, r0, sp, lsl #2
2000000c:       2000010d        andcs   r0, r0, sp, lsl #2
20000010:       2000010d        andcs   r0, r0, sp, lsl #2
20000014:       2000010d        andcs   r0, r0, sp, lsl #2
20000018:       2000010d        andcs   r0, r0, sp, lsl #2
    ...
20000108:       f000 b801       b.w     2000010e <Reset_Handler>

2000010c <HardFault_Handler>:
2000010c:       e7fe            b.n     2000010c <HardFault_Handler>

2000010e <Reset_Handler>:
    ...

1 个答案:

答案 0 :(得分:2)

  

我无法在数据表中找到有关这些地址的信息。他们为什么以这种方式启动,在哪里可以找到有关它的信息?

据我所知,ST尚无官方文件提及这种行为,更不用说对其进行详细解释了。 The STM32F1 family reference manual在第3.4节(“启动配置”)中模糊地指出:

  

由于其固定的内存映射,代码区从地址0x0000开始(通过ICode / DCode总线访问),而数据区(SRAM)从地址0x2000 0000开始(通过系统总线访问)。 Cortex®-M3CPU始终在ICode总线上获取复位向量,这意味着引导空间仅在代码区域(通常为闪存)中可用。 STM32F10xxx微控制器实现了一种特殊的机制,不仅可以从SRAM引导,而且不仅可以从主闪存和系统存储器引导。

这些地址和值唯一被引用的唯一位置是它们的某些模板启动文件中,即使如此,也并非全部。为ARM和IAR工具链提供的SPL启动文件缺少对BootRAM的支持。此功能仅包含在GCC和TrueSTUDIO工具链的启动文件中。

无论如何。这是我对情况的最佳分析。

复位STM32F1部件时,将根据BOOT引脚的配置来映射从0x00000000开始的存储块。设置为从闪存引导时,该块将别名为闪存;设置为从引导加载程序运行时,该块将别名为内部ROM块(大约或略低于0x1FFFF000)。但是,当设置为从RAM引导时,会发生非常奇怪的情况。

不是像您期望的那样将存储块别名为SRAM,而是将该存储块别名为一个很小的(16字节!)ROM。在STM32F103C8(中等密度)部分上,此ROM内容如下:

20005000 20000109 20000004 20000004

此数据被解释为向量表:

  • 第一个字使堆栈指针初始化为0x20005000,它位于RAM的顶部。

  • 第二个字是复位向量,并设置为0x20000108(低位设置为启用Thumb模式)。该地址也位于RAM中,比向量表的末尾多了几个字,在这里应该将“魔术”值设为0xF108F85F。这实际上是指令ldr.w pc, [pc, #-480],它从RAM加载实际的复位向量并分支到该分支。

  • 第三个和第四个单词是NMI和Hardfault向量。它们没有设置低位,因此,如果在VTOR仍为零的情况下发生这些异常之一,则处理器将发生双重故障。令人困惑的是,PC将指向RAM中的向量表。

此ROM的确切内容因部件而异。例如,一条F107(连接线)具有ROM内容:

20005000 200001e1 20000004 20000004

具有相同的初始SP,但具有不同的初始PC。这是因为该部分具有更大的向量表,并且中等密度地址将在其向量表内。

使用的位置和值的完整列表是:

  • 低/中密度:0x0108(值:0xF108F85F)
  • 低/中密度值行:0x01CC(值:0xF1CCF85F)
    注意:ST的样本文件与低/中密度零件的值相同。我敢肯定这是错误的,并已在此处进行了更正,但是我没有要测试的任何此类零件。感谢您提供反馈以确认是否可行。
  • 其他所有:0x01E0(值:0xF1E0F85F)

值得庆幸的是,这种行为在很大程度上似乎是F103 / 5/7系列所独有的。较新的部件使用不同的方法来控制启动,这些方法更加一致。