【问题标题】:understanding uart registers indexing了解 UART 寄存器索引
【发布时间】:2017-04-11 08:12:19
【问题描述】:

下面的函数打印出一个UART寄存器的内容。这是寄存器映射。

uart registers

有人可以解释为什么,+=4 中的 for 循环上升了吗?

谢谢

#define UART0_BASE 0x21000

void print_uart(unsigned int base) {
int i;
int val;
unsigned int adr;

  for (i=0; i< 0x18; i+=4) {
    adr = base + i;
    printf("Uart %s [0x%x] -> 0x%x\n",uart_reg[i>>2],adr,val);
  }
}

【问题讨论】:

  • 看起来坏了。它适用于什么处理器?
  • 外部外围设备的地址不需要在“线”的两侧相同。您可以将 UART 的 A0..An 连接到 CPU/内存控制器的 A2..An+2,并将 A0,A1 固定在地面上。这将导致 CPU 端有 4 个地址的距离,而它们在 UART 端仍然相邻。由于您的 UART 有 16 位寄存器,每个地址已经代表 2 个字节。

标签: c cpu-registers uart


【解决方案1】:

最有可能适合每个寄存器的起始地址。因为 for 循环运行到 0x18(24),所以它有 6 个寄存器。看起来寄存器只有 16 位,但通常还有一些填充。

【讨论】:

  • 谢谢,这可能是一个愚蠢的问题——但如果基地址是0x21000 并且寄存器是 16 位——如何递增 4 到下一个寄存器?
  • 好吧,我假设每个寄存器实际上需要 32 位数据。 16 位的东西和 16 位的填充。所以 +=4 代表 4 个字节。要跳转到下一个寄存器,您需要跳过当前寄存器。所以基数 0x21000 是接收数据的位置,0x21001 是保留字节,0x21002 是填充,0x21003 是填充。 0x21004 是下一个寄存器,我不能 100% 确定这一点,因为我不知道您使用的是哪个处理器,但如果您的代码有效,这很可能是这种情况
  • 谢谢,我猜你是对的。我使用的是 32 位的 NIOS 处理器。欢呼
猜你喜欢
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
相关资源
最近更新 更多