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 が オフ になります。