STM32_USB-FS-Device_Lib_V3.2.1 USBライブラリでSTM32F105マイクロコントローラーを使用しており、VCPの例を目的(RTOSおよびシリアルAPIとの統合)に適合させています。
問題は、USBケーブルが接続されているが、Windowsホストでポートが開いていない場合、数分後、ポートが開くまでデバイスがUSB ISRに永続的に再入して、すべてが正常に動作し始めることです。
割り込みハンドラーをインストルメントしましたが、障害が発生すると、ISRハンドラーが終了し、すぐに再入することがわかります。これは、割り込みの終了時にOTG_FS_GINTSTSのIEPINTフラグがクリアされていないために発生します。この時点でのOTG_FS_DAINTには0x00000002(IEPINT1セット)が含まれていますが、DIEPINT1には0x00000080(TXFE)が含まれています。TXFEをクリアするOTGD_FS_Handle_InEP_ISR()の行が呼び出されますが、ビットはクリアされないか、すぐに再アサートされます。ホストのCOMポートが再度開かれると、割り込み終了時のOTG_FS_GINTSTSおよびOTG_FS_DAINTの状態は常にゼロになり、それ以降の割り込みは通常のレートで発生します。この問題は、データが出力されているが、ホストに開いているポートがない場合にのみ発生することに注意してください。ポートが開いているか、データが出力されていない場合、システムは無期限に実行されます。
VCPコードには、次の列挙値をとる状態変数があります。
UNCONNECTED,
ATTACHED,
POWERED,
SUSPENDED,
ADDRESSED,
CONFIGURED
そして、CONFIGURED状態を使用して、送信のためにデータをドライバーバッファーに入れるかどうかを決定します。ただし、CONFIGURED状態は、ホストがポートを開いてアプリケーションが接続されているときではなく、ケーブルが接続されているときに設定されます。Windowsがポートを開くと、割り込みのバーストが発生するため、このイベントで何らかの通信が発生しているように見えます。したがって、ホストがポートを開いているかどうかを検出できるかどうか疑問に思います。
おそらく次の2つのうちの1つが必要です。
- USBコードが最初にISRでスタックするのを防ぐため
- ホストがデバイス側からポートを開いているかどうかを判断し、開いているときにのみデータをプッシュして送信します。