RTRM: リファレンスマニュアルを読む
マイクロコントローラはいくつものピンがあると書きました。利便性のために、これらのピンは16ピンからなるポートでグループ化されています。 各ポートは、ポートA、ポートBなどと呼ばれます。そして、各ポート内のピンは、0から15の数字で識別されます。
まず最初に見つけなければならないことは、どのピンがどのLEDに接続されているか、です。 この情報は、STM32F3DISCOVERY ユーザーマニュアル(コピーをダウンロードしましたね?)の次のセクションにあります。
Section 6.4 LEDs - Page 18
マニュアルには次のように書いてあります。
LD3
(北のLED)はPE9
ピンに接続されています。PE9
は、ポートEの9番ピンを省略した呼び方です。LD7
(東のLED)はPE11
に接続されています。
ここまでで、北/東のLEDをオン/オフするためには、PE9ピンとPE11ピンの状態を変えたいことがわかります。
これらのピンはポートEの一部であり。GPIOE
ペリフェラルを制御しなければなりません。
各ペリフェラルは、関連するレジスタブロックを持っています。レジスタブロックは、連続したメモリに割り当てられたレジスタの集まりです。
レジスタブロックの開始アドレスは、ベースアドレスと呼ばれます。GPIOE
ペリフェラルのベースアドレスが何か、を見つけ出す必要があります。
この情報は。マイクロコントローラのリファレンスマニュアルの次のセクションにあります。
Section 3.2.2 Memory map and register boundary addresses - Page 51
この表では、GPIOE
レジスタブロックのベースアドレスは0x4800_1000
であると書いてあります。
各ペリフェラルは、ドキュメント内にそのペリフェラルのセクションがあります。これらの各セクションは、ペリフェラルのレジスタブロックが内包するレジスタの表が最後に掲載されています。
ペリフェラルのGPIO
については、その表は次の場所にあります。
Section 11.4.12 GPIO register map - Page 243
GPIOE
ペリフェラルのベースアドレスから0x18
のオフセットにあるレジスタに関心が有ります。
表によると、そのレジスタはBSRR
です。
続いて、下記ページにあるBSRR
レジスタのドキュメントに移ります。
Section 11.4.7 GPIO port bit set/reset register (GPIOx_BSRR) - Page 240
ようやく!
このレジスタは、私たちが書き込みをしたレジスタです。ドキュメントは、いくつかの興味深いことを示しています。
第一に、このレジスタは書き込み専用です。試しに値を読んでみましょう:-)
。
GDBのexamine
コマンドであるx
を使います。
(gdb) next
16 *(GPIOE_BSRR as *mut u32) = 1 << 9;
(gdb) x 0x48001018
0x48001018: 0x00000000
(gdb) # nextコマンドは、北のLEDを点灯します
(gdb) next
19 *(GPIOE_BSRR as *mut u32) = 1 << 11;
(gdb) x 0x48001018
0x48001018: 0x00000000
レジスタを読み込んだ結果は、0
です。この結果は、ドキュメントに書かれていることと一致します。
他のおもしろい点は、ドキュメントに、ビット0から15が関連するピンを設定するのに使うことができる、と書いてあることです。 設定は、highの値をピンに出力することを意味します。
ドキュメントは、ビット16から31はが関連するピンをリセットするために使用できる、とも書いてあります。この場合、ビット16は0番ピンをリセットします。 推測通り、リセットは、lowの値をピンに出力することを意味します。
この情報をプログラムと関連付けると、全てが合致しているようです。
-
1 << 9
(BS9 = 1
)をBSRR
に書き込むことは、PE9
にhighを設定します。これは、北のLEDを点灯します。 -
1 << 11
(BS11 = 1
)をBSRR
に書き込むことは、PE11
にhighを設定します。これは、東のLEDのを点灯します。 -
1 << 25
(BR9 = 1
)をBSRR
に書き込むことは、PE9
にlowを設定します。これは、北のLEDをを消灯します。 -
最後に、
1 << 27
(BR11 = 1
)をBSRR
に書き込むことは、PE11
にlowを設定します。これは、東のLEDのを消灯します。