2015年8月15日土曜日

NUCLEO-L152REをUSBデバイスにする



NUCLEO-L152REにmbed USBDevice互換のUSBデバイススタックをHAL_PCDで作ってみました。

https://developer.mbed.org/users/va009039/code/L152RE_USBDevice/

STM32CubeMX
まずは、USBコネクタとの配線ミスを防ぐため、HAL_PCDの動作を知るために
STM32CubeMXでMSCのUSBデバイスやHIDデバイスを作成してパソコンに接続してみる。
ボードとUSBコネクタは次のとおりです。
PA12 --- D+
PA11 --- D-
F401REのようにPA9にVCCを接続する必要はない。

USBクロック設定
mbedのオフライン環境にSTM32CubeMXで作製したコードをそのまま取り込んだところ動かなくなってしまった
。USBの48MHzを作るためにクロック設定をしている。既にmbedのスタートアップが走ってクロック設定をしているので、
再設定するには HAL_RCC_DeInit() を呼んで初期状態に戻してから設定し直さないといけない。

ソフトコネクト
USBのDPをプルアップにしてパソコン(USBホスト)にUSBデバイスを検出させます。
ソフトウェアでプルアップを制御する事によって、任意の時点でUSBデバイスを検出させる事が出来ます。
L152REにはSYSCFG_PMCでUSB_PU 内部プルアップを制御できるのだが、システム設定コントローラはUSBコントローラとは
別のクロック供給なので__SYSCFG_CLK_ENABLE()の追加が必要です。

USBDevice
USBDevice互換にするためにUSBHAL_STM32L1.cppをHAL_PCDを使って実装する。
デバッグのためにDBG()PRINT文を入れると表示のタイムアウトでUSB認識しないところがある。
デバッグ情報をRAM上に残して、後から見れるようにトレースプログラムを追加してデバッグをします。
HAL_PCDからのSETUP,IN,OUTパケットのコールバックを使っているのでUSBAL.hにも若干修正をしています。

ソフトコネクト、割込み番号の違いだけで他のボードにも使えると思います。

F103RBは外部にプルアップ抵抗を付けて動作確認しています。他のボードでは未確認です。


各ボードのUSBの違いは以下のとおりです。

L152RE
ソフトコネクトは可能。STM32CubeMXでHAL_PCDEx_SetConnectionState の実装例はある。
_HAL_SYSCFG_USBPULLUP_ENABLE()、__HAL_SYSCFG_USBPULLUP_DISABLE()で内部プルアップ制御をしている。
割込みベクター番号 USB_LP_IRQn

F103RB F303RE
ソフトコネクトはない。プルアップが必要。
割込みベクター番号 USB_LP_CAN1_RX0_IRQn

F072RB(STM32F0) L053R8(STM32L0x3)
ソフトコネクトは可能だが、STM32CubeMXでHAL_PCDEx_SetConnectionState の実装はない。
USB_BCDR DPPU(bit15) を直接制御する。
割込みベクター番号 USB_IRQn

(2015/8/15)
---

0 件のコメント: