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

ARM Cortex-M3从RAM启动初始状态,arm,embedded,stm32,cpu-registers,cortex-m3,Arm,Embedded,Stm32,Cpu Registers,Cortex M3,我有两臂Cortex-M3芯片:STMF103C8T6和STM32F103VET6 当设置为从RAM引导时,STMF103C8T6PC寄存器的初始状态为0x200001080x200001e0 我无法在数据表中找到有关这些地址的信息。为什么它们是这样启动的?我在哪里可以找到有关它的信息 编辑: 澄清。当芯片设置为从闪存启动时,PC寄存器指向复位处理器的位置。该地址在地址0x0的重置向量表中提供。但当芯片设置为从RAM启动时,PC指向上述恒定地址 编辑2: STMF103C8T6拆解: 20000

我有两臂Cortex-M3芯片:STMF103C8T6STM32F103VET6

当设置为从RAM引导时,STMF103C8T6
PC
寄存器的初始状态为
0x20000108
0x200001e0

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

编辑: 澄清。当芯片设置为从闪存启动时,
PC
寄存器指向复位处理器的位置。该地址在地址0x0的重置向量表中提供。但当芯片设置为从RAM启动时,
PC
指向上述恒定地址

编辑2: STMF103C8T6拆解:

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>:
    ...
20000000 <Vectors>:
20000000:       20005000        andcs   r5, r0, r0
20000004:       200001e7        andcs   r0, r0, r7, ror #3
20000008:       200001e5        andcs   r0, r0, r5, ror #3
2000000c:       200001e5        andcs   r0, r0, r5, ror #3
20000010:       200001e5        andcs   r0, r0, r5, ror #3
20000014:       200001e5        andcs   r0, r0, r5, ror #3
20000018:       200001e5        andcs   r0, r0, r5, ror #3
    ...
200001e0:       f000 b801       b.w     200001e6 <Reset_Handler>

200001e4 <HardFault_Handler>:
200001e4:       e7fe            b.n     200001e4 <HardFault_Handler>

200001e6 <Reset_Handler>:
    ...
20000000:
20000000:20005000和CS r5、r0、r0
2000004:2000010f和CS r0、r0、pc、lsl#2
2000008:2000010d和CS r0、r0、sp、lsl#2
200000C:2000010d和CS r0、r0、sp、lsl#2
2000010:2000010d和CS r0、r0、sp、lsl#2
2000014:2000010d和CS r0、r0、sp、lsl#2
2000018:2000010d和CS r0、r0、sp、lsl#2
...
20000108:f000 b801 b.w 2000001E
200001C:
200001C:e7fe b.n 200001C
200001E:
...
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>:
    ...
20000000 <Vectors>:
20000000:       20005000        andcs   r5, r0, r0
20000004:       200001e7        andcs   r0, r0, r7, ror #3
20000008:       200001e5        andcs   r0, r0, r5, ror #3
2000000c:       200001e5        andcs   r0, r0, r5, ror #3
20000010:       200001e5        andcs   r0, r0, r5, ror #3
20000014:       200001e5        andcs   r0, r0, r5, ror #3
20000018:       200001e5        andcs   r0, r0, r5, ror #3
    ...
200001e0:       f000 b801       b.w     200001e6 <Reset_Handler>

200001e4 <HardFault_Handler>:
200001e4:       e7fe            b.n     200001e4 <HardFault_Handler>

200001e6 <Reset_Handler>:
    ...
20000000:
20000000:20005000和CS r5、r0、r0
2000004:200001e7和CS r0、r0、r7、ror#3
2000008:200001e5和CS r0、r0、r5、ror#3
200000C:200001e5和CS r0、r0、r5、ror#3
2000010:200001e5和CS r0、r0、r5、ror#3
2000014:200001e5和CS r0、r0、r5、ror#3
2000018:200001e5和CS r0、r0、r5、ror#3
...
200001e0:f000 b801 b.w 200001e6
200001e4:
200001e4:e7fe b.n 200001e4
200001e6:
...
我无法在数据表中找到有关这些地址的信息。为什么它们是这样启动的?我在哪里可以找到有关它的信息

据我所知,ST没有官方文件提到这种行为,更不用说详细解释了。在第3.4节(“启动配置”)中含糊地指出:

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

引用这些地址和值的唯一位置是在它们的一些模板启动文件中——即使这样,也不是所有的。为ARM和IAR工具链提供的SPL启动文件缺乏对BootRAM的支持;此功能仅包含在GCC和TrueSTUDIO工具链的启动文件中

无论如何。这是我对形势的最佳分析

重置STM32F1部件时,从0x00000000开始的内存块将根据引导管脚的配置进行映射。当设置为从闪存引导时,该块被别名为闪存;当设置为从引导加载程序运行时,该块被别名为内部ROM块(大约或略低于0x1FFF000)。然而,当它被设置为从RAM引导时,一些非常奇怪的事情发生了

与您预期的将该内存块别名为SRAM不同,该内存块别名为一个很小的(16字节!)ROM。在STM32F103C8(中等密度)部件上,该ROM具有以下内容:

20005000 20000109 20000004 20000004
20005000 200001e1 20000004 20000004
该数据被解释为向量表:

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

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

  • 第三个和第四个单词是NMI和硬故障向量。它们没有低位设置,因此如果VTOR仍然为零时出现这些异常,处理器将出现双重故障。令人困惑的是,PC将指向RAM中的向量表

这本ROM的确切内容因部分而异。例如,F107(连接线)具有ROM内容:

20005000 20000109 20000004 20000004
20005000 200001e1 20000004 20000004
它有相同的初始SP,但不同的初始PC。这是因为这部分有一个较大的向量表,而中等密度地址将位于其向量表内

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

  • 低/中密度:0x0108(值:0xF108F85F)
  • 低/中密度值线:0x01CC(值:0xF1CCF85F)
    注意:ST的样本文件给出的值与低/中密度零件的值相同。我很确定这是错误的,并且已经在这里纠正了它,但是我没有任何这种类型的部件可以测试。我希望得到反馈以确认这是否有效
  • 所有其他:0x01E0(值:0xF1E0F85F)

谢天谢地,这种行为在很大程度上似乎是F103/5/7家族独有的。较新的部件使用不同的方法来控制引导,这更加一致。

您所说的“设置为从RAM引导”是什么意思?您使用的工具是什么?您设置的选项是什么?0x20000000的偏移量可能等于中断向量表的大小。做这两件事