我有两块ARM Cortex-M3芯片: STMF103C8T6 和 STM32F103VET6 。
设置为从RAM引导时, STMF103C8T6 的初始状态为PC
; 0x20000108
用于 STM32F103VET6 。
我无法在数据表中找到有关这些地址的信息。他们为什么以这种方式启动,在哪里可以找到有关它的信息?
要澄清。当芯片组从闪存启动时,0x200001e0
寄存器指向复位处理程序的位置。该地址在复位向量表中的地址0x0处提供。但是,当芯片组从RAM引导时,PC
指向上面提到的常量地址。
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>:
...
答案 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。这是因为该部分具有更大的向量表,并且中等密度地址将在其向量表内。
使用的位置和值的完整列表是:
值得庆幸的是,这种行为在很大程度上似乎是F103 / 5/7系列所独有的。较新的部件使用不同的方法来控制启动,这些方法更加一致。