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

レジスタ

この章は技術的な深掘りです。今のところは安全に読み飛ばして、あとで好きなときに戻ってきてもかまいません。 とはいえ、ここには良い内容がたくさんあるので、ぜひ掘り下げてみることをおすすめします。


display_pins.row1.set_high()button_a_pin.is_high() を呼び出すと、その裏側で何が起きているのかを探っていきましょう。

一言で言えば、display_pins.row1.set_high() の呼び出しは、いくつかの特別なメモリ領域に書き込むだけです。09-registers ディレクトリに移動し、 スターターコードを文ごとに実行してみましょう(src/main.rs)。

#![no_main]
#![no_std]

#[allow(unused_imports)]
use registers::entry;

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

    unsafe {
        // A magic address!
        const PORT_P0_OUT: u32 = 0x50000504;

        // Turn on the top row
        *(PORT_P0_OUT as *mut u32) |= 1 << 21;

        // Turn on the bottom row
        *(PORT_P0_OUT as *mut u32) |= 1 << 19;

        // Turn off the top row
        *(PORT_P0_OUT as *mut u32) &= !(1 << 21);

        // Turn off the bottom row
        *(PORT_P0_OUT as *mut u32) &= !(1 << 19);
    }

    loop {
        core::hint::spin_loop();
    }
}

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

アドレス 0x50000504レジスタ を指しています。レジスタとは、ペリフェラル を制御する特別なメモリ領域です。ペリフェラルとは、 マイクロコントローラのパッケージ内でプロセッサのすぐ隣にある電子回路の一部で、プロセッサに追加の機能を提供します。 結局のところ、プロセッサは単体では演算と論理処理しかできません。

この特定のレジスタは General Purpose Input/Output(GPIO)ピン を制御します(GPIO ペリフェラルです)。そして、それらの各ピンを low または high駆動 するために使用できます。

(nRF52833 には 32 本を超える GPIO がありますが、CPU は 32 ビットです。そのため、GPIO ピンは “P0” と “P1” の 2 つのグループに整理されており、各グループごとに 読み取り、書き込み、設定のためのレジスタ群があります。上のアドレスは P0 ピン用の出力レジスタのアドレスです。)

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

駆動? ピン? Low? High?

ピンとは電気的な接点です。私たちのマイクロコントローラにはそのような接点がいくつもあり、その一部は 発光ダイオード(LED)に接続されています。LED は電圧が加わると発光します。名前が示すとおり、 LED は「ダイオード」としても振る舞います。ダイオードは電気を一方向にしか流しません。 LED を「正方向」に接続すると光ります。「逆方向」に接続しても何も 起こりません。

幸いなことに、マイクロコントローラのピンは、LED を正しい向きで駆動できるように接続されています。 やるべきことは、LED を点灯させるのに十分な電圧をピン間に加えることだけです。LED に接続された ピンは通常、デジタル出力 として設定されており、2 種類の異なる 電圧レベルを出力できます。“low”、0 ボルト、または “high”、3 ボルトです。“high” の(電圧)レベルは LED を点灯させ、 “low” の(電圧)レベルは消灯させます。

これらの “low” と “high” の状態は、デジタル論理の概念に直接対応します。“low” は 0 または false であり、 “high” は 1 または true です。これが、このピン設定がデジタル出力として知られている理由です。

デジタル出力の反対はデジタル入力です。デジタル出力が 0 または 1 のどちらかを取り得るのと同じように、デジタル入力も 0 または 1 のどちらかです。違いは、デジタル出力は電圧を駆動できますが、デジタル入力は電圧を 読み取る ことです。マイクロコントローラが高しきい値を超える電圧レベルを読み取ると、それを 1 と解釈し、低しきい値を下回る電圧レベルを読み取ると、それを 0 と解釈します。


OK。では、このレジスタが何をするのかは、どうすれば分かるのでしょうか? RTRM(Read the Reference Manual)の時間です!