レジスタ
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)ピン(GPIOは1つのペリフェラルです)を制御します。
そして、そのレジスタは、各ピンをlowかhighに駆動するために使用できます。
余談: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)が来ました!