微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有关Cortex-M3向量表放置的问题

如何解决有关Cortex-M3向量表放置的问题

我试图了解Cortex-M3处理器向量表的位置。

根据Cortex-M3 Arch ref手册,重置行为是这样的(某些部分被省略了):

enter image description here

因此,我们可以看到vectortable来自VTOR(向量表偏移量寄存器)。

根据Cortex-M3技术参考手册,VTOR定义为:

enter image description here

因此我们可以看到,它的重置值0x0因此,基于以上两个条件,Cortex-M3处理器在重置后会期望在代码区域中绝对地址0x0处有一个向量表。

但是在我的MDK uVision IDE中,我看到我的应用程序放置在IROM1区域中,该区域从0x8000000开始,该区域在0.5G Code内存区域内,根据Cortex-M3内存映射。

enter image description here

并且由于选中了Starup按钮,我想这意味着IROM1区域应包含向量表(如果我对此有误,请纠正我

因此,我认为向量表应位于IROM1区域的开头,即0x8000000。的确如此。下图显示IROM1的开头,它是向量表的第一个条目SP值。

enter image description here

更奇怪的是,VTOR寄存器(位于0xE000ED08处)仍然具有0x0值:

enter image description here

那么,如何用0x0 VTOR重置值找到我的向量表?

出于好奇,我检查了0x0处的内存内容,其中包含与IROM1完全相同的向量表内容那谁制作了这个魔术拷贝?

enter image description here

ADD 1-4-下午10:9/9下午4:39

我想下面的startup复选框肯定有些未知。

enter image description here

ADD 2-2020年10月9日下午5:09

感谢 @RealtimeRik @domen 。我下载了STM32F103x8_xB(https://www.st.com/resource/en/datasheet/stm32f103c8.pdf)的数据表。在第4节“内存映射”中,我看到了下图:

enter image description here

所以[0x0,0x8000000)范围似乎确实别名到其他地方。但是我还没有找到如何确定它的别名...

ADD 3-5-2020/10/9下午5:39

现在我找到了!

我下载了STM32Fxxx fef manual(但确实很大)。

3.4引导配置部分中,它指定了通过BOOT[1:0]引脚配置的引导模式。

enter image description here

在不同的启动模式下,将使用不同的地址别名:

取决于所选的引导模式,主闪存,系统内存 或按以下方式访问SRAM:

  • 从主闪存启动:主闪存在启动存储空间(0x0000 0000)中具有别名,但仍可从其访问 原始内存空间(0x800 0000)。换句话说,闪存 内容可以从地址0x0000 0000或0x800 0000开始访问。
  • 从系统内存引导:系统内存在引导内存空间(0x0000 0000)中具有别名,但仍可从其原始位置进行访问 内存空间(连接线路设备中为0x1FFF B000,英寸为0x1FFF F000 其他设备)。
  • 从嵌入式SRAM引导:仅可通过地址0x2000 0000访问SRAM。

我看到的是从主闪存启动

最后我可以解释为什么选择0x800 0000 ...

ADD 4-2020年10月15日下午3:19

地址0处的中断向量表的放置/预期类似于实模式下的IA32处理器...

解决方法

没有“魔术副本”。 0x00000000别名为0x08000000。

实际内存实际位于0x08000000,但也可以访问0x00000000。

如果您查看处理器特定的参考手册,则应在内存映射部分中找到它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。