0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

STM32F407のUSBデバイスデスクリプションの消費電流情報

Posted at

背景

バラシの可能性は大いにありますが🤣、USBデバイスの製品を開発する案件が発生しました🎉

USBのホストはMacです。
ちゃんとした製品なので、USBのデスクリプタに消費電力(Mac上では割り当て電力)を正しく表示させる必要があります。
STM32CubeIDEではどうやって値を指定するんだろう...と、かなりいろんな情報に惑わされたため、備忘録、そして今後このような設定をする方のために、記事として残しておこうと思いました。

USBデバイスの消費電流を定義する

さて、STM32CubeIDEで何もしないと、Mac上には「割り当て電力」が表示されません。

スクリーンショット 2025-11-07 11.43.31.png

以前はCubeMXで記述できたり、ソースコード上で記述したりする方式だったようですが、現在はこれらの方法ではできませんでした。
これらの情報をもとにソースコードを追いかけていくと、消費電流はマクロ定義で指定することが判明しました!

usbd_def.h
#ifndef USBD_MAX_POWER
#define USBD_MAX_POWER     0x32U /* 100 mA */
#endif /* USBD_MAX_POWER */

USBD_MAX_POWERが定義されてなければ、0x32という値が採用されるということですね。
実際の電流値は、指定の値(0x32 = 50)の2倍の値です。
なので、上記のコードでは50 x 2 = 100(mA)ということになります。

500mAに指定するには、USBD_MAX_POWERを250(0xfa)にすればいいですね。

プロジェクトのCコンパイラプリプロセッサにこのマクロを定義するのが楽そう。

スクリーンショット 2025-11-07 11.52.25.png

これでコンパイルして実行すると、こんな感じで「割り当て電力」が指定通りになりますね。

スクリーンショット 2025-11-07 11.54.55.png

このように、現在はマクロ定義する仕様に変わっています。

USB-MIDIインターフェースの場合

この案件とは別にUSB-MIDIインターフェースも開発していますが、これはどうなってるんだろう...

スクリーンショット 2025-11-07 11.57.49.png

500mAになってます。
実際はこんなに消費しないんですが、まぁいいでしょう。
ところで、これはどこで定義しているんだろう?
探したところ、こちらで定義されていました。

usbd_midi.c
/* USB MIDI device Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_MIDI_CfgDesc[USB_MIDI_CONFIG_DESC_SIZE]  __ALIGN_END =
{
  0x09,                       /* bLength: Configuration Descriptor size */
  USB_DESC_TYPE_CONFIGURATION,/* bDescriptorType: Configuration */
  USB_MIDI_CONFIG_DESC_SIZE,
  0x00,                       /*Length of the total configuration block, including this descriptor, in bytes.*/
  0x01,                       /*bNumInterfaces: 1 interface*/
  0x01,                       /*bConfigurationValue: ID of this configuration. */
  0x00,                       /*iConfiguration: Index of string descriptor describing the configuration (Unused.)*/
  0x80,                       /*bmAttributes: Bus Powered device, not Self Powered, no Remote wakeup capability. */
  0xFA,                       /*MaxPower 500 mA: this current is used for detecting Vbus*/
    .
    .
    .
    .

消費電流が500mAだったので、0xfaで検索したら見つかりました。
USB-MIDIインターフェースについては、ここを書き換えて実態に応じた値へ変更するか、最大の500mAと宣言しておくか...ちょっと悩ましいところです。

最後に

USBデバイスの消費電流設定に困っている人の助けになれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?