STM32F746G-DISCOボードでGR-USB/DEVICEを動かしてみた

つぶつぶコラム

今回はSTマイクロエレクトロニクス社(以下ST社)より発売されているSTM32F746G-DISCOボードを使って、当社のGR-USB/DEVICEを動かしてみようと思います。

STM32F746G-DISCOボードにはST社のArm Cortex-M7コアベースのSTM32F746 MCUが搭載されています。STM32F746の詳細はST社のホームページなどでご確認ください。

はじめに

今回はSTM32F746G-DISCOボードのOTG_HSコアをCOMデバイス(USBシリアルデバイス)にしてPCと繋いでみようと思います。
まずは、使用する機材、環境はこちらになります。

・STM32F746G-DISCOボード
・USBケーブル(PC接続用(type-A to micro-B)、電源/ST-LINK用(type-A to mini-B))
・IAR Embedded Workbench for Arm(EWARM) (バージョン9.50.1を使用しました。)
・PC(Windows10以降)
・TeraTerm
・サンプルプロジェクト
・GR-USB/DEVICE for STM32F7xx(OTG_HS)
・GR-USB/DEVICE Communication Function Driver

サンプルプロジェクトはST社の下記のページからダウンロードしました。
https://www.st.com/ja/embedded-software/stm32cubef7.html

サンプルプロジェクトにはST社が販売しているSTM32F7シリーズ向けの各種ボード毎に用意されています。
今回はSTM32F746G-DISCOボード向けのサンプルの中からLEDが点滅するだけのプロジェクトを使用しました。(サンプルプロジェクトは\Projects\STM32746G-Discovery\Applications\FreeRTOS\
FreeRTOS_DelayUntilにあります。)
このプロジェクトは、USBの動作確認でも使用するため、プロジェクトフォルダをコピーしてフォルダ名を変更しておきます。(今回はFreeRTOS_DelayUntil_USBに変更しました。)

サンプルプロジェクトには3種類の統合開発環境向けのプロジェクトファイルがあります。
今回はEWARM向けのプロジェクトファイルを使用します。

EWARMは有償のツールになります。ただし、14日間の期間限定ですが無償の評価版を使用することができます。無償の評価版はIAR社の下記のページからダウンロードできます。(ダウンロードするにはユーザ登録が必要です。)
https://www.iar.com/jp/products/architectures/arm/iar-embedded-workbench-for-arm/

サンプルプロジェクトの動作確認

使うものが用意できたらPCとSTM32F746G-DISCOボードのmini-BコネクタをUSBケーブルで繋げてサンプルプロジェクトの動作確認を行います。
サンプルプロジェクト内のEWARMフォルダにあるProject.ewwファイルをダブルクリックしてEWARMでワークスペースを開きます。

<図1:Project.ewwを開いたEWARMの画面キャプチャ>

ビルドしてデバッガで書き込んで実行します。
正常に動作するとボードの緑色のLEDが点滅すると思います。(点滅の間隔は200ミリ秒です。)
LEDはボードの裏面にあるので、裏返しておくと確認しやすいです。

<図2:サンプルプロジェクト実行時のボードの様子>

GR-USB/DEVICE for STM32F7xx(OTG_HS)のポーティング

回路図の確認


STM32F746には2つのUSBコントローラがありますが、今回はOTG_HSコアの方を使用します。
OTG_HSコアがSTM32F746G-DISCOボードのコネクタにどのように繋がっているかを確認していきます。
STM32F746G-DISCOボードの回路図はST社の下記のページからダウンロードしました。
https://www.st.com/ja/evaluation-tools/32f746gdiscovery.html

回路図のファイルは4つありますが、ボードのリビジョンと同じファイルをダウンロードします。
今回使用するボードのリビジョンはB-02なので、B-02用の回路図をダウンロードしました。

<図3:ボードのリビジョンシール>
<図4:回路図のダウンロードページ>

回路図を確認するとOTG_HSコアとUSBコネクタの間にはUSB3320という外付けのHS PHYが入っていることがわかります。HS PHYとはULPIというインタフェースで接続されており、ULPIのピンとの接続はGPIOの設定が必要です。

プロジェクトの作成

動作確認を行ったサンプルプロジェクト(FreeRTOS_DelayUntil_USB)に当社製品のソースを追加していきます。(追加するソースは各製品のドキュメントを参照ください。)

各モジュールのポーティング

GR-USB/DEVICE Communication Function Driver

ベンダIDやプロダクトID等の変更必須項目がありますが、今回はそのまま使用します。(デフォルト値が当社のIDになっているので。)
また、これ以外にも使用する環境等に合わせて変更して頂く項目もあります。(変更する項目は製品のポーティングマニュアルを参照ください。)

GR-USB/DEVICE for STM32F7xx(OTG_HS)

使用するエンドポイント構成に合わせてFIFOバッファサイズを変更します。

COMデバイスでは、4つのエンドポイントを使用しており、各エンドポイントの転送タイプと転送方向は、
EP0:Control、EP1:Bulk OUT、EP2:Bulk IN、EP3:Interrupt IN
となっています。(Communication Function Driverの設定でEP1とEP2の転送方向を入れ替えることができますが、今回はデフォルトの設定のまま使用します。)

各エンドポイントで使用するFIFOバッファのサイズは、grp_stm32fxhsd_cfg.hで設定します。EP0~EP2の設定はデフォルトの設定のまま使用できますが、EP3で使用する送信用FIFOバッファサイズ(GRP_32FXHSD_TX_FIFO_3_SIZE)が0になっているので、この設定値を変更します。
(設定するFIFOバッファサイズの算出方法等は製品のポーティングマニュアルを参照ください。)

