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'