Ser*_*gey 2 embedded arm stm32 cpu-registers cortex-m
我有两个 ARM Cortex-M3 芯片:STMF103C8T6和STM32F103VET6。
当设置为从 RAM 启动时,STMF103C8T6 PC寄存器的初始状态为0x20000108;0x200001e0对于STM32F103VET6。
我无法在数据表中找到有关这些地址的信息。为什么它们以这种方式启动?我在哪里可以找到有关它的一些信息?
澄清。当芯片设置为从闪存启动时,PC寄存器指向复位处理程序的位置。该地址在复位向量表的地址 0x0 处提供。但是当芯片设置为从 RAM 启动时,PC指向上面提到的恒定地址。
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>:
...
Run Code Online (Sandbox Code Playgroud)
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>:
...
Run Code Online (Sandbox Code Playgroud)
小智 5
\n\n\n我无法在数据表中找到有关这些地址的信息。为什么它们以这种方式启动?我在哪里可以找到有关它的一些信息?
\n
据我所知,ST 没有官方文档提到这种行为,更不用说详细解释了。STM32F1 系列参考手册在第 3.4 节(“启动配置”)中含糊地指出:
\n\n\n\n\n由于其固定的内存映射,代码区域从地址 0x0000\xc2\xa00000 开始(通过 ICode/DCode 总线访问),而数据区域(SRAM)从地址 0x2000\xc2\xa00000 开始(通过系统总线访问)。Cortex\xc2\xae-M3 CPU 始终在 ICode 总线上获取复位向量,这意味着引导空间仅在代码区域(通常为闪存)可用。STM32F10xxx 微控制器实现了一种特殊的机制,不仅可以从主闪存和系统内存启动,还可以从 SRAM 启动。
\n
这些地址和值唯一被引用的地方是在它们的一些模板启动文件中——即使如此,也不是全部。为 ARM 和 IAR 工具链提供的 SPL 启动文件缺乏对 BootRAM 的支持;此功能仅包含在 GCC 和 TrueSTUDIO 工具链的启动文件中。
\n\n无论如何。这是我对情况的最佳分析。
\n\n当 STM32F1 部件复位时,从 0x00000000 开始的内存块将根据 BOOT 引脚的配置进行映射。当它设置为从闪存启动时,该块被别名为闪存;当它设置为从引导加载程序运行时,该块被别名为内部 ROM 块(大约或略低于 0x1FFFF000)。然而,当它设置为从 RAM 启动时,会发生一些非常奇怪的事情。
\n\n正如您所期望的那样,该内存块不是别名为 SRAM,而是别名为微小(16 字节!)ROM。在 STM32F103C8(中等密度)部件上,该 ROM 包含以下内容:
\n\n20005000 20000109 20000004 20000004\nRun Code Online (Sandbox Code Playgroud)\n\n该数据被解释为向量表:
\n\n第一个字导致堆栈指针初始化为 0x20005000,位于 RAM 的顶部。
第二个字是复位向量,设置为 0x20000108(低位设置为启用 Thumb 模式)。该地址也位于 RAM 中,位于向量表末尾之外的几个字处,您应该将“神奇”值 0xF108F85F 放在此处。这实际上是指令ldr.w pc, [pc, #-480],它从 RAM 加载真正的复位向量并分支到它。
第三个和第四个字是 NMI 和硬故障向量。它们没有设置低位,因此如果在 VTOR 仍为零时发生这些异常中的任何一个,处理器将出现双重故障。令人困惑的是,PC 将继续指向 RAM 中的向量表。
该 ROM 的具体内容因部分而异。例如,F107(连接线)具有 ROM 内容:
\n\n20005000 200001e1 20000004 20000004\nRun Code Online (Sandbox Code Playgroud)\n\n它具有相同的初始 SP,但具有不同的初始 PC。这是因为该部分具有较大的向量表,并且中等密度地址将位于其向量表内。
\n\n使用的位置和值的完整列表是:
\n\n值得庆幸的是,这种行为似乎在很大程度上是 F103/5/7 系列所独有的。较新的部件使用不同的方法来控制启动,这些方法更加一致。
\n| 归档时间: |
|
| 查看次数: |
2188 次 |
| 最近记录: |