2017-04-11 75 views
0

下面的函数打印出UART寄存器的内容。这是注册地图。了解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); 
    } 
} 
+0

看起来破损。它的处理器是什么? – unwind

+0

“线”两侧的外部外围设备地址不需要相同。 你可以将你的UART的'A0..An'连接到你的CPU /存储器控制器的'A2..An + 2'上,'A0,A1'固定在地。 这会导致CPU侧4个地址的距离,而它们在UART侧仍然相邻。 由于你的UART有16位寄存器,每个地址已经代表2个字节。 – Gerhardh

回答

0

最有可能以适应每个寄存器的起始地址。由于for循环运行至0x18(24),因此它有6个寄存器。它可能看起来像寄存器只有16位,但通常也有一些填充。

+0

感谢,也许是一个愚蠢的问题 - 但如果基地址是“0x21000”和寄存器是16位 - 增量4如何到达下一个寄存器? –

+0

嗯,我假设每个寄存器实际上需要32位数据。 16位填充和16位填充。 所以+ = 4代表4个字节。 要跳转到下一个寄存器,您需要跳过当前的寄存器。所以基址0x21000是接收数据的地方,0x21001是保留字节,0x21002是填充,0x21003是填充。 0x21004是下一个寄存器 我不能100%确定这一点,因为我不知道你正在使用哪个处理器,但是如果你的代码工作,这很可能是这种情况 – user3660570

+0

谢谢,我想你的答案是正确的。我使用的是32位的NIOS处理器。干杯 –