環境
stm32f407VGTでstMicroが提供するSTM32_USB_OTG_DEVICE_LIBRARYを使用
問題となる症状
ボードとPC間でUSB接続が成立していてPC側でUSB通信のアプリケーションが走っていない時にボード側からデータを送信するとUSBの割り込みが連続して発生しハングアップ状態になることがあります。
PC側のUSB通信ソフトを起動すれば正常に戻るのでデータ通信だけが目的の場合は問題ないのですが、ボードでロボットの制御をしていてUSB通信はステータス確認のためだけに使っている場合などには制御が中断してしまうため致命的なバグとなります。
解決方法
この問題で困っている人が少ないためかヒントとなる情報がなかなか見つからなかったのですが運よくパッチを提供してくれている人のサイトにたどり着きました。
–> This fixes a problem whereby outputting to the USB UART
usb_dcd_int.cの関数 DCD_WriteEmptyTxFifo に次の5行を挿入すればOKです。
ep->xfer_buff += len; ep->xfer_count += len; - + + if(ep->xfer_count >= ep->xfer_len) + { + uint32_t fifoemptymsk = 1 << ep->num; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0); + } txstatus.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DTXFSTS); }