2017-04-11 109 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處理器。乾杯 –