レジスタ

LedのAPIが水面下で何をやっているか、を知る時が来ました。

一言で言えば、いくつかの特別なメモリ領域に書き込みしているだけです。07-registersディレクトリに移動し、スターターコードをステートメントごとに実行しましょう。

#![no_main]
#![no_std]

#[allow(unused_imports)]
use aux7::{entry, iprint, iprintln};

#[entry]
fn main() -> ! {
    aux7::init();

    unsafe {
        // 魔法のアドレス!
        const GPIOE_BSRR: u32 = 0x48001018;

        // 「北」のLED(赤)を点灯します
        *(GPIOE_BSRR as *mut u32) = 1 << 9;

        // 「東」のLED(緑)を点灯します
        *(GPIOE_BSRR as *mut u32) = 1 << 11;

        // 「北」のLEDを消灯します
        *(GPIOE_BSRR as *mut u32) = 1 << (9 + 16);

        // 「東」のLEDを消灯します
        *(GPIOE_BSRR as *mut u32) = 1 << (11 + 16);
    }

    loop {}
}

この魔法は何でしょうか?

0x48001018番地は、あるレジスタを指しています。レジスタは、メモリの特別な領域で、ペリフェラルを制御します。 ペリフェラルは電子部品で、マイクロコントローラパッケージ内のプロセッサのすぐ近くに配置され、プロセッサに追加機能を提供します。 結局のところ、プロセッサ単独では、計算と論理演算しかできません。

0x48001018番地のレジスタは、汎用入出力(GPIO)ピン(GPIO1つのペリフェラルです)を制御します。 そして、そのレジスタは、各ピンをlowhighに駆動するために使用できます。

余談:LED、デジタル出力と電圧レベル

駆動?ピン?Low?High?

ピンは電気的な接点です。マイクロコントローラは、いくつものピンを持っており、そのうちのいくつかがLEDをに接続されています。 LED(Light Emitting Diode)は、所定の極性で電圧を供給した時のみ、光ります。

幸運なことに、マイクロコントローラのピンは、正しい極性でLEDに接続されています。いくらかの電圧を、ピンを通じて出力するだけで、LEDを点灯できます。 LEDに接続されたピンは、デジタル出力として設定されており、2つの異なる電圧レベル(「low」が0ボルト、「high」が3ボルト)だけを出力できます。 「high」(電圧)レベルは、LEDを点灯します。一方、「low」(電圧)レベルは、LEDを消灯します。

これらの「low」と「high」状態は、デジタル論理の概念に直接結びつきます。「low」は0またはfalseで 「high」は1またはtrueです。これが、このピン設定がデジタル出力と呼ばれる理由です。


このレジスタが何をするのか、はどのようにして見つければ良いのでしょうか?リファレンスマニュアルを読む時(RTRM; Read the Reference Manual)が来ました!