QuartusのUART

設計

DE10-LiteのArduino Uno R3 Expansion Headerからシリアルデータを取り込むには、Platform DesignerでUART(RS-232 Serial Port)をインスタンス化すればよいだけなのですが、レジスタ設定のサンプルがなかなか見つからなくて苦労しました。

ArduinoシールドのTX/RX
ArduinoシールドのTX/RX

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;
}
タイトルとURLをコピーしました