基于ARM的SoC中的寄存器映射

基于ARM的SoC中的寄存器映射,arm,microcontroller,Arm,Microcontroller,我想了解各种外设/IP的寄存器如何映射到微控制器中的ARM处理器内存映射 比如说,我有一个UART块的控制寄存器。当我对地址(40005008)进行写访问时,将配置此寄存器。这种映射发生在何处:在外围块代码本身内,或在将该外围设备集成到SoC/微控制器时 最高有效位由ASIC设计定义,最低有效位由IP设计定义。你的IP有几个寄存器。寄存器的数量及其顺序由IP设计定义。这里,您的登记地址是8号。然后在设计ASIC时,外围设备连接到内存总线,它们的连接方式定义了它们的地址。你的UART是400050

我想了解各种外设/IP的寄存器如何映射到微控制器中的ARM处理器内存映射


比如说,我有一个UART块的控制寄存器。当我对地址(40005008)进行写访问时,将配置此寄存器。这种映射发生在何处:在外围块代码本身内,或在将该外围设备集成到SoC/微控制器时

最高有效位由ASIC设计定义,最低有效位由IP设计定义。你的IP有几个寄存器。寄存器的数量及其顺序由IP设计定义。这里,您的登记地址是8号。然后在设计ASIC时,外围设备连接到内存总线,它们的连接方式定义了它们的地址。你的UART是40005000。同一IP的其他实例可能位于(例如)40006000。两个UART完全相同,您可以访问地址为40006008的第二个UART的控制寄存器。

对于像UART这样的简单外围设备,它很简单-以ARM PL011 UART为例(因为我知道它的文档所在):

在4k块的字对齐偏移量处定义一组寄存器

在方面,我们看到总线接口符合程序员模型的建议——PADDR[11:2]意味着只连接地址的11:2位,这意味着它只能理解从0x000到0xffc的字对齐地址(类似地,请注意,只连接16位读/写数据,因为没有寄存器比这更宽)

UART的12位地址和CPU核心吐出的完整32位地址之间的内存映射发生在它们之间的互连硬件中。在设计时,互连地址映射将被配置为“0x40005000处的4k区域被分配给UART0块”等,并为此生成总线电路


更复杂的事情,例如支持DMA的设备通常有单独的接口用于配置和数据访问,因此寄存器可以映射到低速外围总线上的一个小的可重定位块中,就像UART一样。

我认为这两种情况都会发生,地址位的一些较低端口由外围模块设计定义,地址的较高部分由SoC设计人员设置。通常,SoC规范也提到外围配置。但是我不知道你是否想知道更多的细节。在这种情况下,stackexchange社区的其他部分(如电子产品)可能会帮助您。谢谢auselen。。。为了延续你的答复。。外围设备的设计代码中是否对低位进行了硬编码。。根据我们想插入外设的SoC内存区域,我们决定桥地址解码器中的高位??固定可能取决于外设-可能是为了简化设计,但我不知道其他部分。我认为即使是低到某个级别的程序员也不会关心或了解这一点。请添加作为参考。AXI/AHB将是他的顶级巴士。通常,高级地址位路由到子总线。例如,CPU连接到AXI或AHB。某些高级地址位路由到APB总线,然后通过解码中间地址位路由到IP。然后,最低地址位选择寄存器。公共汽车是一棵树。(正如你所说的+1)。另请参见:了解路由的低级硬件。