ラズパイ3でベアメタル - その4:シリアル通信(UART)でエコーバック(割り込みなし)
今回は、前回のプログラムに文字受信を追加して、
PCからラズパイ3へ送信した文字をそのまま送り返す(エコーバック)
を作ってみます。
なお、Raspberry Pi 3で64bitベアメタル(bare metal)プログラミングを試してみる
本シリーズの目次はコチラです。
1. 新たに使用するレジスタ
PCから送信されたデータをRaspberry Pi 3で受信する必要があるので、
今回新たにUARTの受信の機能を使用します。
UARTで受信したデータを取得するまでの流れは以下のとおりです。
1. 受信FIFOのチェック
2. 受信FIFOからデータを取り出す
今回登場するレジスタは以下の記事で書いたものと同じです。(LSRとIO)
2. ソースコード(エコーバックプログラム)
#define MU_IO (*(volatile unsigned int *)0x3f215040)
#define MU_LSR (*(volatile unsigned int *)0x3f215054)
#define MU_LSR_TX_IDLE (1U << 6)
#define MU_LSR_TX_EMPTY (1U << 5)
#define MU_LSR_RX_RDY (1U << 0)
int main(void)
{
volatile char ch;
while (1) {
while (!(MU_LSR & MU_LSR_RX_RDY));
ch = (char)MU_IO;
while (!(MU_LSR & MU_LSR_TX_IDLE) && !(MU_LSR & MU_LSR_TX_EMPTY));
MU_IO = (unsigned int)ch;
}
return 0;
}