ARM
mbed
USB
STM32

mbedを使ってSTM32-NUCLEOのUSBを動かす

More than 1 year has passed since last update.

最近(2017年)になって、STが開発したmbed向けSTM32 USBライブラリが公開されていたので試してみました。

STM32-NUCLEOで USB ライブラリ USBDEVICEUSBHOST の動作が確認できました。

秋月電子で購入できる部品を使いました。

20170716_123033571_iOS.jpg
20170716_110702234_iOS.jpg

USB Device

STM32をUSB Deviceとして使います。

Hardware

STM32-NUCLEO と マイクロBメスUSBコネクタを接続します。

STM32-NUCLEO USB
PA11 (CN10-14) D-
PA12 (CN10-12) D+
GND (CN10-20) GND

VBUSの電源はNUCLEOのST-LINK側のUSBから供給しているので未接続です。

ST-LINK側のUSBを繋いでいない場合は、「U5V (CN10-8) 」と「 VBUS 」を繋げてください。

NUCLEO_F103RBを使う場合はD+を1.5kohmでプルアップしくださいとの記載が、ソースコードにコメントしてありました。

Software

Nucleo_usbmouseをコンパイルして書き込む。

Nucleo_usbhostはUSBメモリとマウスとキーボードが動作します。起動時に刺してあるデバイスに応じて動作します。

このデモはUSB HID マウスを使ってカーソルを円を描くように移動させます。

使用したソフトのリビジョンです。

Name hash
ST/Nucleo_usbmouse b6e9ca6a0bf6
ST/USBDEVICE 50ec00aa4515
mbed 22da6e220af6 (Relase146)

FLASH:38.8KB RAM:3.6KB

Result

PCに挿すとマウスとして認識されてカーソルがクルクル回りました。

シリアルポート出力結果

cos: 5000.000000, sin: 0.000000
cos: 4993.154618, sin: 705.600040
cos: 4972.637216, sin: -1397.077491
cos: 4938.503974, sin: 2060.592426
cos: 4890.848353, sin: -2682.864590
cos: 4829.800843, sin: 3251.439201
cos: 4755.528600, sin: -3754.936234
cos: 4668.234993, sin: 4183.278193
cos: 4568.159046, sin: -4527.891810
cos: 4455.574781, sin: 4781.879642
cos: 4330.790472, sin: -4940.158120
cos: 4194.147797, sin: 4999.559301
cos: 4046.020905, sin: -4958.894267

USB Host

STM32をUSB Hostとして使います。

Hardware

STM32-NUCLEO と AメスUSBコネクタを接続します。

STM32-NUCLEO USB
U5V (CN10-8) VBUS
PA11 (CN10-14) D-
PA12 (CN10-12) D+
GND (CN10-20) GND

Software

Nucleo_usbhostをコンパイルして書き込む。

Nucleo_usbhostはUSBメモリとマウスとキーボードが動作します。USBコネクタに挿したデバイスに応じて動作します。

Nucleo_usbhostはThreadを使っているので、mbed os 5を使ってます。

使用したソフトのリビジョンです。

Name hash
ST/Nucleo_usbhost 2ca820a42fd5
ST/USBHOST d3ac9e1c0035
mbed-os 42be5c0 (mbed-os-5.4.3)

FLASH:67.5KB RAM:12.3KB

Result

起動後に抜き差しして、別デバイスをさしても動作していました。

マウスを挿して、ボタンを押したり、動かすとシリアルに出力されます。

 [USB_INFO: /src/USBHOST/USBHost/USBHost.cpp:169]New device connected: 2000680c [hub: 0 - port: 1]
 [USB_INFO: /src/USBHOST/USBHostHID/USBHostMouse.cpp:72]New Mouse device: VID:046d PID:c06c [dev: 2000680c - intf: 0]
 buttons: 0, x: 1, y: -1, z: 0
 buttons: 0, x: 50, y: -39, z: 0
 buttons: 0, x: 82, y: -38, z: 0
 buttons: 0, x: 23, y: -31, z: 0
 buttons: 0, x: 7, y: -64, z: 0
 buttons: 0, x: 15, y: -52, z: 0
 buttons: 0, x: 8, y: -21, z: 0
 buttons: 1, x: 0, y: 0, z: 0
 ..
 [USB_INFO: /src/USBHOST/USBHost/USBHost.cpp:491]Device disconnected [2000680c - Mouse - hub: 0 - port: 1]
 mouse seen disconnected

キーボードを挿して、キーを押すとシリアルに出力されます。

 [USB_INFO: /src/USBHOST/USBHost/USBHost.cpp:169]New device connected: 2000680c [hub: 0 - port: 1]
 [USB_INFO: /src/USBHOST/USBHostHID/USBHostKeyboard.cpp:127]New Keyboard device: VID:413c PID:2107 [dev: 2000680c - intf: 0]
 Key: j
 Key: j
 Key: a
 Key: b
 Key: c
 Key: d
 Key: e
 Key: f
 Key: g

USBメモリを挿すと下記が表示されましたが、途中でエラーになって止まりました。Capacityの値が異常でした。

 USB_INFO: /src/USBHOST/USBHost/USBHost.cpp:169]New device connected: 2000680c [hub: 0 - port: 1]
 [USB_INFO: /src/USBHOST/USBHostMSD/USBHostMSD.cpp:88]New MSD device: VID:13fe PID:1f23 [dev: 2000680c - intf: 0]
 file system mounted
                    [USB_INFO: /src/USBHOST/USBHostMSD/USBHostMSD.cpp:175]MSD [dev: 2000680c] - Vendor ID: silicon
 [USB_INFO: /src/USBHOST/USBHostMSD/USBHostMSD.cpp:179]MSD [dev: 2000680c] - Product ID: -power
 [USB_INFO: /src/USBHOST/USBHostMSD/USBHostMSD.cpp:183]MSD [dev: 2000680c] - Product rev: 0.00
 [USB_INFO: /src/USBHOST/USBHostMSD/USBHostMSD.cpp:148]MSD [dev: 2000680c] - blockCount: 7827455, blockSize: 512, Capacity: -287310336

感想、その他

  • 本当にUSBが動くのか半信半疑でしたが、すんなりと動きました。
  • 最初はOkamotoさんが作ったF401RE-USBHostを使おうと思って調べてる途中で、今回のST製のライブラリの存在を知りました。mbedのライブラリの情報を探すのは難しいですね。
  • STM32のOTG-FSコントローラを使う場合はマイコンの端子とD+とD-とGNDを繋げば動くことが分かった。(D+のプルアップはマイコンに内蔵されている。)
  • USBのライブラリがmbed-osのソースツリーのfeatures/unsupportedにある意図が良く分からない。mbed os 5としては現状は非サポートという意味のような気がします。Renesas AZ1用のUSBライブラリもRenesasがPublishしている。待っていればそのうちmbed os でサポートされるようになるでしょう。
  • このUSBライブラリは内部的にはSTM32Cubeを使っており。今のところはSTの人がSTM32Cubeのバージョンアップ作業をやってくれている。