RISC-Vでベアメタルプログラミング(UART編)
前回はRISC-V(FemtoRV)のベアメタル環境でLEDを点灯させたので、今回はUART通信を試したみた。
事前準備
前回の記事を参考に環境を整備しておく
UART通信するプログラムを用意する。
( FIRMWARE/MY_ASM_EXAMPLES/uart_loopback.S )
code:asm
# UART loopback
.equ IO_BASE, 0x400000 # Base address of memory-mapped IO
.equ IO_UART_DAT, 8
.text
.globl _start
.type _start, @function
_start:
li gp, IO_BASE
loop:
call UART_getchar # 受信した文字を...
call UART_putchar # そのまま送信する
j loop
.globl UART_putchar
.type UART_putchar, @function
UART_putchar:
sw a0, IO_UART_DAT(gp)
pcrx:
lw t0, IO_UART_DAT(gp)
andi t0, t0, 0x200 # 10ビット目が1の間は書き込み中なので、0になるまで待つ
bnez t0, pcrx
ret
.global UART_getchar
.type UART_getchar, @function
UART_getchar:
lw a0, IO_UART_DAT(gp)
andi t0, a0, 0x100 # 9ビット目0の間はデータ未達なので、1になるまで待つ
beqz t0, UART_getchar
andi a0, a0, 0xFF # 受信データは1ビット目から8ビット目までで9ビット目以降の制御ビットは不要なので取り除く
ret
以下の手順でビルドする
code:sh
$ cd ~/src/learn-fpga/FemtoRV/FIRMWARE/MY_ASM_EXAMPLES/
$ make clean uart_loopback.hex
ULX3Sへアップロードする
(シリアルモニタを開いているとアップロードに失敗するので事前に閉じておくこと)
code:sh
$ cd ~/src/learn-fpga/FemtoRV/
$ make ULX3S.synth ULX3S.prog_fast
(おまけ)ビルドとアップロードを1行にまとめるとこんな感じ。通常はこちらを実行することになる
code:sh
$ make clean uart_loopback.hex && cd ../.. && make ULX3S.synth ULX3S.prog_fast && cd FIRMWARE/MY_ASM_EXAMPLES
シリアルモニタから入力した文字がループバックされることを確認
シリアルモニタを開く
Arduino.appを起動
メニューの「ツール - シリアルモニタ」からシリアルモニタを起動
通信速度は「115200 bps」を選択
適当な文字列を入力して「送信」ボタンを押し、入力した文字列がループバックされることを確認する
https://gyazo.com/675c18a966f492e6b7278fbd97054bcc