我对ST微电子的这种架构设计感到困惑。 以STM32F407VG为例。程序加载到闪存中的地址 0x08000000 处。该地址被映射到地址 0x00000000,因为复位后处理器首先查看 0x00000000。 为什么不直接将 flash 首地址设置为 0x00000000。内存别名有什么好处?
处理器核心正在查看地址 0x00000000 的堆栈指针,以及 0x00000004 的重置向量(以及其他向量)。因此,从核心的角度来看,您希望应用程序能够回答。但是这些产品除了您以后添加的应用程序之外,还包含一个工厂编程的引导加载程序,那么如何用一个地址引导两个程序呢?一种方法是将它们镜像到该地址。如果您还想添加让处理器从 sram 启动的功能,您也需要将其映射进去。
因此,除了某些芯片之外,并非所有芯片都通过基于带引脚或非易失性寄存器位等进行镜像来解决问题。
STM32 部件只会映射 0x00000000 处的百分比,因此您确实想为 0x08000000 构建应用程序(或其他一些地址,如 0x02000000 作为其部件的一小部分,请阅读文档!)。例如向量表看起来像:
0x20001000
0x08000031
...
处理器核心读取 0x00000004 得到值 0x08000031,这意味着开始执行复位处理程序地址 0x08000030 处的指令。从那里开始,程序从 0x08000000 地址空间运行,而不是 0x00000000。
不是每个人都这样做,但有些人这样做,不限于ST(STM32)。
并非每个人都在芯片上编程了引导加载程序,其中一些没有理由复用该地址空间,也不会这样做。
除了old_timer的答案涵盖了很多内容之外,对于其他部分,例如基于Cortex M0的STM32F0系列,没有
SCB->VTOR
向量表偏移寄存器,要解决这个问题,您可以将不同的区域(RAM或闪存)映射到0x00000000以允许你有一个运行时可修改的向量表。
简单地说,内存别名提供了将内存地址 0x0000_0000 映射到闪存、SRAM 或系统内存的选项,以防用户想要从这些内存区域中的任何一个启动应用程序。为了支持我的说法,请检查下面给出的 STM32f407 快照中的快照。 在此输入图片描述