2016-08-17 7 views
1

特定の固定アドレスにマップされたマイクロコントローラ内の特定のレジスタにアクセスする方法を知りたがっています。私はこの問題についてGoogleで検索し、私は以下のが見つかりました:ポインタを使用してマイクロコントローラの特定のレジスタにアクセスする方法

#define WDTCTL  (*((volatile unsigned short *)0x0120)) 
#define P1DIR (*((volatile unsigned char *)0x0022)) 

作品のこの方法は絶対に罰金が、私はそれがどのように動作するか理解していません。

誰かが私に説明できると嬉しいです。

+0

を参照してください私は何回か、すでに同様の質問を見ましたが、だまされやすい人を見つけることができません。 – Groo

+0

この質問には何百もの重複があります。 – Lundin

+0

お元気ですか、以前に尋ねられた同じ質問へのリンクを提供することができます –

答えて

1

WDTCTL(*((揮発性のunsigned short *)0x0120))を定義

これはWDTCTLレジスタアドレス0x0120であることを意味します。 (volatile unsigned short *)はそれを短いポインタに型キャストします。 (*((volatile unsigned short *)0x0120))はそのポインタの位置に値を与えます。

ここでvolatileを使用する理由は、マイクロコントローラのアドレスの場合、値はCコードとは無関係にいつでも変更できます。 volatileキーワードは、このレジスタの周りのコンパイラの最適化を許可しません。詳細については

Why is volatile needed in C?

+0

お返事ありがとうございます。私は上記のように "揮発性の符号なしshort * WDTCTL"、 "WDTCTL = 0×0120"とし、 "* WDTCTL = 0x01"を逆参照し、私が望むものを書くことができますか? Pls reply –

+0

はい、そういうことができます。しかし、あなたの場合は、ポインタ変数 'WDCTL'を割り当てています。これはいくらかのメモリを必要とします。また、マイクロコントローラのすべてのレジスタに対して実行する必要があります。メモリが多すぎる可能性があります。 –

関連する問題