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

1 バイトを受信する

これまでは、マイクロコントローラーからコンピュータへデータを送信してきました。今度は逆を試してみましょう。つまり、コンピュータからデータを受信します。

RDR レジスタには、RX ラインから入ってきたデータが格納されます。このレジスタを読み取れば、チャネルの反対側が送信したデータを取得できます。では、(新しい)データを受信したことはどのように知ればよいのでしょうか。ステータスレジスタ ISR には、そのためのビットである RXNE があります。このフラグをビジーウェイトすればよいだけです。

#![deny(unsafe_code)]
#![no_main]
#![no_std]

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

#[entry]
fn main() -> ! {
    let (usart1, _mono_timer, _itm) = aux11::init();

    loop {
        // Wait until there's data available
        while usart1.isr.read().rxne().bit_is_clear() {}

        // Retrieve the data
        let _byte = usart1.rdr.read().rdr().bits() as u8;

        aux11::bkpt();
    }
}

このプログラムを試してみましょう! continue を使ってそのまま実行を続け、minicom/PuTTY のコンソールで 1 文字だけ入力してください。何が起こるでしょうか。_byte 変数の内容はどうなっているでしょうか。

(gdb) continue
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x8003d48 in __bkpt ()

(gdb) finish
Run till exit from #0  0x8003d48 in __bkpt ()
usart::main () at src/11-usart/src/main.rs:19
19              aux11::bkpt();

(gdb) p/c _byte
$1 = 97 'a'