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に書き込むことは、PE9highを設定します。これは、北のLEDを点灯します。

  • 1 << 11 (BS11 = 1)をBSRRに書き込むことは、PE11highを設定します。これは、東のLEDのを点灯します。

  • 1 << 25 (BR9 = 1)をBSRRに書き込むことは、PE9lowを設定します。これは、北のLEDをを消灯します。

  • 最後に、1 << 27 (BR11 = 1)をBSRRに書き込むことは、PE11lowを設定します。これは、東のLEDのを消灯します。