DE10-LiteのArduino Uno R3 Expansion Headerからシリアルデータを取り込むには、Platform DesignerでUART(RS-232 Serial Port)をインスタンス化すればよいだけなのですが、レジスタ設定のサンプルがなかなか見つからなくて苦労しました。
UARTの資料
HAL Device Drivers Design Exampleという資料にUARTのサンプルがありました。 an459-design-files.zipを解凍したファイルのbit_bang_uart.cにUARTレジスタの使用例があります。
UARTからの受信
Arduino Expansion Headerからシリアルデータを受信するには、UARTのレジスタ0とレジスタ2を利用します。UARTのレジスタ2でステータスを確認して、受信データがあればレジスタ0をリードします。UART_0_BASEは、Platform Designerで設定したUARTのBASE Addressです。
#include <stdio.h>
#include "io.h"
#include "system.h"
int main()
{
int uart_status;
char incoming_character;
// ステータスレジスタのクリア
IOWR(UART_0_BASE, 2, 0);
// とりあえず1000回受信する
for (int i = 0; i<1000;i++) {
// レジスタ2のビット7を確認
while (!(uart_status = IORD(UART_0_BASE, 2) & 0x80));
// 受信データの取得
incoming_character = IORD(UART_0_BASE, 0);
printf("char = %c\n",incoming_character);
}
return 0;
}