gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 09:00:26 27 4
gpt4 key购买 nike

我有两个 ARM Cortex-M3 芯片:STMF103C8T6STM32F103VET6

当设置为从RAM启动时,STMF103C8T6PC寄存器的初始状态为0x200001080x200001e0 用于STM32F103VET6

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

编辑:

澄清一下。当芯片设置为从闪存启动时,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>:
...

STM32F103VET6拆解:

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>:
...

最佳答案

I am unable to find and information about these addresses in the datasheets. Why are they booted this way and where I can find some information about it?

据我所知,ST 没有任何官方文档提及这种行为,更不用说详细解释了。 The STM32F1 family reference manual第 3.4 节(“启动配置”)中含糊地指出:

Due to its fixed memory map, the code area starts from address 0x0000 0000 (accessed through the ICode/DCode buses) while the data area (SRAM) starts from address 0x2000 0000 (accessed through the system bus). The Cortex®-M3 CPU always fetches the reset vector on the ICode bus, which implies to have the boot space available only in the code area (typically, Flash memory). STM32F10xxx microcontrollers implement a special mechanism to be able to boot also from SRAM and not only from main Flash memory and System memory.

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

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

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

不像您所期望的那样将该内存块别名为 SRAM,而是将该内存块别名为一个微小(16 字节!)ROM。在 STM32F103C8(中等密度)部件上,该 ROM 具有以下内容:

20005000 20000109 20000004 20000004

此数据被解释为向量表:

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

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

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

该 ROM 的具体内容因部分而异。例如,F107(连接线)具有 ROM 内容:

20005000 200001e1 20000004 20000004

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

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

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

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

关于ARM Cortex-M3 从 RAM 初始状态启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50977529/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com