レジスタ
Led API が内部で何をしているのかを探っていく時間です。
一言でいえば、これはいくつかの特別なメモリ領域に書き込んでいるだけです。07-registers ディレクトリに移動して、スターターコードを文ごとに実行していきましょう。
#![no_main]
#![no_std]
#[allow(unused_imports)]
use aux7::{entry, iprint, iprintln};
#[entry]
fn main() -> ! {
aux7::init();
unsafe {
// A magic address!
const GPIOE_BSRR: u32 = 0x48001018;
// Turn on the "North" LED (red)
*(GPIOE_BSRR as *mut u32) = 1 << 9;
// Turn on the "East" LED (green)
*(GPIOE_BSRR as *mut u32) = 1 << 11;
// Turn off the "North" LED
*(GPIOE_BSRR as *mut u32) = 1 << (9 + 16);
// Turn off the "East" LED
*(GPIOE_BSRR as *mut u32) = 1 << (11 + 16);
}
loop {}
}
このマジックは何でしょうか?
アドレス 0x48001018 は レジスタ を指しています。レジスタとは、周辺機能 を制御する特別なメモリ領域のことです。周辺機能とは、マイクロコントローラのパッケージ内でプロセッサのすぐ隣にある電子回路であり、プロセッサに追加の機能を提供します。というのも、プロセッサはそれ単体では計算と論理処理しかできないからです。
この特定のレジスタは汎用入出力(GPIO)ピン を制御します(GPIO 自体が 周辺機能です)。そして、それらの各ピンを low または high に 駆動 するために使用できます。
余談: LED、デジタル出力、電圧レベル
駆動? ピン? Low? High?
ピンは電気的な接点です。私たちのマイクロコントローラにはそのような接点がいくつもあり、そのうちのいくつかは LED に接続されています。LED、すなわち発光ダイオードは、ある極性で電圧が加えられたときにのみ発光します。
幸いなことに、マイクロコントローラのピンは正しい極性で LED に接続されています。したがって、LED を点灯させるために必要なのは、そのピンから 0 でない電圧を 出力 することだけです。LED に接続されたピンは デジタル出力 として設定されており、出力できる電圧レベルは 2 種類だけです。すなわち、「low」の 0 ボルトか、「high」の 3 ボルトです。「high」の(電圧)レベルは LED を点灯させ、「low」の(電圧)レベルは消灯させます。
これらの「low」と「high」の状態は、デジタル論理の概念に直接対応しています。「low」は 0 または false であり、「high」は 1 または true です。これが、このピン構成がデジタル出力として知られている理由です。
なるほど。では、このレジスタが何をするのかはどうやって調べればよいのでしょうか? RTRM(リファレンスマニュアルを読む)するときです!