2017-04-11 8 views
0

以下の関数は、UARTレジスタの内容を表示します。これはレジスタマップです。UARTはインデックスを登録します

uart registers

forループ+=4に上がる理由は、誰かが説明してもらえますか?

はあなたに各レジスタの開始アドレスに合う可能性が最も高い

#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'がグラウンドで固定された状態で添付することができます。 これは、UART側でまだ隣接している間に、CPU側で4つのアドレスの距離になります。 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は次のレジスタです どのプロセッサを使用しているのか分かりませんが、コードが正しく動作するかどうかはわかりません。 – user3660570

+0

ありがとうございます。私は32ビットのNIOSプロセッサを使用しています。乾杯 –

関連する問題