首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从RAM初始状态启动ARM Cortex-M3

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

Stack Overflow用户
提问于 2018-06-21 21:14:28
回答 1查看 1.7K关注 0票数 2

我有两个手臂皮质m3芯片:STM32F103VET6. STMF103C8T6

当从内存启动时,STM32F103VET6.的STMF103C8T6 PC寄存器的初始状态是0x200001080x200001e0

我无法在数据表中找到和提供有关这些地址的信息。为什么他们是这样引导的,我在哪里可以找到有关它的一些信息?

编辑:

来澄清。当芯片设置为从闪存启动时,PC寄存器指向复位处理程序的位置。此地址在地址0x0的重置向量表中提供。但是当芯片被设置为从内存引导时,PC指向常量地址,上面已经提到了。

编辑2:

STMF103C8T6反汇编:

代码语言:javascript
复制
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>:
    ...

STM32F103VET6反汇编:

代码语言:javascript
复制
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>:
    ...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-23 21:56:00

我无法在数据表中找到和提供有关这些地址的信息。为什么他们是这样引导的,我在哪里可以找到有关它的一些信息?

据我所知,ST没有正式的文档提到这种行为,更不用说详细解释了。STM32F1家庭参考手册在第3.4节(“启动配置”)中含糊地指出:

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

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

不管怎么说。这是我对形势的最好分析。

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

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

代码语言:javascript
复制
20005000 20000109 20000004 20000004

此数据被解释为向量表:

  • 第一个字导致堆栈指针被初始化为0x20005000,它位于RAM的顶部。
  • 第二个字是重置向量,并设置为0x20000108 (低位设置为启用拇指模式)。这个地址也在RAM中,在向量表的末尾有几个字,您应该将“魔术”值0xF108F85F放在这里。这实际上是指令ldr.w pc, [pc, #-480],它从内存中加载真正的复位向量并将其分支到其中。
  • 第三和第四个词是NMI和硬故障向量。它们没有低位集,因此,如果在VTOR仍然为零的情况下出现这些异常,处理器将出现双重故障。令人困惑的是,PC机将被放在RAM中的向量表上。

这个ROM的确切内容在各个部分之间略有不同。例如,F107 (连接线)具有ROM内容:

代码语言:javascript
复制
20005000 200001e1 20000004 20000004

它有相同的初始SP,但是一个不同的初始PC。这是因为这个部分有一个更大的向量表,而中等密度地址将在它的向量表中。

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

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50977529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档