GR-USB HOST/DEVICE 共通モジュール for STM32F7xx

OTG_HSコアの動作モードを設定します。今回はOTG_HSコアをデバイスモードで動作させるので、grp_stm32fx_cfg.hファイルのGRP_STM32FX_OTG_HSにGRP_STM32FX_MODE_DEVICEを設定します。もう1つのOTG_FSコアは使用しないため、デフォルトの設定のままにしておきます。

次に使用するボードに合わせてターゲット依存処理モジュールをポーティングします。
grp_stm32fx_tg.cファイルにある下記のAPIがポーティング対象となっています。

・grp_target_HwInit                 ターゲットハードウェアの初期化
・grp_target_DelayMS                ミリ秒単位のウェイト処理
・_grp_target_RegistIntrHandler     割り込みハンドラの登録
・_grp_target_SetIntrPriorityLevel  割り込み優先度の設定
・_grp_target_EnableIntr            割り込み有効
・_grp_target_DisableIntr           割り込み無効

・grp_target_HwInit
ここでは、GPIOの設定やクロックの許可などの処理を実装します。
回路図の確認でULPIのピンとの接続について確認しましたが、そのピン設定をここで行います。
HOST/DEVICE共通モジュールには、sample_tgフォルダ内に動作確認で使用したファイルをサンプルとして付属していますが、このサンプルはST社の他のボード向けの実装になっているため、そのまま使用することはできません。回路図から接続されているピンを確認し、サンプルを参考に実装します。また、使用するGPIOポートやOTG_HS、ULPIのクロック許可処理も実装します。

・grp_target_DelayMS
ここでは、ミリ秒単位のウェイト処理を実装します。
サンプルプロジェクトには、ミリ秒単位のウェイトを行うosDelayという関数があったので、これを使用することにします。

・_grp_target_RegistIntrHandler
ここでは、割り込みハンドラの登録処理を実装します。
サンプルプロジェクトでは、OTG_HSの割り込みはOTG_HS_IRQHandlerという関数がコールされるようになっているため、何もせず正常終了するようにします。

・_grp_target_SetIntrPriorityLevel
ここでは、割り込み優先度の設定処理を実装します。
サンプルプロジェクトには、割り込み優先度の設定を行うHAL_NVIC_SetPriorityという関数があったので、これを使用することにします。

・_grp_target_EnableIntr
ここでは、割り込み有効の処理を実装します。
サンプルプロジェクトには、割り込みの有効を行うHAL_NVIC_EnableIRQという関数があったので、これを使用することにします。

・_grp_target_DisableIntr
ここでは、割り込み無効の処理を実装します。
サンプルプロジェクトには、割り込みの無効を行うHAL_NVIC_DisableIRQという関数があったので、これを使用することにします。

アプリケーション

まずはサンプルプロジェクトにあるmain.cを改造していきます。
main関数内に各種初期化処理がありますが、LEDを点滅させるスレッド(LED_Thread1)を生成しているので、GR-USB/DEVICEの初期化処理はこのスレッドから実行するようにします。
GR-USB/DEVICEの初期化処理は、HOST/DEVICE共通モジュールのsampleフォルダにあるsample_app.cのsample_app_Init関数をコールするようにします。特に必要な処理ではありませんがsample_app_Init関数の戻り値でLEDの点滅間隔を変える処理も入れています。(初期化処理が正常終了の場合はゆっくり(1秒間隔)、エラー終了の場合は速く(200ミリ秒間隔)点滅します。)

また、sample_app.cのsample_app_Init関数から各コアの初期化関数をコールしていますが、OTG_HSコアの初期化関数(_sample_app_Otg_Hs_Init)にCommunication Function Driverのサンプルアプリケーションの初期化関数である_TEST_Init関数をコールするようにします。

次にstm32f7xx_it.c内にOTG_HSコアの割り込みハンドラOTG_HS_IRQHandlerを追加し、そこからgrp_target_OtgHsIsr関数をコールするようにします。

最後にヘッダファイルのインクルードパスを追加してビルドを行い、エラー無く実行可能ファイルが生成されていることを確認します。

動作確認

それではSTM32F746G-DISCOボードに書き込んで動作を確認していきます。
デバッガで書き込んで実行するまではサンプルプロジェクトの動作確認と同じです。実行してボードの緑色のLEDがゆっくり点滅していれば初期化処理が正常終了しています。もし、サンプルプロジェクトの動作確認の時と同じ点滅(200ミリ秒間隔)をしていた場合は、初期化処理でエラーが発生しているので、その時はデバッガでエラー箇所を確認します。

初期化処理が正常終了していたら、パソコンとSTM32F746G-DISCOボードのmicro-ABポートをUSBケーブルで繋ぎます。
STM32F746G-DISCOボードにはmicro-ABポートが2つありますが、ボード上にUSB_HSと書かれている方に繋ぎます。

<図5:接続するUSB_HSポート>

デバイスマネージャーを開き、「ポート (COM と LPT)」に「USB シリアル デバイス」として認識していることを確認します。

<図6:デバイス マネージャー>

次にTeraTermを開き、デバイスマネージャーに表示されているCOMポート番号のものを開きます。
文字を適当に入力していきます。入力した文字が表示されれば正常に動作しています。

<図7:TeraTermの画面>

Communication Function Driverのサンプルアプリケーションは、受信データ(パソコンから入力された文字)をそのまま送信するループバック動作となっています。

パソコンとSTM32F746G-DISCOボードの間にUSBアナライザを入れて確認すると、ループバック動作となっていることが確認できます。

<図8:USBアナライザのログ>

以上でSTM32F746G-DISCOボードを使ってGR-USB/DEVICEを動かしてみる話は終わりです。

GRAPEWARE製品はこちら