Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

RTRM: リファレンスマニュアルを読む

先ほど、マイクロコントローラには複数のピンがあると述べました。便宜上、これらのピンは 16 本ずつの ポート にまとめられています。各ポートには Port A、Port B などのように文字で 名前が付けられており、各ポート内のピンには 0 から 15 までの番号が付いています。

まず最初に調べるべきなのは、どのピンがどの LED に接続されているかです。この情報は STM32F3DISCOVERY の User Manual にあります(コピーをダウンロードしましたよね?)。この場合は、 次のセクションです。

Section 6.4 LEDs - Page 18

マニュアルには次のように書かれています。

  • LD3(北側の LED)は、ピン PE9 に接続されています。PE9 は Port E の Pin 9 の短縮形です。
  • LD7(東側の LED)は、ピン PE11 に接続されています。

ここまでで、北側/東側の LED をオン/オフするには、PE9 と PE11 の状態を変更すればよいことが わかりました。これらのピンは Port E の一部なので、GPIOE ペリフェラルを扱う必要があります。

各ペリフェラルには、それに対応するレジスタ ブロック があります。レジスタブロックとは、 連続したメモリ上に配置されたレジスタの集まりです。レジスタブロックが始まるアドレスは、その ベースアドレスとして知られています。GPIOE ペリフェラルのベースアドレスが何かを調べる必要があります。その 情報は、マイクロコントローラの Reference Manual の次のセクションにあります。

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

BSRR は、セット/リセットに使用するレジスタです。GPIOE のベースアドレスからの オフセット値は 0x18 です。リファレンスマニュアルで BSRR を調べることができます。 GPIO Registers -> GPIO port bit set/reset register (GPIOx_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) # 次のコマンドで北側の LED がオンになる
(gdb) next
19              *(GPIOE_BSRR as *mut u32) = 1 << 11;

(gdb) x 0x48001018
0x48001018:     0x00000000

レジスタを読むと 0 が返ってきます。これはドキュメントの記述と一致しています。

ドキュメントがもうひとつ述べているのは、ビット 0 から 15 を使って対応するピンを セット できるということです。 つまり、ビット 0 はピン 0 をセットします。ここで セット とは、そのピンに ハイ の値を 出力することを意味します。

また、ドキュメントには、ビット 16 から 31 を使って対応するピンを リセット できるとも書かれています。この 場合、ビット 16 はピン番号 0 をリセットします。想像できると思いますが、リセット とは、そのピンに ロー の値を 出力することを意味します。

その情報をプログラムと照らし合わせると、すべてつじつまが合っています。

  • 1 << 9 (BS9 = 1) を BSRR に書き込むと、PE9ハイ に設定されます。これにより北側の LED が オン になります。

  • 1 << 11 (BS11 = 1) を BSRR に書き込むと、PE11ハイ に設定されます。これにより東側の LED が オン になります。

  • 1 << 25 (BR9 = 1) を BSRR に書き込むと、PE9ロー に設定されます。これにより北側の LED が オフ になります。

  • 最後に、1 << 27 (BR11 = 1) を BSRR に書き込むと、PE11ロー に設定されます。これにより東側の LED が オフ になります。