我想了解各种外设/ IP的寄存器如何映射到微控制器中的ARM处理器存储器映射。
说,我有一个UART块的CONTROL寄存器。当我对地址(40005008)进行写访问时,会配置该寄存器。这种映射在何处发生:在外围模块代码本身内或将此外设集成到SoC /微控制器中。
答案 0 :(得分:1)
最高有效位由ASIC设计定义,最低有效位由IP设计定义。您的IP有几个寄存器。寄存器的数量,它们的顺序,由IP设计定义。这里,您的寄存器位于地址8.然后,在设计ASIC时,外设连接到存储器总线,它们的连接方式定义了它们的地址。您的UART位于40005000.您可能在(例如)40006000处有另一个相同IP的实例。两个UART严格相同,您可以在地址40006008访问第二个UART的CONTROL寄存器。
答案 1 :(得分:1)
对于像UART这样的简单外设,它很简单 - 以ARM PL011 UART为例(因为我知道它的文档在哪里):
programmer's model在4k块中的字对齐偏移处定义了一堆寄存器。
就the actual hardware而言,我们看到总线接口与程序员模型建议的匹配 - PADDR [11:2]表示只有地址的11:2位连接,这意味着它只能理解字对齐地址从0x000到0xffc(类似地,请注意,只有16位读/写数据被连接,因为没有寄存器比这更宽)。
UART的12位地址与CPU内核吐出的完整32位地址之间的内存映射发生在它们之间的互连硬件中。在设计时,互连地址映射将配置为“将此4k区域在0x40005000分配给UART0块”等,并为此生成总线电路。
更复杂的事情,例如支持DMA的器件通常具有用于配置和数据访问的独立接口,因此寄存器可以映射到低速外设总线上的小型可重定位模块中,就像UART一样。