This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM3354: GPMC地址空间分配和数据发送的问题

Part Number: AM3354

我最近在CCS上使用GPMC向FPGA发送数据。

想问一下GPMC的BASEADDRESS和MASKADDRESS是怎么使用的,我把BASEADDRESS和MASKADDRESS全部分配为0x00后使用指针向0x00地址写数据发现输出地址不符合预期。

当我把BASEADDRESS分配为0x08后MASKADDRESS如果分配为0x00的话程序会跑飞,分配为0x08则不会。BASEADDRESS分配为其他值也会跑飞,想问一下这是什么原因。并且如果我想获得一块256M的地址空间要怎么分配,且如何赋值才能让GPMC输出正确的地址。

  • 首先,GPMC是用于处理外部存储器接口的控制器,它允许处理器与外部存储器进行数据传输。在使用GPMC时,需要正确配置BASEADDRESS和MASKADDRESS以确保正确的地址映射和数据传输。

    BASEADDRESS是用来指定GPMC的起始地址,而MASKADDRESS用来指定GPMC的地址掩码。通过配置这两个寄存器,可以确保处理器与外部存储器进行正确的地址映射和数据传输。

    如果你将BASEADDRESS和MASKADDRESS全部分配为0x00,然后使用指针向0x00地址写数据,可能会导致输出地址不符合预期。这可能是因为0x00地址通常是保留地址,不应该用于数据传输。

    另外,当你将BASEADDRESS分配为0x08后,如果MASKADDRESS分配为0x00,程序会出现错误,而分配为0x08则不会。这可能是因为MASKADDRESS用来指定地址的掩码,而0x00可能导致地址匹配错误。你需要根据你的需求正确配置MASKADDRESS以确保正确的地址匹配。

    如果你想获得一块256M的地址空间,你需要根据你的外部存储器的地址范围来配置BASEADDRESS和MASKADDRESS。通常情况下,你需要将BASEADDRESS设置为你的外部存储器的起始地址,然后根据你的地址空间大小来配置MASKADDRESS以确保正确的地址映射。

  • 感谢你的解答,但是我对于地址掩码的分配还是没有理解,在TRM中看到MASKADDRESS的机制应该是高位地址的掩码,当我设置成0x08时A27就会被消除,所以只能用到128M地址空间,但是按这个逻辑的话设置0x00不应该出错,我没有理解你说的地址匹配错误是什么意思

  • 你好,我把基地址改成0x10后解决了地址空间的问题,虽然没有找到具体依据,但我猜测可能GPMC的256M地址空间只能申请0x00~0x0FFFFFFF和0x10000000~0x1FFFFFFF这两段,而不能在0x00~0xFFFFFFFF里随意申请

  • 我很抱歉,可能我之前的回答并没有清楚地解释地址掩码的概念。让我来给您一个更加清晰的解释。

    在技术参考手册(TRM)中,MASKADDRESS 的作用是用来掩码高位地址的。当设置 MASKADDRESS 时,它会将对应位的地址掩码为 0,这样可以限制可访问的地址范围。比如,当设置 MASKADDRESS 为 0x08 时,它会将对应的 A27 位(即 2^27)掩码为 0,这意味着只有 128M 的地址空间是可访问的,因为 A27 位被掩码为 0 后,其他位的变化不会影响地址的范围。

    如果您设置 MASKADDRESS 为 0x00,这意味着没有地址被掩码,所有的地址位都是有效的。这不应该导致错误,除非设置了其他的参数或者有其他的配置错误。

    当我提到地址匹配错误时,我指的是当您设置了错误的 MASKADDRESS 或者其他相关的地址控制寄存器时,可能会导致对地址的访问不符合预期,或者导致寻址错误。这可能会导致系统无法正确访问存储器或者外设,从而影响系统的正常运行。

    希望这次解释更加清晰明了。如果您有任何其他问题,欢迎随时提出。

  • 您的猜测是正确的。GPMC(General-Purpose Memory Controller)的地址空间通常是按照特定的规则进行分配的。对于某些系统,GPMC 可能只能访问特定的地址范围,而不是整个 32 位地址空间。

    通常情况下,GPMC 控制器的地址空间是由基地址寄存器(base address register)和掩码寄存器(mask register)来配置的。基地址寄存器确定了 GPMC 可以访问的起始地址,而掩码寄存器用于指定哪些地址位是有效的。这种配置可以确保 GPMC 只能访问特定的地址范围,从而避免对不属于 GPMC 控制的地址进行访问。

    根据您的描述,将基地址改为 0x10 解决了地址空间的问题,这可能意味着在您的系统中,GPMC 只能访问 0x00~0x0FFFFFFF 和 0x10000000~0x1FFFFFFF 这两个特定的地址范围。这种限制通常是由硬件设计和系统配置决定的。

    所以您的猜测是合理的,GPMC 的地址空间通常受到一定的限制,而不是可以随意申请整个 32 位地址空间。

  • 明白了,感谢您的解答