2014年01月17日

FX3プログラミング Hello Worldを出してみよう

プログラミングを習うときに必ず出される最初の例題は“Hello World”と出力させるというものです。いったいなぜ“Hello World”なのか?検索すると諸説あるようですが・・・。

そんなことはさておき、いままでの開発者ブログでは高速化などのどちらかというと、活用的な記事を掲載してきましたが、今回は初級編として“Hello World”を出力します。

さて、“Hello World”を出力するといっても相手はハードウェアです。Windows上で動作するアプリケーションのように画面上に文字列を単純に出力することはできません。しかし、FX3のAPIのなかにデバック用UARTに文字列を出力する「CyU3PDebugPrint」関数があります。
今回は、この関数を使用してPCのコンソール上に文字列を出力したいと思います。
また、この過程を通してmain関数内で必須となる決まり事がありますのでその流れも掲載したいと思います。
(main関数内での必須の決まりごとは、アプリケーションノートAN75705(日本語訳版)のP9からの 「FX3 ソリューション概要」に記載があります。そちらも合わせてご確認ください。)

「CyU3PDebugPrint」関数はUART通信を通して、任意の文字列を出力する関数です。詳細はFX3 SDK Firmware API Guideをご確認ください。また、UARTについては多くのWebサイトに解説がありますのでここでの説明は省略します。

まずは、今回のテストで使用したシステム構成です。


テスト構成図.png



テスト用のボードと、文字列出力確認用PCを使用しています。FX3ファームウェアの更新などを行うのに、USB3.0にてテスト用ボードとPCを接続します。併せて、文字列出力確認のためにUARTとPCを接続しています。
また実際のテスト用のボードはこちらです。


SVM.jpg


ADV7511FPGAも搭載されておりますが、今回はFX3だけを使用しています。
システム構成は以上となります。

では早速FX3のファームウェアのプログラミングを開始していきます。
今回、参考にするのはFX3 SDKフォルダ内にある下記サンプルプログラムをベースに作成を行います。
\firmware\serialif_examples\cyfxusbi2cregmode

このサンプルプログラムのメインのソースコードは「cyfxuartlpregmode.c」になります。cyfxuartlpregmode.cには主に4つの関数しかありません。

1. main
2. CyFxApplicationDefine
3. UartLpAppThread_Entry
4. CyFxUartLpApplnInit


概ね、上記の順番で実行されていきます。また、アプリケーションノートAN75705(日本語訳版)の情報も加味して詳細なフローを記載すると下記のようになります。


FX3実行処理フロー.png



main()関数への遷移はフレームワーク内で定義されており、FX3ファームウェア開発者はなにもしなくても、自動的にmain()関数が呼出されます。

main()関数内では、デバイスの初期化(CyU3PDeviceInit関数の呼び出し)、IOマトリックスの設定(CyU3PDeviceConfigureIOMatrix関数の呼び出し)、OS呼出し(CyU3PKernelEntry関数の呼び出し)を実施します。

その後、OSからCyFxApplicationDefine関数が呼出されスレッドが作成されます。作成されたスレッド内でUARTの処理を行います。

他のSDKのサンプルでもだいたいこの流れを踏襲しており、どこにも記載はありませんがFX3を使用するときのお作法といえるのではないでしょうか。

さて、FX3を使用するためのお作法がわかりましたので、この記事の目的であります、“Hello World”を表示させるコードを追加しましょう。

“Hello World”を表示させるためには、当然のことながら、UARTデバイスの初期化を実施した後でなければなりません。具体的には、「UartLpAppThread_Entry」関数内の「CyFxUartLpApplnInit」を実行した後となります。

void
UartLpAppThread_Entry (
uint32_t input)
{
CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;
uint8_t rxTxByte = 0, actualCount = 0;

/* Initialize the UART example application */
CyFxUartLpApplnInit();

CyU3PDebugPrint (4, " Hello World ");    ←ここに挿入!

for (;;)
{
・・・以下プログラムは続く。・・・


このようにして、デバックビルドにてビルドを行い、FX3に書き込みを行い実行するとPCのコンソール画面上に「Hello World」と表示されます。(なお、UARTを接続するピンの位置についてはハードウェアによりますのでボードに合わせてご確認ください。)

なお、初期化実行前に「CyU3PDebugPrint」を記載してもコンソールには何も表示されませんのでご注意ください。(2回ほど同じことをやってしまいました。)


※なかなか情報が少ないため、弊社の調査による内容を掲載しておりますが、掲載内容に誤りがあるかもしれません。その場合はご指摘いただければ幸いです。またこのブログの内容を利用等により生じた損害など一切責任を負いませんので各自ご確認のうえご使用ください。


だれかFX3 SDKの解説書籍を出してくれないだろうかと願う今日この頃でした。

posted by デベマネ at 11:57| Comment(0) | EZ-USB/FX3