1バイト受信

これまで、マイクロコントローラからノートPCへデータを送ってきました。反対側をやってみましょう。 ノートPCからデータを受信します。

RX線から来たデータが詰められるRDPレジスタがあります。このレジスタを読むと、対向側が送ったデータを取り出すことができます。 (新しい)データを受信したことをどうやって知るか?という疑問があります。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 {
        // データが利用可能になるまで待ちます
        while usart1.isr.read().rxne().bit_is_clear() {}

        // データを取り出します
        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'